牛顿法和割线法方程求根(C语言)
2018-02-10 10:29
309 查看
1 . 实验目的
(1) 通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点。
(2) 编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
2 . 实验内容
(1) 用牛顿法求下列方程的根:
![](https://img-blog.csdn.net/20180210102646119?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFuZGNydWlzZXIwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
(2) 编写一个割线法的程序,求解上述各方程。
3 . 实验步骤
牛顿迭代法流程图:
![](https://img-blog.csdn.net/20180210102709768?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFuZGNydWlzZXIwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
割线法:将上图所示的牛顿法流程图的迭代公式的替换为
![](https://img-blog.csdn.net/2018021010274383?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFuZGNydWlzZXIwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
并且输入两个初始值即可。
4 . 程序设计
(1) 牛顿法
(2) 割线法
(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); }
相关文章推荐
- 用C语言编写如下程序:牛顿法求方程f(x)=x^3-x-1=0在x0=1.5附近的实根,精确到6位小数。
- 悬链线方程和C语言实现
- c语言实现,用最小二乘法求解方程数多于未知变量的线性方程组的最适解(即矛盾方程组)
- C语言之基本算法24—黄金分割法求方程近似根
- 数值作业:二分法求方程的根之C语言实现代码
- 方程求根的几种数值方法--求解x^3 - x -1 = 0
- c语言求一元方程的根
- c语言:用牛顿迭代法求方程在1.5附近的根:2x^3-4x^2+3x-6=0.
- C语言解线性方程的四种方法
- C语言——方程求解
- 数值作业:二分法求方程的根之C语言实现代码
- 牛顿法求方程!
- 用C语言求一元二次方程的解
- c语言:用二分法求方程在(-10,10)之间的根:2x^3-4x^2+3x-6=0.
- 多项式方程求根
- c语言求一元二次方程的根
- C语言之基本算法25—牛顿迭代法求方程近似根
- c语言:用二分法求方程在(-10,10)之间的根:2x^3-4x^2+3x-6=0.
- 求解方程根的近似解:牛顿法
- C语言之基本算法25—牛顿迭代法求方程近似根