我正在尝试在调整不同参数时探索ODE系统的均衡。目前,我有我的ODE函数(参见下面的SB1ode)和一个在传递参数值集(下面的SB1)时调用求解器的函数。 我需要帮助,告诉解算器停在平衡状态,而不是在固定的时间。 谢谢!
function [t,N] = SI1(s0,i0,Tmax,b,d,<more parameters>)
% Initial conditions
y0 = [s0 i0];
% parameters
P(1) = b;
P(2) = d;
P(3) = ... etc
% time steps
time = [0 Tmax];
% solve ODE system
[t,N] = ode45(@(t,Y) SI1ode(t,Y,P), time, y0);
end
function Y = SI1ode(t,x,P)
%parameters
b = P(1);
d = P(2);
...etc
%State variables
S = x(1);
I = x(2);
Y(1) = equation 1;
Y(2) = equation 2;
Y=Y'; %make column vector
end
我的运行脚本是:
Tmax = 100;
s0 = 100;
i0 = 1e-2;
b = 2;
...etc
D = [0 .01 0.05 0.1 0.15 0.2 0.3 0.4 0.5 .6 .7 .8 .9 1];
for j=1:length(D)
d = D(j);
[t,N] = SI1(s0,i0,Tmax,b,d,<more parameters>);
result(j) = N(end,2)/(N(end,1)+N(end,2));
end
答案 0 :(得分:1)
可以使用输出功能或事件中断集成。如果您更喜欢某个事件,则应编写类似if equilibrium, isterminal(1)=1; end
的内容,而在输出函数的情况下,代码将变为if equilibrium, status=1; end
。
关于如何测试平衡条件,您应该将解决方案的先前值与当前值进行比较,这可以逐个组件或使用标准条件来完成。在这两种情况下,这就像通过有限差分计算解的导数一样。
此操作意味着您必须有权访问在之前时间步骤计算的解决方案。您可以使用输出函数将这些值保存在全局变量中。