Проблема в реализации метода простых итераций для решения нелинейных уравнений

Я столкнулся со следующей проблемой: реализуя метод простых итераций для решения нелинейных уравнений для функции x^2 + x + 4cos x − 4.1 = 0, у меня решение выходит за пределы задаваемого отрезка. Вероятно, проблема в реализации моего метода. Можете помочь обнаружить ошибку? К примеру, на отрезке [1; 1.5] должен быть корень данного уравнения, однако программа находит корень уравнения, не удовлетворяющему этому отрезку.

#include <iostream>
#include <stdio.h>
using namespace std;

double f(double x) //возвращает значение функции f(x) = x^2-2
{
    return x * x + x + 4 * cos(x) - 4.1;
}

double phi(double x)
{
    return 4.1 - 4 * cos(x) - x * x;
}


void iterations(double eps)
{
    int exit = 0, i = 0;//переменные для выхода и цикла
    double x0, x1;
    double a, b;
    do
    {
        i = 0;
        cout << "Please input [a;b]\n=>";
        cin >> a >> b; // вводим границы отрезка, на котором будем искать корень
        if (f(a) * f(b) > 0) // если знаки функции на краях отрезка одинаковые, то здесь нет корня
            cout << "\nError! No roots in this interval\n";
        else
        {
            x0 = (a + b) / 2;
            do
            {
                x1 = x0;
                x0 = phi(x1);
                cout << ++i << "-th iteration = " << x0 << "\n";
            } while (fabs(x0 - x1) > eps);
            printf("Root = %.15lf", x0);
        }
        cout << "\nExit?=>";
        cin >> exit;
    } while (exit != 1); // пока пользователь не ввел exit = 1
}
int main()
{
    double eps = pow(10, -10);
    iterations(eps);
}

Ответы (1 шт):

Автор решения: Vasily

Я бы точно реализовывал fi для более общего случая, примерно так

double fi(double x, double K) {
    return  x + K*f(x);
}
 

и в цикле бы делал что то такое:

y = fi(x,K);
b = fabs(x - y);
x = y;
n += 1;
→ Ссылка