牛顿迭代法原理及其应用
牛顿迭代法原理及其应用
牛顿迭代法是一种近似求解实数域与复数域方程的数学方法,由牛顿在17世纪提出。该方法通过迭代的方式,利用函数的切线来逼近方程的根,具有收敛速度快、精度高的特点。本文将详细介绍牛顿迭代法的原理、实现步骤以及在编程中的应用。
牛顿迭代法(Newton's method for finding roots)是一种近似求解实数域与复数域方程的数学方法。具体来说,对于在区间[a,b]上连续且单调的函数f(x),牛顿迭代法可以用来求解方程f(x)=0的近似解。
牛顿迭代法的原理
牛顿迭代法的基本思想是:从一个初始点(x0,f(x0))开始,在该点做切线,切线与X轴相交得出下一个迭代点x1的坐标,再在(x1,f(x1))处做切线,依次类推,直到求得满足精度的近似解为止。
为什么需要近似求解?
很多方程可能无法直接求取其解,因此需要使用近似求解方法。牛顿迭代法非常适合计算机编程实现,因此在实际应用中得到了广泛的应用。
数学描述
设函数f(x)在点x处的一阶导数为f'(x),则牛顿迭代法的迭代公式为:
$$
x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}
$$
迭代停止条件
- 计算出$x_{n+1}$;
- 给出一个初始假定根值$x_0$,利用上面迭代式子进行迭代$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$;
- 计算绝对相对迭代近似误差$\epsilon_n = \left|\frac{x_{n+1} - x_n}{x_{n+1}}\right|$;
- 将绝对相对近似误差与预定的相对误差容限$\epsilon$进行比较。如果$\epsilon_n > \epsilon$,则迭代步骤2,否则停止算法。另外,检查迭代次数是否已超过允许的最大迭代次数。如果是这样,则需要终止算法并退出。另一个终止条件是:$|f(x_{i+1})| < \epsilon$。
编码实现
由于牛顿迭代法主要目的是解方程,当然也有可能用于某一个数学函数求极值,所以无法写出通用的代码,这里仅仅给出一个编代码的思路。相信掌握了思路,对于各种实际应用应该能很快的写出符合实际应用的代码。
假定一函数为:
$$
f(x) = 2x^2 - 10\cos(x) + x - 80
$$
其波形图如下:
其一阶导数为:
$$
f'(x) = 4x + 10\sin(x) + 1
$$
下面是一个使用C语言实现的牛顿迭代法求解方程根的示例代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/*假定待求根函数如下*/
#define F(x) (2*(x)*(x)-10*cos(x)+(x)-80)
/*其一阶导数为*/
#define DF(x) (4*(x)+10*sin(x)+1)
float newton_rooting(float x0, float precision, float min_deltax, int max_iterations) {
float xn, xn1, fn, fn1, dfn;
float deltax;
int step = 0;
xn = x0;
xn1 = x0;
do {
xn = xn1;
fn = F(xn);
dfn = DF(xn);
/*判0*/
if (fabs(dfn) < 1e-6) {
if (fabs(fn) > precision)
return NAN;
else
return fn;
}
xn1 = xn - fn / dfn;
fn1 = F(xn1);
deltax = fabs(xn1 - xn);
step++;
if (step > max_iterations) {
if (fabs(fn1) < precision)
return xn;
else
return NAN;
}
} while (fabs(fn1) > precision || deltax > min_deltax);
return xn1;
}
void main() {
float root_guess = 23.0f;
float precision = 0.00001f;
float min_deltax = 0.001f;
float root;
int step = 7;
root = newton_rooting(root_guess, precision, min_deltax, step);
printf("根为: %f, 函数值为:%f\n", root, F(root));
root_guess = -23;
root = newton_rooting(root_guess, precision, min_deltax, step);
printf("根为: %f, 函数值为:%f\n", root, F(root));
}
运行结果:
根为: 6.457232, 函数值为:0.000004
根为: -6.894969, 函数值为:-0.000008
函数值已经很接近于0了,如果还需要更为精确的值,则可以选择在此基础上进一步求解,比如利用二分法逼近。
使用注意事项
- 求斜率可能为0,如为0时,则可能找到了函数的极值。
- 如果选择的初始猜测根的接近方程f(x)=0中函数f(x)的拐点,Newton-Raphson方法可能开始偏离根。然后,它可能会又收敛回到根。例如:
- 如果选择的初值不合适,可能会跳掉一些根,比如:
因此,在实际应用时,需要了解待求解模型的大致情况,并在合理范围内调整参数。
应用场景
牛顿迭代法在工程和科学计算中有着广泛的应用,例如:
- 知道某系统的传递函数,待求解其中的参数,可以将上述方法推而广之,求解多维变量方程组,求导就变成求偏导了。
- 设计一电路测量某物质的阻抗。
- 求一个趋势的极值。
- 传递函数参数辨识等。
总结来说,牛顿迭代法在解决实际问题时,利用迭代求方程近似根的数学原理,在工程中有着很好的实用价值。