我试图在3D中绘制van der pol方程的解决方案:
t
为x
轴mu
为y
轴; y(t)
为z
轴。我正在使用ode23s
来解决这个问题。
我的2D代码是:
tspan = [0, 6000];
y0 = [1; 1];
Mu = 1000;
ode = @(t,y) vanderpoldemo(t,y,Mu);
[t,y] = ode23s(ode, tspan, y0);
plot(t,y(:,1))
xlabel('t')
ylabel('y(t)')
我想在3D情节中使用这样的东西:
tspan = [0, 6000];
y0 = [1; 1];
Mu = 1:1000; %Mu variate from 1 to 1000 on the y axis
ode = @(t,y) vanderpoldemo(t,y,Mu);
[t,y] = ode23s(ode, tspan, y0); %error : Dimensions of matrices being concatenated are not consistent.
plot3(t,Mu,y(:,1))
xlabel('t')
ylabel('mu')
zlabel('y(t)')
但是这段代码没有用,所以我试着将Mu作为这样的论点:
ode = @(t,y,Mu) vanderpoldemo(t,y,Mu)
[t,y,Mu] = ode23s(ode, tspan, y0);
%error : Not enough input arguments
但它也没有用。
答案 0 :(得分:0)
您的第一种方法可能不正确,因为您的vanderpoldemo
函数未对其Mu
输入实施矢量化评估。
第二种方法不正确,因为ode23s
解决了y' = f(t, y)
,所以它不知道要向第三个参数提供什么。
我猜Mu
是vanderpoldemo
函数中的参数,您无需对其进行集成。因此,您可以做的是迭代Mu
的所有所需值并为其计算ode23s
,如下所示:
[t, Mu] = meshgrid(0:100:6000, 1:100:1000); %define your desired mesh (trade of between accuracy and computation time)
y = zeros(size(Mu)); % preallocate memory
y0 = [1; 1];
ode = @(t,y) vanderpoldemo(t,y,Mu);
% calculate the ode for all the mu values
for i=1:size(Mu, 1)
[~,y_i] = ode23s(ode, t(i, :), y0);
y(i, :) = y_i;
end
plot3(t,Mu,y)
xlabel('t')
ylabel('mu')
zlabel('y(t)')
请注意,我定义了t
所需的评估点,这样可以更容易地在3D中绘图。否则,对于t
的不同值,Mu
的抽样可能会有所不同。