通常任何像ode23,ode 45这样的颂歌都会从初始时间到最终时间[t0 tf]进行整合。有没有办法,可以在不依赖于时间的其他参数上停止集成?例如,我有一个线性阻尼器。
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从t0运行到tf,但是当p1 = p2时停止它?或者某种方式我可以预先决定p1和p2的限制,以便颂歌不超过它们?请帮忙。感谢
答案 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
你需要先设置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