在Matlab中求解ODE系统直到达到平衡

时间:2014-07-24 23:38:04

标签: matlab numerical-methods ode

我正在尝试在调整不同参数时探索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

1 个答案:

答案 0 :(得分:1)

可以使用输出功能或事件中断集成。如果您更喜欢某个事件,则应编写类似if equilibrium, isterminal(1)=1; end的内容,而在输出函数的情况下,代码将变为if equilibrium, status=1; end

关于如何测试平衡条件,您应该将解决方案的先前值与当前值进行比较,这可以逐个组件或使用标准条件来完成。在这两种情况下,这就像通过有限差分计算解的导数一样。

此操作意味着您必须有权访问在之前时间步骤计算的解决方案。您可以使用输出函数将这些值保存在全局变量中。