牛頓迭代法求解方程

說明:該篇博客源於博主的早些時候的一個csdn博客中的一篇,由於近期使用到了,所以再次作一總結。原文地址

概述

牛頓迭代法(Newton’s method)又稱爲牛頓-拉夫遜(拉弗森)方法(Newton-Raphson method),它是牛頓在17世紀提出的一種在實數域和複數域上近似求解方程的方法。

1. 牛頓迭代公式

rf(x)=0 的根,選取 x0 作爲r 的初始近似值,過點 (x0,f(x0) 做曲線y=f(x) 的切線LL 的方程爲 y=f(x0)+f(x0)(xx0) ,求出Lx 軸交點的橫座標 x1=x0f(x0)f(x0) ,稱x1r 的一次近似值。
過點(x1,f(x1)) 做曲線 y=f(x) 的切線,並求該切線與x 軸交點的橫座標 x2=x1f(x1)f(x1) ,稱x2r 的二次近似值。重複以上過程,得r 的近似值序列,其中,xn+1=xnf(xn)f(xn) 稱爲rn+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; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章