2017-05-06 203 views
0

我想在3D繪製範德波爾方程的解:如何3D繪圖範德波爾方程在MATLAB

  • tx
  • muy軸;
  • y(t) as z axis。

我使用ode23s來解決方程式。

我的二維碼是:

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)') 

但這代碼沒有工作,所以我試圖把穆如像這樣的論點:

ode = @(t,y,Mu) vanderpoldemo(t,y,Mu) 
[t,y,Mu] = ode23s(ode, tspan, y0); 
%error : Not enough input arguments 

但它也沒有工作。

回答

0

您的第一種方法可能不正確,因爲您的vanderpoldemo函數未對其Mu輸入執行矢量化評估。

第二種方法是不正確的,因爲ode23s解決了y' = f(t, y),所以它不知道要提供給第三個參數。

我猜Muvanderpoldemo函數中的一個參數,你不需要整合它。所以,你可以做的是疊代的Mu所有需要的值,並計算ode23s它如下:我定義的t所需的評估點

[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)') 

注意,這使得它更容易在3D繪製。否則,對於Mu的不同值,t的採樣可能不同。

+0

我不知道是不是因爲我使用了Jupyter,但我仍然有錯誤「矩陣的連接維度不一致」。在「ode23」之後。 我認爲這是因爲't(i,:)'是'0 100 200 .... 6000',在ode23中需要的參數可能是'0 100'。所以我嘗試了一次迭代 'ode = @(t,y)vanderpoldemo(t,y,1); [t,y_i] = ode23s(ode,tspan,y0); y(1,:) = y_i;' 現在,我收到錯誤「訂單分配維度不匹配」。 – Hanabi

+0

基於[matlab文檔](https://nl.mathworks.com/help/matlab/ref/ode23s.html#inputarg_tspan),您應該能夠指定所有的中間點。我不知道Jupyter,也許你可以查看它的文檔。 – m7913d