1. 程式人生 > >牛頓迭代法(含輾轉相除法原理):近似求解方程的根

牛頓迭代法(含輾轉相除法原理):近似求解方程的根

結論:迭代序列: x (n+1)=  x (n)- f ( x(n) ) / f '( x(n) )

(附C++程式碼)

(通過不斷作切線找切線與x軸交點重複,交點不斷向根逼近)

牛頓迭代法:在實數和複數域求方程的近似根,由泰勒級數前幾項尋找

計算方法:

設 x 是 f(x) = 0的根,選取 x0 作為 x 初始近似值,過點( x0, f(x ) )做曲線y = f(x)的切線L,則L的方程為y = f(x0)+f '(x0)(x-x0),求出L與x軸交點的橫座標 x1 = x0-f(x0) / f '(x0),稱 x1為x的一次近似值。過點(x1 , f(x1))做曲線y = f(x)的切線,並求該切線與x軸交點的橫座標 x2 = x1-f(x1)/ f '(x1)

,稱x2為x的二次近似值。重複以上過程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),稱為x的n+1次近似值,上式稱為牛頓迭代公式

解非線性方程f(x)=0的牛頓法是把非線性方程線性化的一種近似方法。把f(x)在x0點附近展開成泰勒級數 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其線性部分(一次),作為非線性方程f(x) = 0的近似方程,即泰勒展開的前兩項,則有f(x0)+f'(x0)(x-x0)=0 設f'(x0)≠0則其解為x1=x0-f(x0)/f'(x0) 這樣,得到牛頓法的一個迭代序列:x(n+1)= x(n)-f(x(n) ) / f '(x(n) )。

//求3元一次方程ax^3+bx^2+cx+d=0的解

//比如 x^3-27=0,我們就可以輸入1 0 0 -27,這樣我們就可以得到一個解

#include<iostream>

#include<cmath>

using namespace std;

double diedai(double a,double b,double c,double d,double x)

{
    while(abs(a*x*x*x+b*x*x+c*x+d)>0.000001)

       x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);

    return x;
}

int main()

{
   

    double a,b,c,d;

    double x=10000.0;

    cout<<"請依次輸入方程四個係數:";

    cin>>a>>b>>c>>d;

    x=diedai(a,b,c,d,x);

    cout<<x<<endl;
    
    return 0;
}

迭代法:又稱輾轉法,通過變數的舊值 推導新值的方法

輾轉相除法:最大公因數:gcd(a,b)=gcd(b,a mod b);

證:設a=kb+r,則r=a-kb,設m為a,b的公因數,則a%m=b%m=0;所以r%m=0,所以m為a%b的公因數。

反之,設m為b,a mod b的公因數,則a%m=0,所以m為a的公因數。

所以a,b的公因數與b,a mod b的公因數相同,所以最大公因數也相同