2014-12-08 61 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

相关问题