C语言循环控制

描述

用二分法求函数根。(谭浩强 C 语言 第三版 130 页第 6.13 题)

题目

用二分法求下面方程在(-10,10)直接的根 :2 * x * x * x - 4 * x * x + 3 * x -6 = 0

题目解决思路

二分法的思路:先指定一个区间 [ x1 , x2 ],如果函数 f(x) 在此区间是单调变化,可以根据 f(x1) 和 f(x2) 是否同符号来确定 f(x) = 0 在 [x1 ,x2] 区间范围内是否有一个实根。

如果 f(x1) 和 f(x2) 不同符号,则 f(x) = 0 在 [x1 , x2] 区间必有一个实根;如果 f(x1) 和 f(x2) 同符号,说明在 [x1,x2] 区间内没有实根,要重新改变区间范围的值。当确定在区间内有实根的时候,需要采用二分法,将区间变小,一直操作下去,直到区间足够小。

代码具体实现

#include <stdio.h> #include <math.h> void main() { printf("嗨客网(www.haicoder.net)\n\n"); float x0,x1,x2,fx0,fx1,fx2; do { printf("请输入区间数:x1 和 x2,以逗号隔开:"); scanf("%f,%f",&x1,&x2); fx1 = x1 * ((2 * x1 -4) * x1 +3) - 6; fx2 = x2 * ((2 * x2 -4) * x2 + 3) - 6; } while(fx1 * fx2 > 0); do { x0 = (x1 + x2) / 2; fx0 = x0 * ((2 * x0 -4) * x0 + 3) - 6; if(( fx0 * fx1) < 0) { x2 = x0; fx2 = fx0; } else { x1 = x0; fx1 = fx0; } } while(fabs(fx0) > 1e-5); printf("x=%6.2f\n",x0); }

运行后,控制台输出如下:

17_6.13答案.png

我们把 2 * x * x * x - 4 * x * x + 3 * x -6 = 0 看成一个 fx = x * ((2 * x -4) * x +3) - 6 函数。 首先我们定义了 x0,x1 用来接收范围区间,将这两个值代入到函数中,如果函数运行结果是同号,那么说明在该区间里面没有值,继续让用户输入区间。

将区间的两个数求和除 2 得到中间数,代入函数中,和 x1 和 x2 来比较。用中间的数和 x1 或者 x2 替换,替换后需要两个数据在函数中的结果是异号的。