2016-08-21 2 views
1

K est une grande matrice clairsemée et y est un vecteur. A un pas de temps particulier dt de t1 à t1+dt:ODE45: Donner des résultats différents de `expm` dans la matrice clairsemée

Method1: Les expm conduit à:

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

Method2:

Le ode45 donne:

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

où:

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

Les deux méthodes donnent des résultats différents pour les grandes matrices éparses. Quel est le bon?

+1

Avez-vous essayé de réduire la tolérance aux erreurs ou la taille de pas d'intégration de ode45? – AVK

+0

@AVK non je n'ai pas. Connaissez-vous la raison derrière? – kyle

+0

Eventuellement ode45 perd de la précision. Essayez de jouer avec les options d'intégration 'AbsTol',' RelTol' et 'MaxStep' – AVK

Répondre

0

Comme je l'ai mentionné ci-dessus, il n'y a aucun moyen de garantir à 100% l'exactitude des résultats du solveur d'odes. Mais vous pouvez:

  • définir manuellement la limite supérieure pour la taille de l'étape d'intégration; Essayez un solveur rigide (ode15s, ode23t etc.);
  • de fournir la matrice jacobienne ou le motif jacobien pour dy(y,K) afin d'améliorer la précision du solveur.

Voici un exemple de configuration manuellement la taille maximale de pas:

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 de Jacobian et Jpattern options. Notez que vous ne pouvez pas les utiliser avec ode45, vous devez utiliser un autre solveur.