说明函数f(x)=x^3-3x+1在区间(1,2)内必有零点,用二分法求出一个零点的近似值(误差不超过0.001)

 我来答
Soucula
2013-08-21 · TA获得超过3091个赞
知道小有建树答主
回答量:744
采纳率:93%
帮助的人:75.6万
展开全部
  1. 由于f(1) = 1 - 3 + 1 = -1 < 0
           f(2) = 8 - 6 + 1 = 3 > 0
       因此f(x)在1,2区间内存在一个0点(f'(x) 在 (1,2)区间恒大于0,因此该函数在此区间单调递增)。

  2. . 算法:

   #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

追问
翻译下行么?
追答

算法:

  1.  获取区间的边缘low和high

  2. 依据low和high计算当前区间的中点mid

  3. 依据中点计算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
展开全部
f(x)连续, f(1)<0 f(2)>0 所以有零点。
以下纯手打,调用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的特殊情况
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
衡阳封云凯律师
2013-08-21 · 律师
个人认证用户
衡阳封云凯律师
采纳数:192 获赞数:3010

向TA提问 私信TA
展开全部
说明函数f(x)=x^3-3x+1在区间(1,2)内必有零点,用二分法求出一个零点的近似值(误差不超过0.001)

这个问题我知道

推荐您使用“赛思QQ陌生人推广小助手 ”

不用加好友 直接发消息

日引1万独立IP 绝对没有问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式