我正在尝试创建一个通过牛顿方法计算立方根的函数,但由于某种原因,我似乎在这里有一个无限循环?
#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;
}
答案 0 :(得分:8)
迭代时,您尚未更新y
变量。
使用abs
非常危险,因为它可能在某些编译器上舍入为整数。
修改强>
澄清我的意思:将abs
与<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;
}
答案 1 :(得分:0)
您可以更改
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的Halley方法,并且具有三阶收敛。