Решение нелинейного уравнения - Pascal (80273)
Формулировка задачи:
нужно было решить уравнение методом Ньютона. помогите понять почему так странно работает. на других функциях работает нормально
на отрезке от -2
function f1(x: real): real;//исходная функция
begin
f1 := 2 * arctan(x) - 1 / (2 * x * x * x);
end;
function f2(x: real): real;//производная
begin
f2 := 3 / (2 * x * x * x * x) + 2 / (x * x + 1);
end;
var
a, b, x, e, en: real;
i: integer;
begin
a := -2 * pi;
b := 2 * pi;
e := 0.000001;
if f1(a) * f2(a) > 0 then x := a
else x := b;
while abs(f1(x)) > e do
begin
x := x - f1(x) / f2(x);
writeln(x:0:2);
end;
writeln(x:0:2);
end.π
до 2π
с точностью 10-6 Решение задачи: «Решение нелинейного уравнения»
textual
Листинг программы
program Newton;
function f(x: real): real;{Исходная функция}
begin
f := 2 * arctan(x) - 1/(2*x*x*x);
end;
function f1(x: real): real;{Первая производная функции}
begin
f1 := 2 * (1/(x*x + 1)) + 3/2 * (1/(x*x*x*x));
end;
var
a, b, x, e, en: real;
i: integer;
begin
a := -2 * pi;
b := 2 * pi;
e := 0.000001;
en := abs(a - b);
x := b;
i := 1;
while (abs(en) > e) do
begin{Пока не достигнута точность}
x := x - f(x) / f1(x); {выполнить шаг метода}
writeln(i,' ', x:0:6); {вывести значение X с шага}
en := abs(x - b); {Новая точность}
b := x; {Значение границы для следующего шага}
i := i + 1; {Номер шага}
end;
end.
Объяснение кода листинга программы
- Объявление функции f(x: real): real; - описывает исходную функцию, которая равна
2 * arctan(x) - 1/(2*x*x*x) - Объявление функции f1(x: real): real; - описывает первую производную функции, которая равна
2 * (1/(x*x + 1)) + 3/2 * (1/(x*x*x*x)) - Объявление переменных
a, b, x, e, en- присваивание значения переменнымa= -2 pi,b= 2 pi,e= 0.000001 - Присваивание переменной
enзначенияabs(a - b) - Присваивание переменной
xзначенияb - Присваивание переменной
iзначения1 - Пока
abs(en) > eвыполняется следующий блок кода:- Выполнить шаг метода:
x := x - f(x) / f1(x) - Вывести значение X с шага:
writeln(i,' ', x:0:6) - Новая точность:
en := abs(x - b) - Значение границы для следующего шага:
b := x - Номер шага:
i := i + 1
- Выполнить шаг метода: