0 / 0 / 0
Регистрация: 26.03.2020
Сообщений: 1
1
Excel

Метод Рунге-Кутта

26.03.2020, 16:49. Показов 4200. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Visual Basic
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
Function РУНГКУТ(f, x0, y0, t, Optional n = 100)
Dim h As Double
h = (t - x0) / n
Dim p(1 To 4) As Double
p(1) = 1 / 6
p(2) = 1 / 3
p(3) = 1 / 3
p(4) = 1 / 6
Dim y As Double
y = y0
Dim x As Double
x = x0
Dim k(1 To 4) As Double
Set Obj = New DEquations
Dim i As Integer, j As Integer
For i = 1 To n
k(1) = h * CallByName(Obj, f, VbMethod, x, y)
k(2) = h * CallByName(Obj, f, VbMethod, x + h / 2, y + k(1) / 2)
k(3) = h * CallByName(Obj, f, VbMethod, x + h / 2, y + k(2) / 2)
k(4) = h * CallByName(Obj, f, VbMethod, x + h, y + k(3))
For j = 1 To 4
y = y + p(j) * k(j)
Next j
x = x + h
Next i
РУНГКУТ = y
End Function
 
 
Function DEqn(x As Double, y As Double) As Double
DEqn = x ^ 2 - y
End Function
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2020, 16:49
Ответы с готовыми решениями:

Метод Рунге-Кутта на VBA в Excel
Здравствуйте. Пишу программу решения трех ДУ методом численного интегрирования Рунге-Кутта (расчет...

Решение системы дифф. ур. методом Рунге-Кутта 4-ого порядка.
Есть пример? Шаблон? Или типа того. Чтоб по аналогии можно было сделать.

Метод Рунге-Кутта четвертого порядка (метод прогноза и коррекции)
Дано ОДУ x'''-x''x+(x')^2=0. Пытаюсь решить ОДУ методом Рунге-Кутта по данному примеру:...

Метод Эйлера и метод Рунге-Кутта: проверить код
Доброго времени суток. Хотел бы обратится к вам за помощью. Я написал программку, которая решает...

14
ᴁ®
Эксперт MS Access
3593 / 1959 / 415
Регистрация: 13.12.2016
Сообщений: 6,761
Записей в блоге: 5
29.03.2020, 09:12 2
Diana001020, не понятно что не получается? Не понятно что за код.
Внутри определение DEquations , а что это за объект?
Вызов функции CallByName , которая не описана
Функция DEqn, которая ни разу не применяется
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36357 / 20236 / 4211
Регистрация: 12.02.2012
Сообщений: 33,512
Записей в блоге: 13
29.03.2020, 14:48 3
Цитата Сообщение от АЕ Посмотреть сообщение
CallByName
- встроенная функция, позволяющая вызывать метод COM-объекта по string-имени
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
29.03.2020, 15:00 4
Diana001020, я сделал предположение, что DEqn это и есть функция, которую надо проинтегрировать, Проверьте такой код (запустить макрос proba)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Function RUNKUT(Sf, x0, y0, t, Optional n = 100)
Dim h As Double, y As Double, x As Double, k(1 To 4) As Double
Dim i As Integer, j As Integer
h = (t - x0) / n
y = y0
x = x0
For i = 1 To n
  k(1) = h * Application.Run(Sf, x, y)
  k(2) = h * DEqn(x + h / 2, y + k(1) / 2)
  k(3) = h * DEqn(x + h / 2, y + k(2) / 2)
  k(4) = h * DEqn(x + h, y + k(3))
  y = y + (k(1) + k(4)) / 6 + (k(2) + k(3)) / 3
  x = x + h
Next i
RUNKUT = y
End Function
Function DEqn(x As Double, y As Double) As Double
DEqn = x ^ 2 - y
End Function
 
Sub proba()
Sf = "DEqn"
MsgBox RUNKUT(Sf, 0, 1, 2)
End Sub
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36357 / 20236 / 4211
Регистрация: 12.02.2012
Сообщений: 33,512
Записей в блоге: 13
29.03.2020, 15:04 5
Diana001020, понятно, что не работает. Ты сама писала этот код?

Вот что должно быть на самом деле:

Visual Basic
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
'''' Модуль rk.bas
 
Function РУНГКУТ(f, x0, y0, t, Optional n = 100)
Dim h As Double
Dim p(1 To 4) As Double
Dim y As Double
Dim x As Double
Dim k(1 To 4) As Double
Dim i As Integer, j As Integer
Dim Obj As Object
 
   h = (t - x0) / n
 
   p(1) = 1 / 6
   p(2) = 1 / 3
   p(3) = 1 / 3
   p(4) = 1 / 6
   y = y0
   x = x0
   Set Obj = New DEquations
   For i = 1 To n
       Debug.print x,y
       k(1) = h * CallByName(Obj, f, VbMethod, x, y)
       k(2) = h * CallByName(Obj, f, VbMethod, x + h / 2, y + k(1) / 2)
       k(3) = h * CallByName(Obj, f, VbMethod, x + h / 2, y + k(2) / 2)
       k(4) = h * CallByName(Obj, f, VbMethod, x + h, y + k(3))
       For j = 1 To 4
           y = y + p(j) * k(j)
       Next j
       x = x + h
   Next i
   РУНГКУТ = y
End Function
 
Sub Start()
 
    y# = РУНГКУТ("DEqn", 0, 1, 10)
 
End Sub
 
''' Модуль класса  DEquations.cls
 
Public Function DEqn(x As Double, y As Double) As Double
    DEqn = x ^ 2 - y
End Function
Вложения
Тип файла: xls vba-uw.xls (27.5 Кб, 47 просмотров)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36357 / 20236 / 4211
Регистрация: 12.02.2012
Сообщений: 33,512
Записей в блоге: 13
29.03.2020, 15:06 6
Burk, это правая часть диф. уравнения, которое решается методом Рунге-Кутта

Добавлено через 1 минуту
И использование внешнего объекта оправдано - можно задавать разные уравнения, не меняя при этом основной код
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
29.03.2020, 15:17 7
Diana001020, в строках 9, 10, 11 забыл заменить DEqn на аналог строки 8
Visual Basic
1
2
3
4
  k(1) = h * Application.Run(Sf, x, y)
  k(2) = h * Application.Run(Sf, x + h / 2, y + k(1) / 2)
  k(3) = h * Application.Run(Sf, x + h / 2, y + k(2) / 2)
  k(4) = h * Application.Run(Sf, x + h, y + k(3))
Добавлено через 3 минуты
Catstail, а вы думаете, что я не в курсе, что dy/dx=F(x,y) и что F это правая часть уравнения? Я так и написал.
Если вы внимательно посмотрите, то имя функции задается только в макросе тестирования и какую функцию хотите, такую и ставьте, код Рунге менять не надо. Я просто забыл поменять в строках, о которых писал выше
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36357 / 20236 / 4211
Регистрация: 12.02.2012
Сообщений: 33,512
Записей в блоге: 13
29.03.2020, 15:34 8
Цитата Сообщение от Burk Посмотреть сообщение
DEqn это и есть функция, которую надо проинтегрировать,
- проинтегрировать функцию и проинтегрировать дифференциальное уравнение - не одно и то же
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
29.03.2020, 15:40 9
Catstail, давайте мы на форуме по программированию не будем изощряться в точностях определений, понимаю, что хотите чтобы последнее слово осталось за вами, ради бога, но не увлекайтесь.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36357 / 20236 / 4211
Регистрация: 12.02.2012
Сообщений: 33,512
Записей в блоге: 13
29.03.2020, 15:43 10
Burk, Программирование - программированием, а математика - математикой. Я просто Вас поправил, не стоит обижаться
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
29.03.2020, 15:44 11
Catstail, а вот у вас претензии к моему коду есть?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36357 / 20236 / 4211
Регистрация: 12.02.2012
Сообщений: 33,512
Записей в блоге: 13
29.03.2020, 15:54 12
Burk, немного есть...

Visual Basic
1
2
3
4
  k(1) = h * Application.Run(Sf, x, y)         ' вызов по символическому имени
  k(2) = h * DEqn(x + h / 2, y + k(1) / 2)   ' явный вызов, что странно...
  k(3) = h * DEqn(x + h / 2, y + k(2) / 2)
  k(4) = h * DEqn(x + h, y + k(3))
но это легко поправить. Можно упрекнуть код и в том, что работать он будет только в Excel, а код с CallByName - и в чистом VB. Но и это не столь важно. Ну, и последнее: обычно интегрирование дифф. уравнений делают ради поведения функции на отрезке интегрирования. А в Вашем коде (как и в коде ТС) функция просто возвращает последнее значение y. Что почти бесполезно. Я вставил отладочную печать внутрь кода. Ну, хоть так.

Впрочем, еще раз, все это легко правится и не столь уж и важно.
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
29.03.2020, 16:04 13
Catstail, после вашего сообщения, в котором вы мне объясняли про правую часть, стоит моё, в котором я объяснял, что забыл заменить явную ссылку на вызов по символическому имени и показал автору как нужно исправить. Читайте внимательно и странности исчезнут.

Добавлено через 3 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
функция просто возвращает последнее значение y
я всегда стараюсь делать как у автора. Для себя, конечно, вывел бы промежуточные значения. И мне такие вещи объяснять не надо, это к автору.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36357 / 20236 / 4211
Регистрация: 12.02.2012
Сообщений: 33,512
Записей в блоге: 13
29.03.2020, 16:08 14
Burk, да, не обратил внимание на следующий коммент... Но замечание про неуниверсальность остается. И не стоит так реагировать на замечания.
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
29.03.2020, 16:31 15
Catstail, меня не интересуют универсальности, я работаю только в вба, поэтому, если вы увидите в моих кодах что-то, что не пойдет в ВБ, можете мне об этом и не сообщать. Главная задача помочь и, если возможно, научить создателей тем чему-то. А промежуточные значения пусть делают сами, если появится нужда. А то сделаете всё от А до Я, а им что останется?
1
29.03.2020, 16:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2020, 16:31
Помогаю со студенческими работами здесь

Графики - Метод Рунге-Кутта и Метод Адамса
Вот задание:

Графики - Метод Рунге-Кутта и Метод Адамса
Пожалуйста помогите!!! очень срочно нужно сделать графики (два в одном): метод Рунге-Кутта и метод...

Метод Рунге-Кутта.
хотелось бы спросить знающих людей. Мне необходимо решить систему ДУ уравнений методом...

Метод Рунге-Кутта
Здравствуйте, пожалуйста помогите в программе Delphi решить систему обыкновенных дифференциальных...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru