2014-12-08 87 views
0

我試圖通過使用RK2和RK4的方法來解決matlab中的Lorenz系統。我有一個腳本的兩種方法,現在的問題是如何能夠收斂到以下簡單的列向量:如何在matlab中創建一個函數數組?

y(1) = @(t,y) 10*(y(2)-y(1)); 
y(2) = @(t,y) y(1)*(28-y(3))-y(2); 
y(3) = @(t,y) y(1)*y(2)-8*y(3)/3; 

只是一個列向量y。

這是我所期待的,它從來沒有工作過:

y = zeros(3,1); 
y(1) = @(t,y) 10*(y(2)-y(1)); 
y(2) = @(t,y) y(1)*(28-y(3))-y(2); 
y(3) = @(t,y) y(1)*y(2)-8*y(3)/3; 

和下面是我的RK2功能。我的RK4與這個RK2很相似,但這可以幫助你理解爲什麼我真的需要一個函數向量。

function y = RK2(fcn,lrange,urange,step,init) 
%fcn = vector of functions 
%lrange = lower bound 
%urange = upper bound 
%step = number of steps 
%init = initial value 

row = size(fcn,1); 
stepsize = (urange-lrange)/step; 
y = zeros(row,step); 
%initializing vector of y 
y(:,1) = init; 
%initial condition 
t = zeros(1,step+1); 
%initializing vector of t 

if row ~= size(init,1) 
    disp('number of functions and number of initial values do not match'); 
end 

for n = 1:step 

    t(n) = (n-1)*stepsize; 
    t(step+1) = urange; 
    y1 = stepsize.*fcn(t(n),y(:,n)); 
    y2 = stepsize.*fcn(t(n) + stepsize/2, y(:,n) + y1./2); 
    y(:,n+1) = y(:,n) + y2; 

end 

感謝亞勒這麼多!!!!!!!!!

回答

1

這應該工作,才使函數輸出向量:

y = @(t,y) [10*(y(2)-y(1)), y(1)*(28-y(3))-y(2), y(1)*y(2)-8*y(3)/3]; 
y(1,[1;2;3]) 
size(y(1,[1;2;3])) 
+0

您好,感謝您回答我的問題。我只是嘗試了你的回答,看起來它確實使我的功能成爲一個向量。問題是當我嘗試計算這個向量的行數時,它會發出1或「維度參數必須是索引範圍內的正整數標量」。你知道如何解決這個問題嗎?或者如何計算這個向量中的行數,如果我使它成爲一個行向量。非常感謝! – 2014-12-08 01:11:03

+0

'size(y(1,[1; 2; 3]))'不起作用? – David 2014-12-08 01:13:39

+0

嘗試用逗號替換數組中的分號以使行向量不是列向量。 – David 2014-12-08 01:14:51

相關問題