Бесконечный цикл вычисления кубического корня

Я пытаюсь создать функцию, которая вычисляет кубический корень по методу Ньютона, но мне кажется, что по какой-то причине здесь есть бесконечный цикл?

#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

Решение

Вы не обновили свой 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;
}
8

Другие решения

Ты можешь измениться

    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 и имеет сходимость третьего порядка.

0

По вопросам рекламы [email protected]