2016-08-21 31 views
1

K是一個大型稀疏矩陣,y是一個向量。在一個特定的時間步長dtt1t1+dtODE45:在稀疏矩陣中給出與`expm`不同的結果

方法一: 的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 

其中:

function ydot = dy(y,K) 
ydot = -1i*K*y; 

這兩種方法給出了大型稀疏矩陣的不同結果。哪一個是正確的?

+1

您是否試圖降低ode45的容錯或集成步長? – AVK

+0

@AVK不,我沒有。你知道背後的原因嗎? – kyle

+0

可能ode45失去精確度。嘗試玩'AbsTol','RelTol'和'MaxStep'整合選項 – AVK

回答

0

正如我上面提到的,沒有辦法100%保證頌歌求解器結果的正確性。但您可以:

  • 手動設置積分步長的上限;
  • 嘗試使用 僵硬的求解器(ode15s,ode23t等);
  • 提供雅可比矩陣或 雅可比矩陣dy(y,K)以提高求解器的精度。

這裏是手動設定最大步長的例子:

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

JacobianJpattern選項Here is the description。請注意,您不能將它們與ode45一起使用,您應該使用另一個求解器