1. 程式人生 > >牛頓法和割線法方程求根(C語言)

牛頓法和割線法方程求根(C語言)

1 . 實驗目的
(1) 通過對二分法與牛頓迭代法作程式設計練習與上機運算,進一步體會二分法與牛頓迭代法的不同特點。
(2) 編寫割線迭代法的程式,求非線性方程的解,並與牛頓迭代法作比較。
2 . 實驗內容
(1) 用牛頓法求下列方程的根:
這裡寫圖片描述
(2) 編寫一個割線法的程式,求解上述各方程。
3 . 實驗步驟
牛頓迭代法流程圖:
這裡寫圖片描述
割線法:將上圖所示的牛頓法流程圖的迭代公式的替換為
這裡寫圖片描述
並且輸入兩個初始值即可。
4 . 程式設計
(1) 牛頓法

#include<stdio.h>
#include<math.h>
#define eps 1e-7                                    
#define eta 1e-7 //牛頓迭代法求根 float newton(float(*f)(float),float(*f1)(float),float x0) //f為原方程,f1為其導數,x0為初值 { float x1,d; //x1為新的近似值 int k=0; do { k++; x1=x0-(*f)(x0)/(*f1)(x0); //計算x1 d=x1-x0; x0=x1; printf
("x(%d)=%f\n",k,x0); } while(fabs(d)>eps&&fabs((*f)(x1))>eta); //當|x1-x0|<eps或|f(x1)|<eta時結束程式 return x1; } float f(float x) //第2問方程 { return x*exp(x)-1; } float f1(float x) //第2問方程求導 { return x*exp(x)+exp(x); } float f2(float x) //第1問方程 { return
x*x-exp(x); } float f3(float x) //第1問方程求導 { return 2*x-exp(x); } float f4(float x) //第3問方程 { return log10(x)+x-2; } float f5(float x) //第3問方程求導 { return 1/(10*log(10))+1; } void main() { float x0,y0,y1,y2; printf("please insert x0\n"); //輸入初始值 scanf("%f",&x0); printf("x(0)=%f\n",x0); y1=newton(f,f1,x0); y0=newton(f2,f3,x0); y2=newton(f4,f5,x0); printf("one answer is %f\n",y0); //第一問答案 printf("two answer is %f\n",y1); //第二問答案 printf("three answer is %f\n",y2); //第三問答案 }

(2) 割線法

#include<stdio.h>
#include<math.h>
#define eps 1e-7                                    
#define eta 1e-7
//割線法
float ge(float(*f)(float),float x1,float x0)       
{
    float x2,d;                                                 
    int k=0;
    do
    {
        k++;
        x2=x1-((*f)(x1)*(x1-x0))/((*f)(x1)-(*f)(x0));                               
        d=x1-x0;                          
        x0=x1;
        x1=x2;
        printf("x(%d)=%f\n",k,x0);
    }
    while(fabs(d)>eps&&fabs((*f)(x1))>eta);                    
    return x1;
}

float f(float x)   //第一問
{
    return x*x-exp(x);
}
float f1(float x)  //第二問
{
    return x*exp(x)-1;
}
float f2(float x)  //第三問
{
    return log10(x)+x-2;
}

void main()
{

    float x1,x0,y0,y1,y2;
    printf("please insert x1,x0\n");
    scanf("%f,%f",&x1,&x0);
    printf("x(0)=%f\n",x0);
    y0=ge(f,x1,x0);
    y1=ge(f1,x1,x0);
    y2=ge(f2,x1,x0);
    printf("one answer is %6f\n",y0);
    printf("two answer is %6f\n",y1);
    printf("three answer is %6f\n",y2);
}