牛頓法和割線法方程求根(C語言)
阿新 • • 發佈:2018-12-26
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);
}