2016-08-21 4 views
1

Kは大きな疎行列であり、yはベクトルです。ODE45:疎な行列で `expm`と異なる結果を返します

方法1:: expmはにつながる:

K = ... 
y = ...  
y = expm(-1i*dt*K)*y; %new y 

方法2:

ode45ができます:

K = ... 
y = ... 
y0 = y; 
[T, Y] = ode45(@(t,y)dy(y,K),[t1 t1+dt],y0); 
y = Y(end,:).'; %new y 

t1から t1+dtに特定のタイムステップ dt
function ydot = dy(y,K) 
ydot = -1i*K*y; 

この2つの方法は、大きなスパース行列に対して異なる結果をもたらします。正しいのはどれですか?

+1

ode45の誤差許容度または積分ステップサイズを減らそうとしましたか? – AVK

+0

@AVKいいえ、私はしませんでした。あなたはその理由を知っていますか? – kyle

+0

おそらくode45は精度を失います。 'AbsTol'、' RelTol'と 'MaxStep'統合オプションを試してみてください – AVK

答えて

0

上記のように、オードソルバー結果の正確性を100%保証する方法はありません。しかし、あなたは:

  • 手動で統合ステップサイズの上限を設定することができます。
  • スティッフソルバー(ode15s、ode23tなど)を試してみてください。
  • ソルバの精度を向上させるために、ヤコビ行列または ヤコビアンパターンをdy(y,K)に入力してください。 JacobianJpatternオプションの

    options= odeset('MaxStep',1e-3); % some experimentally obtained value here 
    [T, Y] = ode45(@(t,y)dy(y,K),[t1 t1+dt],y0,options); 
    

    Here is the description:ここ


手動最大ステップサイズを設定する例です。 ode45でそれらを使用することはできません。別のソルバーを使用する必要があります。