牛顿法和割线法方程求根(C语言)
程序员文章站
2024-02-27 20:36:03
...
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);
}
下一篇: python实现12306火车票查询器
推荐阅读
-
牛顿法和割线法方程求根(C语言)
-
C语言编程练习 5.按如下函数原型,采用梯形法编程实现(分成100个小梯形,再求这100个梯形面积的和),在积分区间[a,b]内计算函数
-
用牛顿迭代法求下面方程在1.5附近的根:2x^3-4x^2+3x-6=0--C程序设计第四版(谭浩强)
-
【C】用牛顿迭代法求下面方程在1.5附近的根:2*x^3-4*x^2+3*x-6=0
-
C语言学习之用牛顿迭代法求下面方程在1.5附近的根: 2x³-4x²+3x-6=0
-
用c语言编写如下程序:二分法求方程f(x)=x^2-x-1=0在区间[1,2]的正根,精确到1e-3?
-
(C语言)用二分法求方程 2x^3 - 4x^2 + 3x - 6 = 0在(-10, 10)之间的根
-
c语言链表,头插法和尾插法
-
Java实现二分法、牛顿(Newton)迭代法、快速弦截法方程求根的数值方法
-
数值分析:利用牛顿法解非线性方程组的matlab和python实现