Napo鱼 发表于 2017-11-5 15:28:19

用迭代法求a的立方根,最后运行有点小问题

一下我我码出来的代码:
#include <stdio.h>
#include <math.h>
int main()
{
    printf("a=");
    float x0,x1=1,a;
    scanf("%f",&a);
x0=a;
    do
    {

      x1=2*x0/3+a*2/(3*x0*x0);
      x0=x1;
    }while(fabs(x1-x0)>=0.00001);
    printf("a的立方根为:%.3f",x1);
    return 0;
}

然而运行出来却算不对数,按理来说8的立方根不是应该是2吗?

BngThea 发表于 2017-11-5 16:16:35

while循环的判定条件不对,应该是
fabs(a - x0 * x0 * x0)>=0.00001

砚堂_ 发表于 2017-11-5 20:38:01

你的迭代公式不对!
你试试 x1=x0+0.5*a/x0-0.5*x0*x0
这是牛顿迭代公式推出来的。

Napo鱼 发表于 2017-11-5 21:07:07

砚堂_ 发表于 2017-11-5 20:38
你的迭代公式不对!
你试试 x1=x0+0.5*a/x0-0.5*x0*x0
这是牛顿迭代公式推出来的。

还是不行,算出来甚至是负数{:9_220:}

Napo鱼 发表于 2017-11-5 21:33:42

BngThea 发表于 2017-11-5 16:16
while循环的判定条件不对,应该是
fabs(a - x0 * x0 * x0)>=0.00001

谢谢!我的迭代公式也有错,然后我根据百科里面公式推导出x1=x0-3*pow(a,-1/3)然后成功运行出8的立方根是2,但是我换输入0.0001的时候就无法求出立方根是0.1{:9_220:}

Napo鱼 发表于 2017-11-5 21:35:54

砚堂_ 发表于 2017-11-5 20:38
你的迭代公式不对!
你试试 x1=x0+0.5*a/x0-0.5*x0*x0
这是牛顿迭代公式推出来的。

还是谢谢你的提醒,我那个公式是在贴吧找的,老师给的练习题没有公式,然后我根据你的话去查百科了,看到里面有一个推导公式,然后我自己推导出来了。还是很谢谢你{:9_232:}

BngThea 发表于 2017-11-5 21:37:07

Napo鱼 发表于 2017-11-5 21:33
谢谢!我的迭代公式也有错,然后我根据百科里面公式推导出x1=x0-3*pow(a,-1/3)然后成功运行出8的立方根是 ...

我没仔细看你的迭代公式,以为没问题的。。。
{:10_266:}

Napo鱼 发表于 2017-11-5 21:39:50

BngThea 发表于 2017-11-5 21:37
我没仔细看你的迭代公式,以为没问题的。。。

那你可以帮我再看看为什么小数的立方根求不出来无法运行{:10_266:}

BngThea 发表于 2017-11-5 21:43:27

Napo鱼 发表于 2017-11-5 21:39
那你可以帮我再看看为什么小数的立方根求不出来无法运行

你上面的说0.0001的立方根本来就不等于0.1
0.001的才为0.1
你先试试 0.125的是否为0.5 或者 0.008的是否为0.2

Napo鱼 发表于 2017-11-5 21:46:46

BngThea 发表于 2017-11-5 21:43
你上面的说0.0001的立方根本来就不等于0.1
0.001的才为0.1
你先试试 0.125的是否为0.5 或者 0.008的是 ...

程序无法运行,表示enter键要被我按坏了{:10_266:}

BngThea 发表于 2017-11-5 21:50:22

Napo鱼 发表于 2017-11-5 21:46
程序无法运行,表示enter键要被我按坏了

{:10_277:}

Napo鱼 发表于 2017-11-5 22:03:49

BngThea 发表于 2017-11-5 21:50


貌似是0.001等不符合循环条件一直在死循环{:10_266:}我还试了0等一些整数也不能{:10_245:}

砚堂_ 发表于 2017-11-6 09:13:18

好奇怪哦。我回去给你发我写的代码吧!我那个能运行。

砚堂_ 发表于 2017-11-6 09:25:30

噗,突然发现一个问题,你循环体里面两个式子顺序不对,导致x0==x1是恒成立的,你的迭代式只能完成一次迭代,所以除非运气好一次就算出来,否则不可能得到正确结果。
你把里面两个式子换个位置试试!
页: [1]
查看完整版本: 用迭代法求a的立方根,最后运行有点小问题