Я работаю в простой программе, которая вычисляет корень любой данной функции, используя метод Ньютона-Рафсона. В этой программе мне нужно распечатать найденный корень и количество выполненных итераций. Сама программа в порядке, я могу найти корень любой данной функции, но не могу правильно посчитать количество итераций. Это всегда 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. Как это исправить?
Чтобы ответить на ваш вопрос, вот почему следующий фрагмент кода не работает:
;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
,
Это должно решить вашу проблему.
Спасибо за ответы на все вопросы. Я узнал, что не так, кроме логики за for
условие, которое @yuxiangDev объяснил очень хорошо. Несмотря на то, что код @RatHat был полностью правильным, ошибка была в math.h
Библиотека, которую я использовал. Я пробовал с <cmath>
и это сработало очень хорошо! лол.