欢迎大家来到IT世界,在知识的湖畔探索吧!
对于方程求解,在实际工程中,往往不需要精确解,而是只需精准到工程所需要的程度即可。
本文介绍用二分法求解方程近似解,并通过C语言程序来实现。
方程近似解的求解依据为中间值定理,即:
函数f(x)在区间[a, b]连续,并且f(a)和f(b)异号,则a,b间存在点c, 使得f(c) = 0 (a < c < b)。
欢迎大家来到IT世界,在知识的湖畔探索吧!
二分法求解方程的近似解
设
则f(1) = -1 < 0, f(2) = 6 > 0, 由中间值定理可知,区间[1,2]内有f(x) = 0的解。
取区间[1,2]的二等分点1.5,计算f(1.5)的值,可知f(1.5) = 2.125 > 0。
于是f(1) < 0且f(1.5) > 0,由中间值定理知解在区间[1, 1.5]内,从而解的范围便从[1,2]缩小了一半至[1,1.5]。
再取区间[1,1.5]的二等分点1.25,计算f(1.25)的值,可知f(1.25) = 0.51… > 0。于是解区间的范围再缩小一半至[1,1.25]。
同样地,继续取解区间的二等分点,并计算该点的函数值。被二等分点分开的两个区间中,若某个区间两端的f(x)值异号的话,则该区间为解区间。
这样反复操作,便可取得满足精度的解(比如精确到小数点后3位,即为解区间两端的差的绝对值小于0.001)。
C语言程序实现二分法求解
- 代码
欢迎大家来到IT世界,在知识的湖畔探索吧!//bisection.c #include <stdio.h> //函数定义 #define F(x) \ ((x)*(x)*(x)-3*(x)*(x)+9*(x)-8) int main(void) { double a=1; //解区间左端 double b=2; //解区间右端 double c=(a+b)/2; //解区间中点 double e=0.000001; //解的精确度 int n=0; //二分回数 while( b - a >= e ) { n++; /*计算a,b中点c, 并更新a,b坐标*/ c = ( a + b ) / 2; printf("%2d:a=[%.7lf],b=[%.7lf]\n", n, a, b); F(a)*F(c)>0?(a=c):(b=c); } printf("在第 %d 回取到满足精度(%lf)的解:\n\ x = %.6lf\n", n, e, c); return 0; }
- 编译・执行
$ gcc -o bisection bisection.c $ ./bisection 1:a=[1.0000000],b=[2.0000000] 2:a=[1.0000000],b=[1.] 3:a=[1.0000000],b=[1.] 4:a=[1.],b=[1.] 5:a=[1.],b=[1.] 6:a=[1.],b=[1.] 7:a=[1.],b=[1.] 8:a=[1.],b=[1.] 9:a=[1.],b=[1.] 10:a=[1.],b=[1.] 11:a=[1.],b=[1.] 12:a=[1.],b=[1.] 13:a=[1.],b=[1.] 14:a=[1.],b=[1.] 15:a=[1.],b=[1.] 16:a=[1.],b=[1.] 17:a=[1.],b=[1.] 18:a=[1.],b=[1.] 19:a=[1.],b=[1.] 20:a=[1.],b=[1.] 在第 20 回取到满足精度(0.000001)的解: x = 1.
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/91617.html