2016-03-11 8 views
1

Je souhaite définir les indicateurs de paramètre pour les modèles conservés dans un dictionnaire. J'ai créé une fonction qui est appelée pour définir les astuces. D'abord, un modèle primaire est créé et ensuite je veux créer différents modèles, identiques au primaire, mais avec des préfixes différents. La fonction set_hints accepte un paramètre comp qui définit quelles astuces seront définies. Ceci est une partie simplifiée de mon code:Affectation des indices de paramètre via une fonction dans LMFIT

import lmfit 

def foo (x, a): 
    return x + a 

def set_hints(mod, comp="2"): 
    mod.set_param_hint("a", value=1, vary=True) 

    if comp == "2": 
     mod.set_param_hint("a", value=0, vary=False) 

    return mod.param_hints 

m = lmfit.Model(foo) 
models = {} 

for i in range(2): 
    hints = set_hints(m, comp="2") 

    models["m%i" % i] = lmfit.Model(m.func, m.independent_vars, 
             prefix="m%i" %i, 
             param_names=m.param_names) 

for par in m.param_names: 
    models["m%i" % i].param_hints[par] = hints[par]  
# models["m%i" % i].param_hints = hints 

for key in models.keys(): 
    print key 
    print "value:" 
    print models[key].param_hints["a"]["value"] 
    print "vary:" 
    print models[key].param_hints["a"]["vary"] 

qui sort:

m0 
value: 
1 
vary: 
True 
m1 
value: 
0 
vary: 
False 

Ce qui ne fait pas de sens pour moi! Les indices value et vary doivent être respectivement 0 et False dans les deux cas. C'est comme à la deuxième itération de la boucle, la condition comp == "2" de la fonction set_hints n'est pas satisfaite pour la 1ère itération de la boucle et les astuces sont changées rétroactivement! Si je ne commente pas la ligne commentée et ne pas définir les conseils de façon itérative, le résultat est bon. Mais ce qui se passe maintenant, je le trouve complètement absurde. S'il vous plaît, aidez-moi à comprendre ce qui se passe!

Répondre

0

Le code semble très étrange, mais je suppose qu'il vient d'un plus grand design. Je pense que cela doit être un bug, même si je ne suis pas certain de ce que c'est. Je vais créer un problème sur le site lmfit github.

+0

Hay merci pour votre commentaire, En effet, il semble très étrange le code, puisque j'ai fait une version simplifiée de tout mon code. J'ai fait un script d'ajustement global qui adapte un nombre différent de composants en décomposition aux données de spectroscopie transitoire. C'est pourquoi j'ai besoin d'un mot-clé pour définir les indicateurs de paramètre en fonction du nombre de composants. Le code fonctionne bien maintenant (en utilisant la ligne commentée ci-dessus) et les résultats sont bons. C'est juste que ce problème a chamboulé ma tête pendant 2 jours d'affilée. – iasonas

+0

Btw J'ai vérifié le problème que vous avez soulevé chez github. Merci d'avoir simplifié mon code. J'étais si fatigué de penser à une version plus simple avant de la poster :) – iasonas

+0

Je crois que c'est maintenant fixé dans la dernière branche master sur github. –