How to compare solution of ODE for each time step?

1 次查看(过去 30 天)
This is the code I'm using now.
opts = odeset('MaxStep', 1);
[T,Y] = ode45(@hw0,[0 100],[0.01 10], opts);
plot(T,Y)
And hw0 is,
function dy = hw0(t,y)
D=0.02;
um=0.2;
Ks=0.05;
X0=0.01;
S0=0.1;
Sf=10;
dy = zeros(2,1);
dy(1) = -D*y(1) + (um*y(1)*y(2))./(Ks+y(2));
dy(2) = Sf * D - D*y(2) - (um*y(1)*y(2))./(0.4*(Ks+y(2)));
what I want to do is compare the y(i,1) and y(i+1,1) then change the ODE condition when y(i,1)-y(i+1,1)<=0.0001*y(i,1)
(change D as D+0.02 value then start ODE from this point, repeat this process until X becomes 0)
what I've tried is below, sadly it doesn't work as I expected.
function dy = hw3(t,y)
D=0.02;
um=0.2;
Ks=0.05;
X0=0.01;
S0=0.1;
Sf=10;
dy = zeros(2,1);
dy(1) = -D*y(1) + (um*y(1)*y(2))./(Ks+y(2));
dy(2) = Sf * D - D*y(2) - (um*y(1)*y(2))./(0.4*(Ks+y(2)));
n=numel(y(:,1));
for i=1:n-1
if abs(y(i,1)-y(i+1,1))<=0.0001*y(i,1)
ix=i;
D=D+0.02;
break
end
end
Then I'm planning ODE recursion from t=ix, recusion stops when Y(1)=0; anyway for now, finding ix is the main problem.
what should I do to find ix?

回答(1 个)

darova
darova 2021-8-2
Maybe you are looking for event option. Then just place ode45 insife while loop
t0 = 1;
while contdition
[t,x] = ode45(f,[0 t0],x0);
t0 = t(end);
end

类别

Help CenterFile Exchange 中查找有关 Ordinary Differential Equations 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by