算法步骤: 如果要求已知函数 f(x) = 0 的根 (x 的解)
① 找出一个区间 [a, b],使得f(a)与f(b)异号。根据介值定理,这个区间内一定包含着方程式的根。
② 求该区间的中点m=(a+b)/2,并找出 f(m) 的值。
③ 若 f(m) 与 f(a) 正负号相同,则取 [m, b] 为新的区间, 否则取 [a, m]。
④ 重复第②步和第③步,直到得到理想的精确度为止。
介值定理:设函数f(x)在闭区间[a,b]上连续,且在这个区间的端点取不同值,f(a)=A,f(b)=B,则对于A与B之间的任意一个数C,在开区间(a,b)内至少存在一点c,使得f(c) = C。
#include <stdio.h>
#include <math.h>
int main()
{
float x0 = -10;
float x1 = 10;
float m = 0;
float f0 = 0,fm = 0;
while (fabs(x0-x1)>0.01)
{
m = (x0+x1)/2;
f0 = 2*x0*x0*x0 - 4*x0*x0 + 3*x0 -6;
fm = 2*m*m*m - 4*m*m + 3*m -6;
if (fm<0&&f0<0 || fm>0&&f0>0)
{
x0 = m;
}
else
{
x1 = m;
}
}
printf("2x^3 - 4x^2 + 3x - 6的根为%f\n",m);
}
运行结果如下: