Введение в моделирование
Дифференциальные уравнения – очень мощный метод моделирования происходящих процессов.
Возьмем наиболее простой пример – попробуем смоделировать падение на землю мяча, брошенного вверх.
Первое уравнение очевидно – изменение координаты (в нашем случае будет только координата Y) пропорционально скорости.
В дифференциальном виде это будет уравнением
С другой стороны, при полете мяча на него постоянно действует сила земного тяготения, которая ежесекундно изменяет скорость на константу g=9.8 м/с2 – константу свободного падения.
(-g, т.к. будем считать, что тяготение направлено против оси Y)
Запишем данные уравнения в форме нашей модели
function dydt():Number { return v; } function dvdt():Number { return -g; }
и запустим их в нашей моделирующей программе (V 0 = 60, Y 0 = 0):
Моделирование упругого отскока
Усложним задачу – попробуем смоделировать упругий отскок.
Для этого вспомним о силе реакции опоры – она пропорциональна погружению тела в глубину опоры.
Это можно сформулировать следующим образом:
В случае, если `Y >= 0`, то
если `Y < 0`, то
где sopr – константа, определяющая сопротивление среды.
Запишем это в нашей модели
function dydt():Number { return v; } function dvdt():Number { var res:Number; // промежуточная переменная, содержащая результат вычисления if(y >= 0) { res = -g; } else { res = -g + (-y) * sopr; } return res; }
и запустим в нашей моделирующей программе
Моделирование неупругого отскока
В завершении мы попробуем смоделировать неупругий отскок.
Здесь нам придется пойти на хитрость, так как точно учесть деформации тела в столь простом дифференциальном уравнении мы не можем.
Поэтому сделаем следующее предположение о падении в среду, которое легко записать в уравнении:
Когда `Y < 0` и `v < 0`, то
т.е. тело нормальным образом преодолевает сопротивление среды
Но, если `Y < 0` и `v >= 0` (т.е. в момент выталкивания) учтем, что не все сжатие среды пойдет на выталкивание тела.
где degr [0,1] – константа, определяющая какой, по сути, процент энергии будет средой поглощен.
Запишем это в виде нашей модели:
function dydt():Number { return v; } function dvdt():Number { var res:Number; // промежуточная переменная, содержащая результат вычисления if(y >= 0) { res = -g; } else { if(v < 0) { res = -g + (-y) * sopr; } else { res = -g + (-y) * sopr * (1 - degr); } } return res; }
и запустим в нашей моделирующей программе