您的位置:首页 > 编程语言 > C语言/C++

牛顿法和割线法方程求根(C语言)

2018-02-10 10:29 309 查看
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);
afab
//当|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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: