ode函数matlab中的时变参数

ode函数matlab中的时变参数,matlab,ode,Matlab,Ode,我想用一个时间相关的参数来解一个ode。 如果t为=10且=10&&t,则cA应为10000,正如霍奇勒所建议的,我根据以下答案解决了问题: 解决 yO=0; % t=0 till t=10 cA=0; tspan=[0 10]; [T,Y]=ode45(@(t,y)myode(t,y,cA),tspan,yO,cA); % t=10 till t=11 cA=10000; tspan=[0 1]; [t,y]=ode45(@(t,y)myode(t,y,cA),tspan+T(end),Y

我想用一个时间相关的参数来解一个ode。
如果
t
=10
=10&&t,则cA
应为10000,正如霍奇勒所建议的,我根据以下答案解决了问题:

解决

yO=0;

% t=0 till t=10
cA=0;
tspan=[0 10];
[T,Y]=ode45(@(t,y)myode(t,y,cA),tspan,yO,cA);

% t=10 till t=11
cA=10000;
tspan=[0 1];
[t,y]=ode45(@(t,y)myode(t,y,cA),tspan+T(end),Y(end,:));
T = [T;t(2:end)];
Y = [Y;y(2:end,:)];

% t=11 till t=100
cA=0;
tspan=[0 89];
[t,y]=ode45(@(t,y)myode(t,y,cA),tspan+T(end),Y(end,:));
T = [T;t(2:end)];
Y = [Y;y(2:end,:)];

plot(T,Y);

如果我修改您的
myode
,使其在每次调用函数时同时打印
t
cA
,则使用
[t,y]=ode45(@myode[0 20],0)调用它;图(t,y)
然后,打印到MATLAB命令窗口的数字看起来是正确的,并且绘图显示了10秒和11秒时的预期不连续性。您试图在
myode
积分函数中使用
if
语句是个坏主意。用户提供的ODE函数不应中断。这只会导致计算效率低下和不准确。请参阅我的答案和,以了解完成您正试图做的事情的正确方法。如果你想要一个“时间相关参数”,它应该不断变化。@PhilGoddard是的,tup=20,它可以工作,但是如果你尝试使用100,结果是零…@horchler谢谢你的回答。我会那样试的!最大步长很可能太大,解算器正在跨过临界点。尝试
options=odeset('MaxStep',0.01)
或一些其他合适的步长,然后
[t,y]=ode45(@myode[01100],0,options);图(t,y)很高兴看到您解决了自己的问题,并感谢您发布解决方案。如果您提供的链接中的任何答案有帮助,请。
function dcB = myode(t,y,cA)
cB=y(1,:);
dcB=(cA-cB)*100/1750;
yO=0;

% t=0 till t=10
cA=0;
tspan=[0 10];
[T,Y]=ode45(@(t,y)myode(t,y,cA),tspan,yO,cA);

% t=10 till t=11
cA=10000;
tspan=[0 1];
[t,y]=ode45(@(t,y)myode(t,y,cA),tspan+T(end),Y(end,:));
T = [T;t(2:end)];
Y = [Y;y(2:end,:)];

% t=11 till t=100
cA=0;
tspan=[0 89];
[t,y]=ode45(@(t,y)myode(t,y,cA),tspan+T(end),Y(end,:));
T = [T;t(2:end)];
Y = [Y;y(2:end,:)];

plot(T,Y);