Advertisement
Sanlover

Untitled

Dec 16th, 2021
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. program adamsa; //наша цель решить обыкновенное дифференциальное уравнение методом Адамса(двухшаговым)
  2. h = 0.05; //шаг
  3. var a, b, k1, k2, k3, k4, delta:real;
  4. n:integer;
  5.  
  6. x, y, yt:array[0. .100] of real;
  7.  
  8. //функция которая дана мне в таблице 6
  9. function f (x1, y1: real):real;
  10. begin
  11. f:= x1*y1;
  12. end;
  13.  
  14. begin
  15. b:= 1; //конец интервала
  16. a:= 0; //начало интервала
  17. x[0]:= 0; //начальное условие x
  18. y[0]:= 1; //начальное условие y
  19.  
  20. k1:= f (x[0], y[0]);
  21. k2:= f (x[0] + h / 2, y[0] + (h / 2) * k1);
  22. k3:= f (x[0] + h / 2, y[0] + (h / 2) * k2);
  23. k4:= f (x[0] + h, y[0] + h * k3);
  24.  
  25. y[1]:= y[0] + (h / 6) * (k1 + 2 * (k2 + k3) + k4); //четырёхэтапная схема метода Рунге-Кутта нужна для вычисления "начального отрезка"
  26.  
  27. yt[0]:= exp (x[0]);
  28. delta:= abs (yt[0] - y[0]);
  29.  
  30. x[1]:= x[0] + h;
  31.  
  32. writeln ('x0=', x[0]);
  33. writeln ('y0=', y[0]);
  34. writeln ('yt0=', yt[0]);
  35. writeln ('delta=', delta);
  36.  
  37. for n := 1 to 100 do
  38. begin
  39. if x[n] >= b + h / 2 //если наш x будет больше конца интервала то прекращаем вычисления
  40. then break;
  41.  
  42. y[n + 1]:= y[n] + (h / 2) * (3 * f (x[n], y[n]) - f (x[n - 1], y[n - 1]));
  43.  
  44. x[n + 1]:= x[n] + h;
  45.  
  46. yt[n]:= x[n];
  47.  
  48. delta:= abs (yt[n] - y[n]);
  49.  
  50. writeln ('y=', y[n]: 7: 15, ' ', 'x=', x[n]: 7: 15, ' ', 'yt=', yt[n]: 7: 15, ' ', 'delta=', delta: 7:15);//метод Адамса(двухшаговый)
  51.  
  52. end;
  53.  
  54. end.
  55.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement