题目 1021: [编程入门]迭代法求平方根
//
牛顿迭代法:(牛顿-拉弗森方法)
伽罗瓦用群论得出:五次及以上多项式方程没有根式解(即 没有像二次方程那样的万能公式)
没有根式解不意味着方程解不出来,牛顿迭代法就是其中一种方法。
01 切线是曲线的线性逼近
因为切线是一条直线(线性),所以我们称f(x)中A点的切线 是f(x)的线性逼近
离A点距离越近,逼近的效果也就越好,切线与曲线之间的误差也就越小。
01 随便找曲线上的一个点 称之A点 做该点的切线 ( 求 a 的平方根 一般取 a/2 )
(切线是切点附近曲线的近似,应该在根点附近找,但现在还不知道根点在哪里)
02 切线的根(和x轴的交点)与曲线的根 还有一定的距离
03 过该切线的根 作x轴垂线 和曲线相交于B点 做该点的切线
04 重复上面的操作 经过多次迭代后 就会越来越接近曲线的根 即 迭代收敛了
02 牛顿迭代法的 代数解法
已知曲线方程f(x) 过 X0 作切线 求X1:
01
f(X) - f(X0)
----------- == f'(X0)
X - X0
02 f(x) == f(X0) + f'(X0) * (X-X0) ;
03 X1 为 f(X0) + f'(X0) * (X-X0) == 0 的根
04 X1 == X0 - f(X0) / f'(X0) ;
当 f(x)=x^2 时:
x1 = x - (x^2-c)/2x
x1 = x - x/2 + c/2x
x1 = x/2 + c/x/2
03 牛顿迭代法 是否总是收敛?
在根点的邻域内,用切线代替曲线是合理的
但根点位置未知 所以起始点 x0 选择就不一定在这个区域内 那么发散是可能存在的
发散情况:
01 驻点
起始点不幸选择了驻点
从几何上看 切线根本没有根
从代数上看 X1 == X0 - f(X0) / f'(X0) 没有意义
02 循环震荡 eg. |x|^(1/2)
03 越迭代越远离根点 eg. x^(1/3)
04 不能完整求出所有根 eg.多根函数 f(x)=x^4-2*x^2+x
可能只能求得附近的根 或 起始点选择不对而求得 不需要的根
注意:
01 函数在整个定义域内最好是二阶可导的
02 起始点对求根计算影响重大,最好添加检验环节
04 应用:求平方根
由于科学事实不像技术那般日新月异 所以牛顿迭代法仍然在计算机学科中被广泛使用
//
// 牛顿迭代法 : x[n+1] = x[n]- f(x[n]) / f'(x[n]) ;
const double error=1e-5;
// b*b == a
double my_sqrt( double a )
{
double b=a/2;
while( fabs(a-b*b)>error )
{
b=( a/b+b )/2;
}
return b;
}