牛顿迭代法求解方程

说明:该篇博客源于博主的早些时候的一个csdn博客中的一篇,由于近期使用到了,所以再次作一总结。原文地址

概述

牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。

1. 牛顿迭代公式

r f(x)=0 的根,选取 x0 作为 r 的初始近似值,过点 (x0,f(x0) 做曲线 y=f(x) 的切线 L L的方程为 y=f(x0)+f(x0)(xx0) ,求出 L x轴交点的横坐标 x1=x0f(x0)f(x0) ,称 x1 r 的一次近似值。
过点(x1,f(x1))做曲线 y=f(x) 的切线,并求该切线与 x 轴交点的横坐标 x2=x1f(x1)f(x1),称 x2 r 的二次近似值。重复以上过程,得r的近似值序列,其中, xn+1=xnf(xn)f(xn) 称为 r n+1次近似值,上式称为牛顿迭代公式。


牛顿

实际上牛顿迭代法就是将非线性的问题转化为线性问题再做处理。将非线性函数在小范围内用他的一阶泰勒级数表示(也就是在某点泰勒展开取低阶项)。

2. 使用牛顿迭代公式求解方程

求解步骤:
1. 原函数: f(x)=xma
2. 原函数的导函数: f(x)=mxm1
3. 使用牛顿迭代公式 xn+1=xnf(xn)f(xn)

xn+1=xnf(xn)f(xn)=xnxmnamxm1n

3. 示例

3.1 利用牛顿迭代公式求解平方根

求解平方根也就是求解函数 f(x)=x2af(x)=0 的根。根据上述的求解过程 f(x)=2x , 带入牛顿迭代公式:

xn+1=xnx2na2xn

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    double m,x = 1.0;
    cout<<"Please Input a Num:"<<endl;
    cin>>m;
    if(m < 0)
    {
        cout<<"Sorry,Input is Illegal"<<endl;
    }
    else if(m == 0)
    {
        cout<<"0"<<endl;
    }
    else
    {
        while(fabs(m - (x*x)) >= 0.001)
        {
            x = (x + m/x)/2.0;
            cout<<"x="<<x<<"\tm="<<m<<endl;      //显示运算过程
        }
        cout<<"The result is:"<<x<<endl;
    }
    system("pause");
}

3.2 另一种求解平方根的高效方法

提到这个算法就不得不说一个神奇的数字 0x5f375a86 。下面的代码来自于维基百科,关于更多该数字的奇闻可以点击下面的链接查看:
https://en.wikipedia.org/wiki/Fast_inverse_square_root

int sqrt(float x) 
{ 
    if(x == 0) return 0; 
    float result = x; 
    float xhalf = 0.5f*result; 
    int i = *(int*)&result; 
    i = 0x5f375a86- (i>>1); 
    result = *(float*)&i; 
    result = result*(1.5f-xhalf*result*result); // Newton step, repeating increases accuracy 
    result = result*(1.5f-xhalf*result*result); 
    return 1.0f/result; 
}
  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

空空的司马

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

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

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

打赏作者

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

抵扣说明:

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

余额充值