0

通常任何 ode23、ode 45 之类的 ode 都会从初始时间到最终时间 [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 运行 ode 到 tf 但在 p1 = p2 时停止它?或者我可以通过某种方式预先确定 p1 和 p2 的限制,以使 ode 不超过它们?请帮忙。谢谢

4

1 回答 1

1

您可以为您的 ode 使用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 ,但我不知道你的 y 在哪里。

这是一个工作示例

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
于 2016-01-28T07:27:09.507 回答