5

我正在尝试创建一个通过牛顿法计算三次根的函数,但由于某种原因我似乎在这里有一个无限循环?

#include <iostream>
#include <math.h>

using namespace std;

double CubicRoot(double x, double e);

int main()
{
    cout << CubicRoot(5,0.00001);
}

double CubicRoot(double x, double e)
{
    double y = x;
    double Ynew;
    do 
    {
        Ynew = y-((y*y)-(x/y))/((2*y)+(x/(y*y)));
        cout << Ynew;

    } while (abs(Ynew-y)/y>=e);

    return Ynew;
}
4

2 回答 2

8

迭代时您没有更新y变量。使用abs也是非常危险的,因为它可以在某些编译器上舍入为整数。

编辑

为了澄清我的意思:使用abswith<math.h>可能会导致不同编译的隐式类型转换问题(请参阅下面的评论)。真正的 c++ 风格将使用<cmath>评论中建议的标题(感谢您的回复)。

您的代码的最小更改将是:

double CubicRoot(double x, double e)
{
    double y = x;
    double Ynew = x;
    do 
    {
        y = Ynew;
        Ynew = y-((y*y)-(x/y))/((2*y)+(x/(y*y)));
        cout << Ynew;

    } while (fabs(Ynew-y)/y>=e);
    return Ynew;
}
于 2013-09-03T11:46:23.520 回答
1

你可以改变

    Ynew = y-((y*y)-(x/y))/((2*y)+(x/(y*y)));

等同于但更容易识别的表达方式

    Ynew = y*(y*y*y+2*x)/(2*y*y*y+x)

这是 f(y)=y^3-x 的哈雷方法,具有三阶收敛性。

于 2013-12-15T15:53:56.923 回答