对于方程求解,在实际工程中,往往不需要精确解,而是只需精准到工程所需要的程度即可。
本文介绍用牛顿法求解方程近似解,并通过C语言程序来实现。
牛顿法求解方程的近似解
![041d41cb6c40cfba787d0876bdf0eaff.png](https://i-blog.csdnimg.cn/blog_migrate/d78e1a1f55be2d770f42517e207fa263.jpeg)
求解方程
设
![4c668d69f1c72d3825568fac71a8381b.png](https://i-blog.csdnimg.cn/blog_migrate/72f707fa8ad8f3111b78a598e8c0b198.jpeg)
![8683d6f471bb46eca2f996f0f578a3db.png](https://i-blog.csdnimg.cn/blog_migrate/3ffdeeeddd0231cac623aa262c664324.jpeg)
则有
![5f8a78e4834416cbead41c94d0dd5d63.png](https://i-blog.csdnimg.cn/blog_migrate/e75144098dc3125823cf58d695442f05.jpeg)
可知,开区间(1,2)内,f'(x) > 0 且 f''(x) > 0。于是,y = f(x)的图形在区间[1,2]内单调递增且下凸。
在这里,以点(2, 6)为切点作曲线f(x)的切线,切线交x轴为x1。x1为解的第一近似值。然后,再作过点(x1, f(x1))的切线,切线交x轴为x2。接着,再作过点(x2, f(x2))的切线,切线交x轴为x3。
![973bf5fc7817b9eb65e9d5489b738418.png](https://i-blog.csdnimg.cn/blog_migrate/24cc85f5426777efa38706be3eaa511e.jpeg)
第一近似值x1的取得
![ae33096ca5d2c18a04ea3acb827124ac.png](https://i-blog.csdnimg.cn/blog_migrate/d14d6d97cbab10ddd4bc5e0815c53681.jpeg)
x2的取得
![73195a96b84c7f68979a75d33e9c7227.png](https://i-blog.csdnimg.cn/blog_migrate/a2bbfcceda05cffa8e02e3ce6810791b.jpeg)
x3的取得
同样的操作一直进行下去,可得如下数列
![cc17f7fac81001f0218e3eded822a574.png](https://i-blog.csdnimg.cn/blog_migrate/5e05a3bf1f8cce787ca183194142cf2b.jpeg)
曲线切线与x轴交点的数列
该数列收敛于f(x) = 0在开区间(1, 2)内的唯一解。
通常,过曲线y=f(x)上点(a, f(a))的切线方程为
![fa0b76bd112d9556b6ff6a22152c9ed8.png](https://i-blog.csdnimg.cn/blog_migrate/7f355c616aaf4346df7bfbef677bf2e2.jpeg)
切线方程
该切线与x轴的交点为
![b0b4351c8c0315ce9311ccb52427df7a.png](https://i-blog.csdnimg.cn/blog_migrate/279182e7dc4c853c1b4271c634057eb3.jpeg)
切线与x轴的交点
于是,若设最初切点的x轴坐标值为x0的话,则有如下的递推关系式
![ab03e5f60a755bb80c43139c519571c6.png](https://i-blog.csdnimg.cn/blog_migrate/9536dc94b91f9512125a347be42f3c4e.jpeg)
牛顿迭代公式
该式也称为牛顿迭代公式。
C语言程序实现牛顿法求解
- 代码
//newton.c#include #include //函数定义#define F(x) ((x)*(x)*(x)-3*(x)*(x)+9*(x)-8)#define G(x) (3*(x)*(x)-6*(x)+9)int main(void){ double x=2; //出发点 double xn=0; //第n回的近视值 double e=0.000001; //解的精度 int n = 0; //回数 while( 1 ) { n++; /*计算牛顿迭代式*/ xn = x - F(x) / G(x); printf("%d:x%d=[%.7lf],x%d=[%.7lf]", n, n, xn, n-1, x); if(fabs(xn -x) < e) break; x = xn; } printf("在第 %d 回取到满足精度(%lf)的解: x = %.6lf", n, e, xn); return 0;}
- 编译・执行
$ gcc -o newton newton.c$ ./newton1:x1=[1.3333333],x0=[2.0000000]2:x2=[1.1695906],x1=[1.3333333]3:x3=[1.1659067],x2=[1.1695906]4:x4=[1.1659056],x3=[1.1659067]5:x5=[1.1659056],x4=[1.1659056]在第 5 回取到满足精度(0.000001)的解: x = 1.165906