2016-01-28 6 views
0

Обычно любые ode, такие как ode23, ode 45, будут выполнять интеграцию от начального времени до последнего времени [t0 tf]. Есть ли способ, интеграция может быть остановлена ​​на каком-то другом параметре, не зависящем от времени? Например, у меня есть линейный демпфер.Есть ли способ остановить ode (any) в matlab после точки, отличной от времени?

Initial Pressure p1 = some value 
Initial Pressure p2 = some value (not = p1) 
time = [t0 tf] 
some other constants 
options = odeset 
y0 = [initial conditions for some parameters containing p1 and p2] 
[t,y] = ode45(@func,[t0 tf],y0,options,other constants to carry) 

and in func code: 
equations for integration for p1 and p2 and some other variables 

Как бы это было возможно, чтобы не запускать оду от t0 до ТФ, но остановить его, когда p1 = p2? Или каким-то образом я могу заранее определить пределы для p1 и p2, чтобы ода не превышала их? Пожалуйста помоги. Спасибо

+0

ли это вычислительная задача усилий, то есть это займет слишком много времени в противном случае? Вы можете просто удалить части «обычного» решения с точки, где p1 = p2 – rst

+0

Я думаю, что для поиска и удаления значений из обычного решения потребуется много усилий. Вот почему я думаю, что систематический выход из этого будет лучше. Но все равно спасибо. –

ответ

1

Вы можете использовать опцию event для вашей оды.

Использование

opts=odeset('Events',@events); 
[t,y]=ode45(@func,[t0 tf],y0,opts); 

И

function [value,isterminal,direction] = events(t,y) 
% check p1 = p2 
% and stop 
value = y(x1)-y(x2) 
isterminal = 1; % stop the integration 
direction = 0; % all events 

Ofc вам необходимо установить p1 и p2 первый, но я не знаю, где в вашем у там расположены.

Вот рабочий пример

function mytest() 
clear T 
clear Y 
y0 = [1 3]; 
options = odeset('RelTol', 1e-4, 'AbsTol', [1e-4 1e-4 1e-5], 'Events', @events, 'OutputFcn', @odeplot); 
[Tn,Yn,T,Y,I] = ode45(@func, [0 12], [0 1 1], options); 
odeplot([],[],'done') 
hold on 
figure 
options = odeset('RelTol', 1e-4, 'AbsTol', [1e-4 1e-4 1e-5], 'OutputFcn', @odeplot); 
[Tn,Yn,T,Y,I] = ode45(@func, [0 12], [0 1 1], options); 
odeplot([],[],'done') 
end 


function dy = func(t,y) 
dy=zeros(3,1); 
dy(1) = y(2)*y(3); 
dy(2) = -y(1)*y(3); 
dy(3) = -0.51*y(1)*y(2); 
end 

function [value,isterminal,direction] = events(t,y) 
value = y(1)-y(2); 
isterminal = 1; % stop the integration 
direction = 0; % all events 
end 
+0

Таким образом, этот код событий должен быть интегрирован с кодом func, который я должен выполнить для вычисления ode, или должен быть отдельным кодом, а если отдельный, где я устанавливаю здесь p1 и p2, потому что он должен знать эти значения сначала из func, чтобы убедиться, что они равны или не правильны? Спасибо –

+0

Отдельный код, p1 и p2 могут быть где-то в векторе y. – rst

+0

Нет. Это не сработало. Только старый результат. –