Подсчет итераций в методе Ньютона-Рафсона

Я работаю в простой программе, которая вычисляет корень любой данной функции, используя метод Ньютона-Рафсона. В этой программе мне нужно распечатать найденный корень и количество выполненных итераций. Сама программа в порядке, я могу найти корень любой данной функции, но не могу правильно посчитать количество итераций. Это всегда 5 за макс. количество итераций или на 1 меньше. Вот код на C ++:

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

using namespace std;

double f(float x)
{
double function1;
function1 = exp(x)- 4*pow(x,2); // given function
return function1;
}

double derivative(float x)
{
double derivative1;
derivative1 = exp(x) - 8*x; // derivative of given function
return derivative1;
}void newtonMethod(double x0, double error, int N)
{
double xNext, xPrevious, root;
int k;

xPrevious = x0;

for(int i = 0; i < N || f(xNext) > error; i++)
{
xNext = xPrevious - (f(xPrevious)/derivative(xPrevious)); // calculates the next value of x
xPrevious = xNext;
root = xNext;
k = i;
}
cout << endl;
cout << "Iterations made: " << k << endl;
cout << endl;
cout << endl;
cout << endl;
cout << "Root is:  " << root << endl;}

int main()
{
double x0, error;
int N; // max. number of iterations you can do
cout << "Enter x0: ";
cin >> x0;
cout << "Enter the error: ";
cin >> error;
cout << "Enter the max. number of iterations: ";
cin >> N;
newtonMethod(x0, error, N);
}

И я почти уверен, что ошибка в этом фрагменте кода:

;i < N || f(xNext) > error;

Если я запускаю эту программу и ставлю N = 100, она показывает правильный корень, но печатает «Итерации сделаны = 99», но это неправильно. Что я делаю, чтобы напечатать правильное количество выполненных итераций? Например, для функции в программе выше (e ^ x — 4x²) она должна остановиться на четвертой итерации, если я введу x0 = 0.5 и error = 0.0001. Как это исправить?

0

Решение

Чтобы ответить на ваш вопрос, вот почему следующий фрагмент кода не работает:

;i < N || f(xNext) > error;

Это просто потому, что в условии цикла, это продолжающийся состояние, которое оценивается, а не остановка состояние.
В приведенном выше фрагменте кода вы говорите компилятору: Продолжить цикл до тех пор, как либо i < N верно или f(xNext) > error правда. Поэтому, когда вы вводите x0 = 0.5, error = 0.0001 а также N = 100цикл делает то, что он не остановится, пока оба критерия не станут ложными, то есть когда я достигну N И допуск в F (X) меньше, чем ошибка.

Теперь решение просто поменять местами || оператор для && оператор. Как это:

i < N && f(xNext) > error;

но тогда ваш xNext не инициализируется. Потому что ваш xNext а также xPrevious равны в конце каждого цикла, я бы просто xPrevious вместо. Кроме того, как писал @Rathat, оценка вашего допуска в f (x) должна принимать его абсолютное значение, поэтому:

i < N && abs(f(xPrevious)) > error;

Наконец, вы должны вывести количество итераций как k + 1 так как вы начали с i = 0,

Это должно решить вашу проблему.

1

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

Спасибо за ответы на все вопросы. Я узнал, что не так, кроме логики за for условие, которое @yuxiangDev объяснил очень хорошо. Несмотря на то, что код @RatHat был полностью правильным, ошибка была в math.h Библиотека, которую я использовал. Я пробовал с <cmath> и это сработало очень хорошо! лол.

0

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