Я пытаюсь создать функцию, которая вычисляет кубический корень по методу Ньютона, но мне кажется, что по какой-то причине здесь есть бесконечный цикл?
#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;
}
Вы не обновили свой 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;
}
Ты можешь измениться
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 и имеет сходимость третьего порядка.