牛顿迭代法
牛顿法的作用是使用迭代的方法来求解函数方程的根。简单地说,牛顿法就是不断求取切线的过程。
对于形如 f ( x ) = 0 f(x)=0 f(x)=0的方程,首先任意估算一个解 x 0 x_0 x0,再把该估计值代入原方程中。由于一般不会正好选择到正确的解,所以有 f ( x ) = a f(x)=a f(x)=a。这时计算函数在 x 0 x_0 x0处的斜率,和这条斜率与x轴的交点 x 1 x_1 x1。
f ( x ) = 0 f(x)=0 f(x)=0中精确解的意义是,当取得解的时候,函数值为零(即 f ( x ) f(x) f(x)的精确解是函数的零点)。因此, x 1 x_1 x1比 x 0 x_0 x0更加接近精确的解。只要不断以此方法更新x,就可以取得无限接近的精确的解。
但是,有可能会遇到牛顿迭代法无法收敛的情况。比如函数有多个零点,或者函数不连续的时候。
由上图可知,
f
(
x
n
)
x
n
−
x
n
+
1
=
f
′
(
x
)
\displaystyle\frac{f(x_n)}{x_n - x_{n+1}} = f'(x)
xn−xn+1f(xn)=f′(x)
所以
x
n
+
1
=
x
n
x_{n+1} = x_n
xn+1=xn
−
-
−
f
(
x
n
)
f
′
(
x
n
)
\displaystyle\frac{f(x_n)}{f'(x_{n})}
f′(xn)f(xn)
例题
添加链接描述
code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
ll a, b, c;
double x;
int main()
{
cin >> a >> b >> c;
x = 1.0;
while(fabs(pow(x, a) + b * log(x) - c) >= 1e-7)
x -= (pow(x, a) + b * log(x) - c) / (a * pow(x, a-1) + b/x);
cout << setprecision(14) << fixed << x << endl;
return 0;
}