2010-08-31 3 views
4

Je rencontre des problèmes lorsque je compare les résultats de différentes exécutions de mon logiciel Matlab avec la même entrée. Pour réduire le problème, je l'ai fait ce qui suit:Problèmes numériques dans Matlab: même entrée, même code -> sortie différente?

  • enregistrer toutes les variables pertinentes en utilisant la méthode
  • appel d'une méthode save() Matlab qui calcule quelque chose
  • enregistrer toutes les variables de sortie pertinentes à l'aide de nouveau save()

Sans changer la méthode appelée, je l'ai fait une autre course avec

  • charge les variables enregistrées Abov e et comparer avec les variables d'entrée courantes en utilisant isequal()
  • appeler à nouveau ma méthode avec les variables d'entrée en cours
  • charger les variables out enregistrées ci-dessus et comparer.

Je ne peux pas croire que la comparaison dans la dernière "ligne" détecte de légères différences. Les calculs comprennent des nombres simples et doubles de précision, l'erreur est de l'ordre de 1e-10 (la sortie est un nombre double). La seule explication possible que je puisse imaginer est que Matlab perde de la précision lors de l'enregistrement des variables (ce que je considère très improbable, j'utilise le format binaire Matlab par défaut) ou qu'il y a des calculs comme a = b + c + d, qui peut être calculé comme = (b + c) + d ou a = b + (c + d), ce qui pourrait conduire à des différences numériques. Savez-vous quelle pourrait être la raison des observations décrites ci-dessus?

Merci beaucoup!

+0

Pourriez-vous fournir un exemple minimal pour cela? Cela peut dépendre fortement des fonctions que vous utilisez. Les différences sont courantes si une fonction du chemin utilise un caractère aléatoire. Ce n'est probablement pas le cas, mais un exemple reproductible donnerait encore quelque chose aux autres. –

+0

Malheureusement, la méthode que j'appelle implique de nombreuses étapes de calcul et même du code que je ne peux pas partager. Je me demandais simplement si ce comportement est "comportement Matlab valide" ou s'il pointe vers un problème dans mon code. Il y a quelques appels de randn() impliqués, mais le RandStream est placé avant chaque exécution, donc il produit la même valeur. Et il semble que, après avoir éliminé les chiffres de précision unique du code élimine l'apparence du problème (ou le rend moins probable ??) – Philipp

+2

Ceci est un comportement très inattendu de MATLAB.Est-il possible que la différence se produise lorsque vous sauvegardez vos variables? Vous dites que vous chargez les variables et comparez - qu'en est-il de sauvegarder les résultats des deux exécutions et de comparer ces résultats enregistrés? –

Répondre

1

il semble vraiment être causé par le mélange simple/double dans les calculs. Depuis que je suis passé en double précision, le problème ne s'est plus produit. Merci à tous pour vos pensées.

0

ces erreurs pourraient être arrondies. vous pouvez trouver la précision en virgule flottante de votre système comme ceci:

>> eps('single') 

ans = 

    1.1921e-07 

Sur mon système ce rapports 10^-7 qui expliquerait les écarts de votre commande

+2

mais ne devrait pas arrondir toujours retourner la même valeur? Ou cela dépend-il de facteurs "indéterministes"? – Philipp

0

Pour obtenir des résultats reproductibles, en particulier si vous utilisez toutes les fonctions de génération aléatoire (directement ou indirectement), vous devez restaurer le même état au début de chaque course:

%# save state (do this once) 
defaultStream = RandStream.getDefaultStream; 
savedState = defaultStream.State; 
save rndStream.mat savedState 

%# load state (do this at before each run) 
load rndStream.mat savedState 
defaultStream = RandStream.getDefaultStream(); 
defaultStream.State = savedState; 
+0

Je fais stream0 = RandStream ('mrg32k3a', 'Seed', myConstantSeed); RandStream.setDefaultStream (stream0); avant chaque course. Cela devrait fonctionner aussi, n'est-ce pas? – Philipp

+0

Oui c'est la même chose, n'utilisant qu'une graine pour initialiser l'état. – Amro

+0

La seule chose à laquelle je peux penser, c'est d'essayer de comparer les résultats de deux runs sauvegardés (dans le cas où save/load introduit une perte de précision) comme le suggère @AlexFeinman dans les commentaires ci-dessus. – Amro

Questions connexes