用二分法求函数根。(谭浩强 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);
}
运行后,控制台输出如下:
我们把 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 替换,替换后需要两个数据在函数中的结果是异号的。