Решение нелинейного уравнения - Pascal (80273)

Узнай цену своей работы

Формулировка задачи:

нужно было решить уравнение методом Ньютона. помогите понять почему так странно работает. на других функциях работает нормально
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
π
до 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.

Объяснение кода листинга программы

  1. Объявление функции f(x: real): real; - описывает исходную функцию, которая равна 2 * arctan(x) - 1/(2*x*x*x)
  2. Объявление функции f1(x: real): real; - описывает первую производную функции, которая равна 2 * (1/(x*x + 1)) + 3/2 * (1/(x*x*x*x))
  3. Объявление переменных a, b, x, e, en - присваивание значения переменным a = -2 pi, b = 2 pi, e = 0.000001
  4. Присваивание переменной en значения abs(a - b)
  5. Присваивание переменной x значения b
  6. Присваивание переменной i значения 1
  7. Пока abs(en) > e выполняется следующий блок кода:
    1. Выполнить шаг метода: x := x - f(x) / f1(x)
    2. Вывести значение X с шага: writeln(i,' ', x:0:6)
    3. Новая точность: en := abs(x - b)
    4. Значение границы для следующего шага: b := x
    5. Номер шага: i := i + 1

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5