说明函数f(x)=x^3-3x+1在区间(1,2)内必有零点,用二分法求出一个零点的近似值(误差不超过0.001)
由于f(1) = 1 - 3 + 1 = -1 < 0
f(2) = 8 - 6 + 1 = 3 > 0
因此f(x)在1,2区间内存在一个0点(f'(x) 在 (1,2)区间恒大于0,因此该函数在此区间单调递增)。. 算法:
#include <stdio.h>
void main()
{
float low = 1.0;
float high = 2.0;
float value;
float mid;
do {
mid = (low + high) / 2;
value = mid * mid * mid - 3 * mid + 1;
if (value > 0.0)
high = mid;
else
low = mid;
} while (value > 0.001 || value < -0.001);
printf("The x is: %f", mid);
}
程序已运行通过,输出结果为:1.532227
翻译下行么?
算法:
获取区间的边缘low和high
依据low和high计算当前区间的中点mid
依据中点计算f(mid)的值
(1)若大于0说明mid偏大,f(x)是单调递增的,因此0点位于mid的左区间,因此将mid的值赋予high
(2)若小于0说明mid偏小,f(x)是单调递增的因此0点位于mid的右区间,因此将mid的值赋予low
4. 重复2和3,直到f(mid)的取值符合精度
2013-08-21
以下纯手打,调用findZero(1,2)即可
double f(double x) { return x*x*x-3*x +1;}
double findZero(double a, double b)
{
//assert a<b, f(a)*f(b)<0
double r = (a+b)/2;
if (b-a < 0.001)
return r;
if (f(a)*f(r) < 0)
return findZero(a,r);
else
return findZero(r,b);
}
能翻译成中文么
就是反复利用如果函数在区间两端异号,则一定在区间内有零点这一性质:r是区间 (a,b)的中点,如果f(r)和f(a) 异号,则递归在区间(a,r)找零点,否则在(r,b)找零点。当区间长度小于0.001时,返回区间内任意值都可达到误差要求。
代码中有个小问题,就是没有判断f(r)=0的特殊情况
这个问题我知道
推荐您使用“赛思QQ陌生人推广小助手 ”
不用加好友 直接发消息
日引1万独立IP 绝对没有问题