Решение уравнений методами Ньютона и итерации - C (СИ)
Формулировка задачи:
Написал программу, но она не хочет мне считать методом итерации.
Помогите, пожалуйста, найти ошибку
Функция 0.25*x*x*x + x - 1.2502
Интервал: от 0 до 2
#include <stdio.h>
#include <math.h>
#include <float.h>
typedef double real_t;
typedef real_t (*fun_t) (real_t);
const real_t REAL_EPSILON = DBL_EPSILON;
const real_t TARGET_A = 0.0, TARGET_B = 2.0;
real_t target(real_t x)
{
return 0.25*x*x*x + x - 1.2502;
}
real_t target_xfx(real_t x)
{
return 1.2502 - 0.25*x*x*x;
}
real_t target_derivative(real_t x)
{
return 0.75*x*x + 1;
}
real_t newton(fun_t fun, fun_t derivative, real_t a_0, real_t b_0)
{
real_t a = a_0;
real_t b = b_0;
real_t x_0 = (a + b) / 2;
real_t x = x_0 - (fun(x_0) / derivative(x_0));
while (fabs(x - x_0) >= REAL_EPSILON)
{
x_0 = x;
x = x_0 - (fun(x_0) / derivative(x_0));
}
return x;
}
real_t iterations(fun_t fun, real_t a_0, real_t b_0)
{
real_t a = a_0;
real_t b = b_0;
real_t x_0 = (a + b) / 2;
real_t x = fun(x_0);
while (fabs(x - x_0) >= REAL_EPSILON)
{
x_0 = x;
x = fun(x_0);
}
return x;
}
int main()
{
int epswidth = ceil(-log10(REAL_EPSILON));
printf(
"target_2 = 0, x = %.*f; newton, x ? [%f, %f]\n",
epswidth,
newton(target, target_derivative, TARGET_A, TARGET_B),
TARGET_A, TARGET_B
);
printf(
"target_2 = 0, x = %.*f; iterations, x ? [%f, %f]\n",
epswidth,
iterations(target_xfx, TARGET_A, TARGET_B),
TARGET_A, TARGET_B
);
return 0;
}Решение задачи: «Решение уравнений методами Ньютона и итерации»
textual
Листинг программы
real_t target_xfx(real_t x)
{
return 1.2502 - 0.25*x*x*x;
}
Объяснение кода листинга программы
- В функции
target_xfxпроисходит вычисление целевой функцииf(x)для уравнения x^3 - 1.2502 = 0 real_t target_xfx(real_t x) { return 1.2502 - 0.25xx*x; } - В функции используется переменная
xтипаreal_tдля хранения значения аргумента функцииf(x). - Значение функции
f(x)вычисляется путем разности 1.2502 и значения x в кубе, умноженного на 0.25. - Возвращаемое значение функции
target_xfxбудет использоваться в качестве функции, которую необходимо приблизить методом Ньютона или итерации.