Реализация и примеры

В рабочей книге couchy.xls представлен вариант реализации рассмотренных методов решения задачи Коши.

Задание правой части дифференциального уравнения y'=f(x, y), начальной точки, интервала поиска решения и выбор численного метода реализовано с помощью диалогового окна.

Исходные данные могут задаваться как непосредственно, так и с помощью ссылок на ячейки электронной таблицы. Правая часть уравнения должна быть записана в соответствии с синтаксическими правилами MS Excel.

При запуске вычислительной процедуры осуществляется проверка корректности исходных данных (эта часть VBA кода не приведена в листинге ниже).

Полученное решение выводится в ячейки электронной таблицы (необходимо указать диапазон).

Листинг

часть программного кода кнопки "Решить"

'Инициализация исходных данных
Points = (b - a) / step 'Вычисление количества точек
ReDim arr_x(Points) 'массив значений x
ReDim arr_y(Points) 'массив значений y в заданных точках
ReDim f(Points) 'массив значений производной в заданных точках

'ввод начальных занчений х и у
arr_y(0) = y0
arr_x(0) = a

'вычисление значения x с заданным шагом
For i = 1 To Points
arr_x(i) = arr_x(i - 1) + step
Next i

'Выбор метода решения
If Opt_Euler.Value Then 'выбран метод Эйлера
For i = 1 To Points
arr_y(i) = euler(arr_x(i - 1), arr_y(i - 1), step, equat)
Next i

ElseIf Opt_Runge_kutta.Value Then 'выбран метод Рунге-Кутта
For i = 1 To Points
arr_y(i) = Runge_kutta(arr_x(i - 1), arr_y(i - 1), step, equat)
Next i

Else 'выбран метод прогноза и коррекции

'вычисление значений производной в начальной точке

f(0) = sheetFormula(arr_x(0), arr_y(0), equat)

'вычисление значения y в первых трех точках
'по методу Рунге-Кутта

For i = 1 To 3
arr_y(i) = Runge_kutta(arr_x(i - 1), arr_y(i - 1), step, equat)
f(i) = sheetFormula(CStr(arr_x(i)), CStr(arr_y(i)), equat)
Next i

'вычисление значения y в последующих точках
'по методу Милна

For i = 4 To Points
arr_y(i) = milna(arr_x(i), step, equat, i - 1, eps)
f(i) = sheetFormula(CStr(arr_x(i)), CStr(arr_y(i)), equat)
Next i
End If

'///////////////////////////////////////////////////////////////////
'Функция нахождения решения диффереренциального уравнения
' в заданной точке по методу Эйлера
'///////////////////////////////////////////////////////////////////

Function euler(ByVal x As Double, ByVal y As Double, ByVal step As Double, ByVal eqaut As String) As Double
Dim y1 As Double, y0 As Double
f0 = sheetFormula(CStr(x), CStr(y), eqaut)
y1 = y + step * f0
euler = y + 1 / 2 * step * (f0 + sheetFormula(CStr(x + step), CStr(y1), eqaut))
End Function

'///////////////////////////////////////////////////////////////////
'Функция нахождения решения диффереренциального уравнения
' в заданной точке по методу Рунге-Кутта
'///////////////////////////////////////////////////////////////////
Function Runge_kutta(ByVal x As Double, ByVal y As Double, ByVal step As Double, ByVal eqaut As String) As Double
Dim y1 As Double, y0 As Double, k1 As Double, k2 As Double, k3 As Double, k4 As Double

k1 = step * sheetFormula(CStr(x), CStr(y), eqaut)
k2 = step * sheetFormula(CStr(x + step / 2), CStr(y + k1 / 2), eqaut)
k3 = step * sheetFormula(CStr(x + step / 2), CStr(y + k2 / 2), eqaut)
k4 = step * sheetFormula(CStr(x + step), CStr(y + k3), eqaut)
Runge_kutta = y + (k1 + 2 * k2 + 2 * k3 + k4) / 6
End Function

'///////////////////////////////////////////////////////////////////
'Функция нахождения решения диффереренциального уравнения
' в заданной точке по методу Милна
'yp - значение Y, полученное по формуле прогноза
'yn1- значение Y, полученное с применением по формулы коррекции
'fp - производная по значению yp
'fn1 - производная по значению yn1
'eps - точность
'///////////////////////////////////////////////////////////////////

Function milna(ByVal x As Double, ByVal step As Double, ByVal eqaut As String, ByVal n As Byte, ByVal eps As Double) As Double
Dim yp As Double

yp = arr_y(n - 3) + 3 / 4 * step * (2 * f(n) - f(n - 1) + 2 * f(n - 2))
fp = sheetFormula(CStr(x), CStr(yp), eqaut)
yn1 = arr_y(2) + step / 3 * (fp + 4 * f(n) + f(n - 1))
fn1 = sheetFormula(CStr(x), CStr(yn1), eqaut)
'вычисления выполняются до тех пор, пока не будет достигнута требуемая точность
Do While Abs(fp - fn1) > eps
yp = yn1
fp = fn1
yn1 = arr_y(n - 1) + step / 3 * (fp + 4 * f(n) + f(n - 1))
fn1 = sheetFormula(CStr(x), CStr(yn1), eqaut)
Loop
milna = yn1
End Function


Пример

Парашютист спускается на парашюте, имеющем форму полусферы радиуса R=4 м. Его масса вместе с массой парашюта равна 82 кг. Найти скорость v парашютиста через 2 с после начала спуска. Считать, что сила сопротивления воздуха F1=0,00081sv2, где s – площадь наибольшего сечения, перпендикулярного направлению движения, v – скорость движения.
Решение
Решение задачи сводится к решению задачи Коши для обыкновенного дифференциального уравнения :
при начальном условии

Аналитическое решение ≈ 4,43