如何使用 ode23s 在 MATLAB 中使用 FOR 循环编写程序调用微分方程 50 次?

How to write a program to call a differential equation 50 times using FOR loop in MATLAB using ode23s?

我需要根据 vin 的不同值解两个微分方程 50 次。 我的代码写成:

for i=1:1
[T,Y]=ode23s(@(T,X)sys(T,X,vin),[t0 .00025],X(:,1)) 
vin =-12;
[T1,Y1]=ode23s(@(T,X)sys(T,X,vin),[.00025 .0005],Y(end,:))
vin=12
[T2,Y2]=ode23s(@(T,X)sys(T,X,vin),[.0005 .00075],Y1(end,:))
vin=-12
[T3,Y3]=ode23s(@(T,X)sys(T,X,vin),[.00075 .001],Y2(end,:))
end
Tf=[T;T1;T2;T3];
Xf=[Y;Y1;Y2;Y3];

现在我需要使用 for 循环执行此操作 100 个循环,最高可达 Y50 和 T50 我该怎么做?

把它放在一个额外的循环中

sct = t0:.00025:.001;
len = length(sct)-1;

vin =-12;

for i = 1:1
    % preallocate memory
    T = NaN(1,len);
    Y = NaN(size(X,1),len);
    Y(:,1) = X(:,1);
    for j = 1:len
        [tmpT,tmpY]=ode23s(@(T,X)sys(T,X,vin),sct(j:j+1),Y) 
        T(j) = tmpT;
        Y(:,j) = tmpY;
    end

    %TODO: do something with T & Y otherwise it will get overwritten in the next iteration of i
end

odextend 应用于解决方案结构(文档中求解器调用的最后一个变体)获取最后状态和新方程,并使用相同的求解器将解决方案结构扩展到新的结束时间。

这样做

T=linspace(0,0.025,101); 
vin = 12
sol = ode23s(@(T,X)sys(T,X,vin),[T(1) T(2)],X0); 
for k=2:100
  vin = -vin
  sol = odextend(sol,@(T,X)sys(T,X,vin),T(k+1));  
end

应该可以,不幸的是我的 Octave 版本没有 odextend 来测试句法的正确性。

解决方案可以通过包含的样本和密集输出进行评估

Tsmooth = linspace(0,0.025,2001)
Ysmooth = deval(sol,Tsmooth)

hold on;
plot(Tsmooth, Ysmooth(:,1), '-b');
plot(sol.x, sol.y(:,1), '+r');
hold off;