1

RK2とRK4の方法を使用して、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
4

2 に答える 2

2

これは機能するはずです。関数の出力をベクトルにするだけです。

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]))
于 2014-12-08T00:42:18.623 に答える