2012-04-20 25 views
12

Estoy escribiendo un programa en Python que se adaptará a formas gaussianas y lorentzianas a algunos datos de resonancia dados. Originalmente comencé a usar scipy.optimize.leastsq pero cambié a usar optimize.curve_fit después de tener dificultades para recuperar los errores en los parámetros optimizados de la matriz de covarianza.Pasando argumentos adicionales usando scipy.optimize.curve_fit?

he definido una función para adaptarse a una suma de Gauss y de Lorentz:

def mix(x,*p): 
    ng = numg 
    p1 = p[:3*ng] 
    p2 = p[3*ng:] 
    a = sumarray(gaussian(x,p1),lorentzian(x,p2)) 
    return a 

donde p es una matriz de las aproximaciones iniciales en los parámetros de ajuste. Aquí es la instancia donde se le llama usando curve_fit:

leastsq,covar = opt.curve_fit(mix,energy,intensity,inputtot) 

Por el momento numg (el número de formas de Gauss) es una variable global. ¿Hay alguna manera de que se pueda incorporar en curve_fit como un argumento extra en su lugar, como se puede hacer con leastsq?

Respuesta

17

La gran cosa acerca de Python es que puede definir las funciones que devuelven otras funciones, intento currificación:

def make_mix(numg): 
    def mix(x, *p): 
     ng = numg 
     p1 = p[:3*ng] 
     p2 = p[3*ng:] 
     a = sumarray(gaussian(x,p1),lorentzian(x,p2)) 
     return a 
    return mix 

y luego

leastsq, covar = opt.curve_fit(make_mix(numg),energy,intensity,inputtot) 
+0

Gracias tanto! Funcionó perfectamente –

Cuestiones relacionadas