牛顿迭代法:
复数域上近似求解方程的方法。
详见:https://www.matongxue.com/madocs/205.html#/madoc
设x*为f(x) = 0 的根
计算公式(迭代公式):xn+1 = xn - f(xn) / f'(xn)
带入一个初始点x0 即可启动迭代
xn ->x* (n -> ∞)
牛顿迭代法在acm中的应用:
1.求解方程的根
HUD 2899
枚举初始迭代点求f'(x) = 0 的根
#include<bits/stdc++.h> using namespace std; #define LL long long #define pb push_back #define mem(a, b) memset(a, b, sizeof(a)) const double eps = 1e-9; double y; double f(double x) { return 6 * x*x*x*x*x*x*x + 8 * x*x*x*x*x*x + 7 * x*x*x + 5 * x*x - y * x; } double _f(double x) { return 42 * x*x*x*x*x*x + 48 * x*x*x*x*x + 21 * x*x + 10 * x - y; } double __f(double x) { return 42 * 6 * x*x*x*x*x + 48 * 5 * x*x*x*x + 21 * 2 * x +10; } double newton(double x) { int tot = 0; while(fabs(_f(x))>eps) { x -= _f(x) / __f(x); } return x; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%lf", &y); double ans = min(f(0), f(100)); for (int i = 0; i <= 100; i++) { double x = newton(i); if(0<= x && x <= 100) { ans = min(ans, f(x)); } } printf("%.4lf\n",ans); } return 0; }