Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
Иван901

Решение дифференциальных уравнений четвертого порядка методом Эйлера и методом Рунге-Кутта

08.07.2014, 10:22. Показов 9363. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Форумчане прошу помочь решить уравнение f :=y+y'*x+y''+y'''*x методами Рунге-Кутта и Эйлера. Если ест ссылки на источник или исходник буду рад видеть. Заранее большое спасибо
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.07.2014, 10:22
Ответы с готовыми решениями:

Решение дифференциального уравнения методом Рунге-Кутта четвертого порядка
Решить дифференциальное уравнение y'-(y/x) = x*sin(x) X принадлежит y(пи/2)= пи y= 2x-x*cos(x)

Решение уравнений методом Рунге-Кутта 4 порядка
напишите програму для решения уравнений методом Рунги-кута 4 порядка))

Решение диф. уравнения 1-го порядка методом Рунге-Кутта
Здраствуйте, извините за обращение, задание поди пустяковое, но и с ним мне нужна помощь( (2x–y)y'=(x^2)y+ 2 - само уравнение X0=a=0 ...

9
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,434
10.07.2014, 20:25
Лучший ответ Сообщение было отмечено как решение

Решение

Labinskiy Nikolay aka e-moe © 2005

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
{$E+,N+,X+}
 
const
  eps = 1e-5;
  x0  = 3;
  y0  = 3;
 
type
  TFunc = function(x,y: extended): extended;
 
function func(x,y: extended): extended; far;
begin
  func := y*cos(x) - 2*sin(2*x);
end;
 
function Euler(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_  - начальное условие
      x_end - точка, в которой необходимо вычислить результат
      n - количество шагов для вычисления результата }
var
  i   : word;      { счетчик цикла }
  x,h : extended;  { текущая точка и длина шага }
  res : extended;  { переменная для накопления конечного результата функции}
begin
  h:= (x_end - x0_)/n; { Находим длину шага }
  res:= y0_; { устанавливаем начальные значения}
  x:=x0_;
  for i:=1 to n do
    begin { вычисляем результат по методу Эйлера }
      res:=res+h*f(x,res);
      x:=x+h; { переходим к следующей точке }
    end;
  Euler:=res;  { присваиваем конечный результат функции }
end;
 
function Euler2(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_  - начальное условие
      x_end - точка, в которой необходимо вычислить результат
      n - количество шагов для вычисления результата }
var
  i   : word;      { счетчик цикла }
  x,h : extended;  { текущая точка и длина шага }
  res : extended;  { переменная для накопления конечного результата функции}
begin
  h:= (x_end - x0_)/n; { Находим длину шага }
  res:= y0_; { устанавливаем начальные значения}
  x:=x0_;
  for i:=1 to n do
    begin { вычисляем результат по исправленному методу Эйлера }
      res:=res+h*(f(x,res)+f(x+h,res+h*f(x,res)))/2;
      x:=x+h; { переходим к следующей точке }
    end;
  Euler2:=res; { присваиваем конечный результат функции }
end;
 
function Euler3(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_  - начальное условие
      x_end - точка, в которой необходимо вычислить результат
      n - количество шагов для вычисления результата }
var
  i   : word;      { счетчик цикла }
  x,h : extended;  { текущая точка и длина шага }
  res : extended;  { переменная для накопления конечного результата функции}
begin
  h:= (x_end - x0_)/n; { Находим длину шага }
  res:= y0_; { устанавливаем начальные значения}
  x:=x0_;
  for i:=1 to n do
    begin { вычисляем результат по модифицированному методу Эйлера }
      res:=res+h*f(x+h/2,res+(h/2)*f(x,res));
      x:=x+h; { переходим к следующей точке }
    end;
  Euler3:=res; { присваиваем конечный результат функции }
end;
 
function RungeKutt(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_  - начальное условие
      x_end - точка, в которой необходимо вычислить результат
      n - количество шагов для вычисления результата }
var
  i   : word;      { счетчик цикла }
  x,h : extended;  { текущая точка и длина шага }
  res : extended;  { переменная для накопления конечного результата функции }
  k1,k2,k3,k4: extended; { вспомогательные переменные вычисления результата }
begin
  h:= (x_end - x0_)/n; { Находим длину шага }
  res:= y0_; { устанавливаем начальные значения}
  x:=x0_;
  for i:=1 to n do
    begin { вычисляем результат по методу Рунге-Кутта 4го порядка }
      k1:=f(x,res);
      k2:=f(x+h/2,res+h*k1/2);
      k3:=f(x+h/2,res+h*k2/2);
      k4:=f(x+h,res+h*k3);
      res:=res+h*(k1+2*k2+2*k3+k4)/6;
      x:=x+h; { переходим к следующей точке }
    end;
  RungeKutt:=res; { присваиваем конечный результат функции }
end;
 
function AdmsBoshf(f: TFunc; x0_,x_end,y0_: extended; n: word): extended;
{ где x0_ и y0_  - начальное условие
      x_end - точка, в которой необходимо вычислить результат
      n - количество шагов для вычисления результата }
var
  i     : word;         { счетчик цикла }
  x,h   : extended;     { текущая точка и длина шага }
  y1,y2 : extended;     { переменные для вычисления следующей точки }
  tmp   : extended;     { временная переменная для уточнения результата }
begin
  h:= (x_end - x0_)/n; { Находим длину шага }
  x:=x0_; { устанавливаем текущую точку }
  y1:=y0_+h*f(x+h/2,y0_+(h/2)*f(x,y0_)); { находим начальное значение
                                           модифицированным методом Эйлера }
  repeat { уточняем(корректируем) начальное значение }
    tmp:=y1;
    y1:=y0_+h*(f(x,y0_)+f(x+h,y1))/2;
  until abs(y1-tmp) < eps;
 
  x:=x+h; { переходим к следующей точке }
  y2:=y0_+2*h*f(x,y1); { прогнозируенм следующее значение }
 
  repeat { уточнаяем наш прогноз }
    tmp:=y2;
    y2:=y1+h*(f(x,y1)+f(x+h,y2))/2;
  until abs(y2-tmp) < eps;
 
  for i:=3 to n do { начинаем счет с 3 т.к. две точки уже найдены }
    begin
      x0_:=x; { переходим к следующей точке }
      x:=x+h;
      y0_:=y1;
      y1:=y2;
 
      y2:=y0_+2*h*f(x,y1); { прогнозируенм следующее значение }
 
      repeat { уточнаяем наш прогноз }
        tmp:=y2;
        y2:=y1+h*(f(x,y1)+f(x+h,y2))/2;
      until abs(y2-tmp) < eps;
    end;
 
  AdmsBoshf:=y2; { присваиваем конечный результат функции }
end;
 
begin
  writeln('Численное решение дифференциальных уравнений:');
  writeln(#10,'   y'' = y*cos(x) - 2*sin(2*x);   y(0)=3;   x_end=',(5*x0+3.5):5:5);
  writeln(#10,'Метод Эйлера:');
  writeln('n=5 000, result: ',Euler(func,x0,5*x0+3.5,y0,5000):5:5);
  writeln('n=10 000, result: ',Euler(func,x0,5*x0+3.5,y0,10000):5:5);
  writeln('n=25 000, result: ',Euler(func,x0,5*x0+3.5,y0,25000):5:5);
  writeln(#10,'Исправленный метод Эйлера:');
  writeln('n=50, result: ',Euler2(func,x0,5*x0+3.5,y0,50):5:5);
  writeln('n=100, result: ',Euler2(func,x0,5*x0+3.5,y0,100):5:5);
  writeln('n=250, result: ',Euler2(func,x0,5*x0+3.5,y0,250):5:5);
  writeln(#10,'Модифицированный метод Эйлера:');
  writeln('n=50, result: ',Euler3(func,x0,5*x0+3.5,y0,50):5:5);
  writeln('n=100, result: ',Euler3(func,x0,5*x0+3.5,y0,100):5:5);
  writeln('n=250, result: ',Euler3(func,x0,5*x0+3.5,y0,250):5:5);
 
  writeln(#10,'Метод Рунге-Кутта:');
  writeln('n=50, result: ',RungeKutt(func,x0,5*x0+3.5,y0,50):5:5);
  writeln('n=100, result: ',RungeKutt(func,x0,5*x0+3.5,y0,100):5:5);
  writeln('n=250, result: ',RungeKutt(func,x0,5*x0+3.5,y0,250):5:5);
 
  write(#10,'Press Enter to continue.');
  readln;
 
  writeln(#10,'Метод Адамса-Бошфора:');
  writeln('n=50, result: ',AdmsBoshf(func,x0,5*x0+3.5,y0,50):5:5);
  writeln('n=100, result: ',AdmsBoshf(func,x0,5*x0+3.5,y0,100):5:5);
  writeln('n=250, result: ',AdmsBoshf(func,x0,5*x0+3.5,y0,250):5:5);
end.
1
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
12.01.2019, 20:45
ZX Spectrum-128, Помоги сделать эту прогу под это задание......(мне тоже самое нужно)

Добавить к решению по методу Рунге-Кутте, решение по методу Эйлера - численное решение обыкновдифференциальных уравнений

а то я сам пытаюсь переделать у меня какие-то лаги и ошибки вылетают.....ошибки вылетают из-за
Pascal
1
far
(11 строка в этом коде)
может быть она не под Pascal ABC сделана?
-------------
мне желательно было бы чтобы оно было в виду двух процедур сделано.....чтобы я смог через case выбирать метод
Миниатюры
Решение дифференциальных уравнений четвертого порядка методом Эйлера и методом Рунге-Кутта  
0
Модератор
10429 / 5717 / 3404
Регистрация: 17.08.2012
Сообщений: 17,385
12.01.2019, 23:52
В Pascal ABC (не ABC.NET) из вещественных типов данных присутствует только real. Если Вы пишете программы на этом уродце, у которого ампутировано всё, что можно, и всё, что нельзя, то везде заменяйте объявления double и extended на real.
1
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
13.01.2019, 00:02
Cyborg Drone, я это понял спасибо....но вопрос мне непонятен все же, почему ошибка в far???

Добавлено через 4 минуты
Cyborg Drone, просто я поменял все на реал и убрал фар....и прога заработала.....но я боюсь на сам расчет это никак не повлияет ли?
0
Модератор
10429 / 5717 / 3404
Регистрация: 17.08.2012
Сообщений: 17,385
13.01.2019, 00:37
Если быть до конца честным, то чуть-чуть ухудшится точность вычислений: у extended в мантиссе может быть до 20 десятичных разрядов против 16 у ABC-шного real. На самом деле, для Вашей задачи это совершенно не страшно.

Удаление директивы far никак не повлияет, поскольку в современном Windows используется модель распределения памяти flat.
Необходимости в директивах far и near нет, поскольку в случае модели flat все вызовы ближние, то есть, near, и специально указывать компилятору тип вызова незачем. Тем более, что ABC он и не компилятор вовсе, а, по сути, интерпретатор.

Небольшая справка по директивам подпрограмм
После ; в объявлениях подпрограмм могут указываться директивы подпрограмм. Они определяют порядок работы со стеком и регистрами процессора и некоторые действия компилятора. Но, так как ABC не компилятор, то бОльшая часть директив в нём не используется.
Описания директив для большинства диалектов паскаля (это ещё далеко не все)

Директивы, определяющие действия компилятора.
ДирективаДействиеКомментарий
ForwardОпережающее описаниеСообщает, что описание ПП находится дальше
ExternalВнешняя подпрограммаПП в дисковом файле в объектном коде
AssemblerЯзык АссемблераОтмена стандартных инструкций обращения к ПП
OverloadПерезагрузкаНужен анализ фактических параметров ПП
FarДальняя модель вызоваДля DOS. Для Windows не требуются
NearБлижняя модель вызоваДля DOS. Для Windows не требуются
Директивы, которые определяют порядок работы со стеком и регистрами процессора. Можно использовать одну из них.
ДирективаДействиеКомментарий
RegisterРегистрИспользовать до 3 регистров процессора для ПП. Установлена по умолчанию
PascalПаскальВсе параметры подпрограмм размещаются в стеке. Для совместимости со старыми программами
StdCallСтандартный вызовИспользуется при обращении к ПП Windows API
SaveCallБезопасный вызовИспользуется при обращении к ПП Windows API при работе с дуальным интерфейсом
CDeclДекларации языка CСтек очищается вызывающей программой. Для вызова ПП из DLL, написанных на языке C++
Так вот, из всего этого множества этот уродец ABC использует только external и forward, если мне память правильно изменяет. Учебный диалект паскаля, что с него взять...
1
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
13.01.2019, 00:54
Cyborg Drone, подскажи мне последнее ...где в этом коде задается начальное условие, интервал интегрирования и шаг
0
Модератор
10429 / 5717 / 3404
Регистрация: 17.08.2012
Сообщений: 17,385
13.01.2019, 01:14
Начальное условие - y0. Начало интервала - x0. Описаны как константы.

Остальное указывается непосредственно в фактических параметрах функций. Например:
Pascal
1
Euler(func, x0, 5*x0+3.5, y0, 5000)
func - используемая функция
x0 - начало интервала
5*x0+3.5 - конец интервала
y0 - начальное условие
5000 - количество шагов

Замечание: в данной программе шаг h не задаётся, он вычисляется в подпрограммах исходя из границ интервала и количества шагов.
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
13.01.2019, 01:26
Cyborg Drone, ну а конец интервала здесь как я понимаю не обязательно в виде выражения зависящего от x0 представлять???? ... то есть можно просто конкретное число написать и все...так?

Добавлено через 8 минут
Cyborg Drone, ну и количество шагов я так понимаю( раз у меня интеграл от 0 до 1) будет равно 10? правильно?
0
Модератор
10429 / 5717 / 3404
Регистрация: 17.08.2012
Сообщений: 17,385
13.01.2019, 01:36
Именно так. Можно ещё убрать из секции const строчки c x0 и y0 и указывать x0 и y0 непосредственно, и в Вашем случае, это будет выглядеть, например, так:
Pascal
1
Euler(func, 0, 1, 0, 10)
Последний формальный параметр (количество шагов = 10) определяется тем, что у Вас задан шаг h=0.1, поэтому количество шагов будет
n=(xкон-xнач)/h=(1-0)/0.1=10.

Вообще, Вам бы лучше было перепахать все подпрограммы, поскольку у Вас задан шаг, а не количество шагов. То есть, в каждой подпрограмме заменить формальный параметр n:word на h:real, добавить в локальные параметры соответствующих подпрограмм переменную n типа word, убрать оттуда же описание переменной h и вместо вычисления h
Pascal
1
h:= (x_end - x0_)/n;
вычислять n
Pascal
1
n:= round((x_end - x0_)/h);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2019, 01:36
Помогаю со студенческими работами здесь

Решение дифференциальных уравнений методом Эйлера-Коши
Исправьте ошибку в программе, пожалуйста. y'+2y=2e^(-x)*cos(x) y(0)=1; ; h=0.025 var i,n:integer; a,b,h,x,x0,y,y0,P:real; ...

Метод Рунге-Кутта-Мерсона для дифференциальных уравнений 2 порядка
Добрый день. Помогите пожалуйста понять в чем ошибка. У меня дано такое уравнение: 0.3{y}^{''}=\frac{0.15y}{x}-\frac{{y}^{'}}{{x}^{2}} ...

Решение системы дифференциальных уравнений Методом Рунге-Кутта 4 порядка
В соседней теме я уже выкладывал решение системы дифф. уравнений через ode23. https://www.cyberforum.ru/matlab/thread2000372.html ...

Решение дифференциальных уравнений второго порядка методом Рунге-Кутта
Здравствуйте форумчане, совсем недавно создавал подобную тему, решением оказалась функция Odesolve, достаточно просто и эффективно, еще раз...

Решение системы дифференциальных уравнений методом Эйлера и Рунге-Кутты 4 порядка
Здравствуйте уважаемые форумчани. Есть следующая задача: решить методом Эйлера и Рунге-Кутты 4 порядка следующие уравнение dv/dt...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru