牛顿迭代法_求平方根

题目 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;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这题AC再睡.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值