2016-08-21 33 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一起使用,您应该使用另一个求解器