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

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

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

нужно было решить уравнение методом Ньютона. помогите понять почему так странно работает. на других функциях работает нормально
Листинг программы
  1. function f1(x: real): real;//исходная функция
  2. begin
  3. f1 := 2 * arctan(x) - 1 / (2 * x * x * x);
  4. end;
  5. function f2(x: real): real;//производная
  6. begin
  7. f2 := 3 / (2 * x * x * x * x) + 2 / (x * x + 1);
  8. end;
  9. var
  10. a, b, x, e, en: real;
  11. i: integer;
  12. begin
  13. a := -2 * pi;
  14. b := 2 * pi;
  15. e := 0.000001;
  16. if f1(a) * f2(a) > 0 then x := a
  17. else x := b;
  18. while abs(f1(x)) > e do
  19. begin
  20. x := x - f1(x) / f2(x);
  21. writeln(x:0:2);
  22. end;
  23. writeln(x:0:2);
  24. end.
на отрезке от -2
π
до 2
π
с точностью 10-6

Решение задачи: «Решение нелинейного уравнения»

textual
Листинг программы
  1. program Newton;
  2.  
  3. function f(x: real): real;{Исходная функция}
  4. begin
  5.     f := 2 * arctan(x) - 1/(2*x*x*x);  
  6. end;
  7.  
  8. function f1(x: real): real;{Первая производная функции}
  9. begin
  10.     f1 := 2 * (1/(x*x + 1)) + 3/2 * (1/(x*x*x*x));  
  11. end;
  12.  
  13. var
  14.     a, b, x, e, en: real;
  15.     i: integer;
  16.  
  17. begin
  18.     a := -2 * pi;
  19.     b := 2 * pi;
  20.     e := 0.000001;
  21.    
  22.     en := abs(a - b);
  23.     x := b;
  24.     i := 1;
  25.     while (abs(en) > e) do
  26.     begin{Пока не достигнута точность}
  27.         x := x - f(x) / f1(x); {выполнить шаг метода}
  28.         writeln(i,' ', x:0:6); {вывести значение X с шага}
  29.         en := abs(x - b); {Новая точность}
  30.         b := x; {Значение границы для следующего шага}
  31.         i := i + 1; {Номер шага}
  32.     end;
  33. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут