метод Рунге-Кутта для решения дифференциальных уравнений
макрос VBA Excel
Данный проект VBA позволяет решать дифференциальные уравнения первого порядка одним из численных методов, а именно, методом Рунге-Кутта.
Исходные данные:
- границы интервала a и b;
- шаг интегрирования h;
- начальное значение для решения y(a), позволяющее правильно определить константу…
И самое главное (самая ответственная часть) необходимо без ошибок ввести формулу в ячейку «D3».
Эта формула получается из заданного уравнения и представляет функцию, являющуюся производной от решения.
Ее параметрами может быть как только х (т.е. ячейка «D4»), так и х совместно с у
(т.е. ячейкой «D5»).
На рисунке показан пример ввода формулы для заданного уравнения…
В ячейки «D4» и «D5» вводить ничего не нужно… Туда значения будет подставлять макрос…
После этого остается нажать кнопку «Решить» и … если Вы не забыли включить макросы, то увидите, быстро меняющиеся текущие значения в ячейках столбца «D», а после окончания цикла расчета значений у, произойдет изменение графиков.
Графики должны быть построены на заданном Вами интервале (на рисунке от -0,4 до 1,25)…
В каждой точке, где производная (график синего цвета) пересекает ось 0У,
функция решения(красная) должна иметь экстремум (максимум или минимум)…
Если терпением Вы не отличаетесь, то не задавайте очень длинный интервал и/или очень мелкий шаг…
Подсказка:
Собственно, процедура заполнения массивов х и у по методу Рунге-Кутта будет выглядеть так:
(при этом глобальная переменная D3formula предварительно инициализируется: D3formula = Range("D3").Formula)
Private Function func(x As Double, y As Double) As Double 'производная
Dim f As String
'функция вычисляется по формуле, введенной пользователем в ячейку D3 (гед D4 - это x, D5 - это y)
f = Replace(D3formula, "D4", CStr(x))
f = Replace(f, "D5", CStr(y))
Range("D3").FormulaLocal = f
func = Range("D3")
End Function
Sub MethodRungeKutta()
'вспомогательные переменные
Dim k1 As Double, k2 As Double, k3 As Double, k4 As Double
Dim i As Integer
For i = 1 To n 'нулевые значения уже есть
x(i) = x(0) + i * h
k1 = func(x(i - 1), y(i - 1))
k2 = func(x(i - 1) + h / 2, y(i - 1) + k1 * h / 2)
k3 = func(x(i - 1) + h / 2, y(i - 1) + k2 * h / 2)
k4 = func(x(i), y(i - 1) + k3 * h)
y(i) = y(i - 1) + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4) 'значения вычисляются
p(i - 1) = k1 'сохранение в массив для графика
Next i
End Sub
Чтобы на диаграмме отобразились рассчитанные графики,
производится заполнение соответствующих диапазонов в столбцах «AA-AB-AC»…
Можете сравнить результаты с этим табличным вариантом.
Другие примеры на тему «РЕШЕНИЕ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ»:
Поделиться в соц сетях: