2010-10-19 9 views

Respuesta

12

Aquí está la guarnición de decaimiento exponencial que llegué a trabajar con esto:

import numpy as np 
from scipy.optimize import leastsq 

def f(var,xs): 
    return var[0]*np.exp(-var[1]*xs)+var[2] 

def func(var, xs, ys): 
    return f(var,xs) - ys 

def dfunc(var,xs,ys): 
    v = np.exp(-var[1]*xs) 
    return [v,-var[0]*xs*v,np.ones(len(xs))] 

xs = np.linspace(0,4,50) 
ys = f([2.5,1.3,0.5],xs) 
yn = ys + 0.2*np.random.normal(size=len(xs)) 
fit = leastsq(func,[10,10,10],args=(xs,yn),Dfun=dfunc,col_deriv=1) 

Si quería utilizar col_deriv=0, creo que tendría que tomar básicamente la transpuesta de lo vuelvo con dfunc. Sin embargo, tienes razón: la documentación sobre esto no es tan buena.

+0

Funciona, pero irónicamente todavía falla en el ejemplo de mi pregunta anterior: P bien, probablemente debería elegir otro método –

+2

porque p0 tenía el signo equivocado ... – tillsten

+0

Sí, como dijo tillsten. Básicamente, es la diferencia entre la adaptación para el decaimiento exponencial y el crecimiento exponencial. Esa es una gran diferencia. Creo que tendrás que probar algún otro método que use la segunda derivada para tener una oportunidad de resolver cuando adivines el signo incorrecto para comenzar. Podría necesitar un término de impulso adicional de algo así también. –

Cuestiones relacionadas