如何使用 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;
我需要根据 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;