1. 程式人生 > >牛頓迭代法求根——C語言

牛頓迭代法求根——C語言

牛頓迭代法求根的原理:

設r是 的根,選取 作為r的初始近似值,過點 做曲線 的切線L,L的方程為 ,求出L與x軸交點的橫座標 ,稱x1為r的一次近似值。過點 做曲線 的切線,並求該切線與x軸交點的橫座標 ,稱 為r的二次近似值。重複以上過程,得r的近似值序列,其中, 稱為r的 次近似值,上式稱為牛頓迭代公式。 用牛頓迭代法解非線性方程,是把非線性方程 線性化的一種近似方法。把 在點 的某鄰域內展開成泰勒級數 ,取其線性部分(即泰勒展開的前兩項),並令其等於0,即 ,以此作為非線性方程 的近似方程,若 ,則其解為 , 這樣,得到牛頓迭代法的一個迭代關係式:
。 題目:用牛頓迭代法求根。方程為ax3+bx2+cx+d=0。係數a,b,c,d的值一次為1,2,3,4,由主函式輸入。求x在1附近的一個實根。求出根後由主函式輸出。結果保留兩位小數。 分析:該題目要求我們求1附近的一個實根,其實不管是在哪個數字附近,只要有while(fabs(x-x0)>=1e-5)這個條件就能夠得到一個比較準確的近似值(如果不明白可以隨便找幾個數試一下,一定要按照牛頓迭代法的步驟來)。由分析得,我們一直是在求兩點之間的距離,首先我們用到了xn這個點,通過數學關係,我們得到了xn+1這個點;然後我們又由xn+1這個點得到了一個更加接近於x*的點,接下來就是計算機枯燥的重複了,但是我們不能一直讓它這麼持續下去,所以我們加入了一個使迴圈結束的條件就是兩點之間的距離無線下while(fabs(x-x0)>=1e-5)。分析得到,我們需要兩個double型的儲存空間。
#include<stdio.h>
#include<math.h>

int main()
{
    double solut(double,double,double,double );//函式原型宣告
    double a,b,c,d;
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    printf("%.2f",solut(a,b,c,d));
    return 0;
}

double solut(double a,double b,double c,double d)
{
    double x=1,x0;
    do
    {
        x0=x;
        x=x0-(((a*x+b)*x+c)*x+d)/((3*a*x+2*b)*x+c);
    }
    while(fabs(x-x0)>=1e-5);//為點xn+1與xn之間的距離,當兩點的距離無限接近於0時,就時我們所要求的根x*。如果取x*這個點為例,我們發現方程在該點的切線與x軸的交點為x*,此時x與x0之間的距離為零。
    return x;
}
這個題目用到迭代法,說實話我的腦子轉的慢,我到現在還沒有學好這個方法。
迭代法的類似題目: 1:迭代法求兩個數的最大公約數(輾轉相除法) 原理:設兩數為a、b(a>b),用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,則(a,b)=b;若r1≠0,則再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,則(a,b)=r1,若r2≠0,則繼搜尋續用r1除r2,……如此下去,直到能整除為止。當然a與b的大小並不需要在意,因為在第一次輾轉相除後,二者的位置關係就發生了改變。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    int maxgys(int a,int b);//函式原型宣告
    printf("%d",maxgys(a,b));
    return 0;
}
int maxgys(int a,int b)
{
    while(b!=0)
    {
        int r;
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

2:Fibonacci數列也可以用到迭代法 原理:斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用。   
#include <stdio.h>
#include <stdlib.h>

int main()
{
    long n;
    scanf("%ld",&n);
    void fibonacci(long);
    fibonacci(n);
    return 0;
}
void fibonacci(long n)
{
    long f1,f2,fn,i;
    f1=1;
    f2=2;
    printf("%ld %ld ",f1,f2);
    for(i=1;i<=n-2;i++)
    {
        fn=f1+f2;
        f1=f2;
        f2=fn;
        printf("%ld",f2);
        printf(" ");
    }
}