Сегодня мы рассмотрим, как реализовать метод Ньютона для нахождения приближений или корней вещественной функции на C++.
Решение производных и уравнений
Сначала нам нужно определить функции, которые решают формулу, и производную. Они выглядят следующим образом:
float solveEquation(float value) {
// Уравнение: x^3 + 4x^2 -10
return pow(value, 3) + 4 * pow(value, 2) - 10;
}
float solveDerivative(float value) {
// Уравнение: 2x^2 + 8x
return pow((2 * value), 2) + 8 * value;
}
Code language: JavaScript (javascript)
Эти функции будут вызываться для каждого значения в последующем цикле.
Метод Ньютона в C++
Далее мы можем реализовать метод Ньютона в C++ следующим образом:
#include <cmath>
#include <iostream>
using namespace std;
float solveEquation(float value) {
// Уравнение: x^3 + 4x^2 -10
return pow(value, 3) + 4 * pow(value, 2) - 10;
}
float solveDerivative(float value) {
// Уравнение: 2x^2 + 8x
return pow((2 * value), 2) + 8 * value;
}
int main() {
int iterator = 0;
float xi = 0.75;
float xi_xi = 0;
float last_xi = 0;
printf("Метод Ньютона\n");
printf("Задача: x^3 + 4x^2 -10\n");
printf("Производная: 2x^2 + 8x\n\n\n");
printf("+----+-------------+-------------+-------------+-------------+-------"
"-----+\n");
printf("+ i | xi | f(xi) | f'(xi) | xi + 1 | "
"xi_xi |\n");
printf("+----+-------------+-------------+-------------+-------------+-------"
"-----+\n");
while (1) {
float fxi = solveEquation(xi);
float _fxi = solveDerivative(xi);
float xi_1 = xi - (fxi / _fxi);
printf("|%3d |%12.8f |%12.8f |%12.8f |%12.8f |%12.8f|\n", iterator, xi, fxi,
_fxi, xi_1, xi_xi);
iterator++;
last_xi = xi;
xi = xi_1;
xi_xi = abs(xi - last_xi);
if (xi_xi == 0) {
printf("+----+-------------+-------------+-------------+-------------+---"
"---------+\n");
break;
}
}
}
Code language: PHP (php)
Как вы можете видеть, мы создаем бесконечный цикл, который прервется только тогда, когда xi_xi будет равен 0. Также мы используем функцию abs.
Внутри цикла мы также вызываем solveEquation и solveDerivative для каждого значения, выводим и выводим их с помощью printf.
В нашем случае, если я запускаю программу, результат выглядит следующим образом: