2017-07-15 1 views
0

J'ai deux fonctions dont la distance (y_1-y_2) doit être minimisée afin d'obtenir le meilleur facteur entre les deux (dfactor), donc je peux les tracer ensemble et les ajuster au mieux. La différence avec les exemples de la documentation est que, dans ce cas, j'ai n points où je peux calculer la différence et ainsi j'ai des fonctions n pour minimiser. Avec scipy.optimize.minimize_scalar J'utilise la syntaxe suivante:Minimiser n fonctions

def chi(dfactor): 
    for i in range(0, n): 
     return abs(dfactor*y_1[i] - y_2[i]) 

res = minimize_scalar(chi) 
print res.x 

Maintenant res.x n'est pas le facteur qui correspond le mieux à deux parcelles. Je m'attendrais à obtenir un tableau de n éléments, très similaires entre eux où je peux obtenir un seul dfactor dont j'ai besoin. Mais je ne suis pas sûr minimize_scalar fonctionne comme ça.

Cochez desired result, où je calcule la différence entre les points rouges et le point correspondant dans le tracé bleu (représenté ici comme des lignes car il s'agit d'un spectre) pour les superposer le mieux possible.

Répondre

0

Vous ne pouvez pas avoir plusieurs instructions de retour dans une seule fonction, seule la première sera appelée. Au lieu de cela, vous devez renvoyer un certain nombre d'erreurs, telles que l'erreur de racine des moyennes:

# Convert to numpy arrays 
y_1 = np.asarray(y_1) 
y_2 = np.asarray(y_2) 

def chi(dfactor): 
    residual = dfactor * y_1 - y_2 
    return np.mean(residual ** 2) 

res = minimize_scalar(chi) 
print res.x 
+0

Je devrais donc appeler la fonction dans une boucle _outside_ la fonction. Ensuite, j'aurais besoin de quelque chose comme 'chi (y1, y2, dfactor)', mais dans ce cas comment utiliser la fonction 'minimize_scalar'? – cwasdwa

+0

Non, tant que vous voulez trouver un seul 'dfactor', mon code devrait fonctionner * tel quel * pour vous. –

+0

Je reçois un 'TypeError: ne peut pas multiplier la séquence par un non-int de type 'float', puisque' y_1' et 'y_2' sont des listes de n éléments. – cwasdwa