Решение уравнений методами Ньютона и итерации - 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
будет использоваться в качестве функции, которую необходимо приблизить методом Ньютона или итерации.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д