Решение ODE с функцией Event в Matlab - PullRequest
0 голосов
/ 20 февраля 2019

Я сейчас работаю над проектом, в котором смоделировал движение многочастичной механической системы.Это сложная, негладкая система, и движение системы не всегда описывается одним и тем же набором уравнений, что означает, что если я решу это численно, мне придется время от времени останавливать интегрирование (и запускать его снова с новымначальные условия и уравнения).

Теперь я хотел бы реализовать это в коде, используя функции событий Matlab.Концепция проста, но, как всегда, документация немного неописательна, когда речь идет о ее реализации для реальной проблемы.(В документации есть пример, но я почему-то не вижу исходный код).Тем не менее, я сделал некоторый код, теперь я просто застрял в том, как все это собрать: я хочу, чтобы ODE-решатель (например, ode45) решил мои уравнения, затем остановился, когда произошло событие, и начал снова интегрироваться с новымнабор ODE и начальные условия, но я не знаю, как передать ODE-решатель, какие уравнения решать дальше и каковы новые условия жизни!

Код:

function dy = firstODE(t,y)
dy = zeros(2,1);
dy(1) = y(2);
dy(2) = 1/(A1)*(B1-c*y(1));
end


function dy = secondODE(t,y)
dy = zeros(4,1);
dy(1) = y(2);
dy(2) = -c/A2*y(1);
dy(3) = y(4);
dy(4) = D2/B2 + c*C2/(A2*B2)*y(1);
end

function [value,isterminal,direction] = myEventsFcn(t,y)
value = [y(1)-K1, y(1)+K1, y(1)+K2, y(1)+K1, y(1)-K1];
isterminal = [1, 1, 1, 1, 1];
direction = [-1, -1, -1, 1, 1];
end

Как сообщить ODE-решателю, какие новые начальные условия и уравнения использовать после события?

1 Ответ

0 голосов
/ 07 марта 2019

Назовите два разных решения.то есть

sol1 = ode45(@(t,x)firstODE(t,x),tspan1,init1);
% set some conditions
sol2 = ode45(@(t,x)secondODE(t,x),tspan2,init2);

Если вы хотите, чтобы tspan2 начинался с того места, где остановился предыдущий, и переходил к концу вашего первоначально определенного tspan1, установите tspan2 = [sol1.xe, tspan1 (end)].

...