2016-04-21 12 views
2

Ich bin etwas neu bei der Verwendung von Python für die Datenanalyse und die Verwendung von lmfit für die nichtlineare Gleichung Anpassung. Ich versuche, eine komplexe semi-analytische Funktion zu modellieren, die die Bewegung einer Schadstofffahne in einem 1D-Kanal über die Zeit beschreibt. Ich benutze lmfit v0.9.3. Ich habe erfolgreich einige Beispiele aus den lmfit Tutorials durchgearbeitet, aber ich kann mein eigenes Modell nicht funktionieren lassen. Das Skript unten, arbeitet bis zum tsm_mod.fit() Anruf, aber dann gibt den Fehler:Fehler bei der Verwendung von lmfit v0_9_3

File "C:\Anaconda\lib\site-packages\lmfit\model.py", line 501, in fit for p in params.values()])

TypeError: 'numpy.ndarray' object is not callable

Der Code ist unten:

import numpy as np 
import scipy as sp 
import pandas as pd 
from lmfit import Model 

desmedt = pd.read_table('Directory\desmedt_test.txt',sep='\t') 

x = desmedt['Times'] 
y = desmedt['Conc'] 

def tsm_intfunc(t,x,tau,u,k,alpha,beta,mass,ac): 
    return((mass/(2*ac*(t*np.pi*k)**(1/2)))*np.exp(-((x-u*t)**2)/(4*k*t))*np.exp(-alpha*tau-alpha*(t-tau)/beta) 
     *np.sqrt(beta*tau/(t-tau))*sp.special.iv(2*np.sqrt((alpha**2)*tau*(t-tau)/beta),1)) 

def tsm_desmedt(t,x,u,k,alpha,beta,mass,ac,nsteps): 
    dtau = t/nsteps 
    cxt = (mass/(2*ac*np.sqrt(t*np.pi*k)))*np.exp(-((x-u*t)**2)/(4*k*t))*np.exp(-alpha*t) 
    cxv = tsm_intfunc(t,x,0.00000001,u,k,alpha,beta,mass,ac)/2 
    i = 1 

    while (i<nsteps): 
     cxv = cxv+tsm_intfunc(t,x,dtau*i,u,k,alpha,beta,mass,ac)/2 
     i = i+1 

    return cxt+(alpha/beta)*cxv*dtau 

tsm_mod = Model(tsm_desmedt) 
tsm_mod.set_param_hint('ac',value=18.2,vary=False) 
tsm_mod.set_param_hint('alpha',value=1e-4) 
tsm_mod.set_param_hint('beta',value=1e-1) 
tsm_mod.set_param_hint('k',value=3) 
tsm_mod.set_param_hint('mass',value=157100,vary=False) 
tsm_mod.set_param_hint('nsteps',value=100,vary=False) 
tsm_mod.set_param_hint('u',value=0.4) 
tsm_mod.set_param_hint('x',value=4604,vary=False) 

tsm_pars = tsm_mod.make_params() 
tsm_fit = tsm_mod.fit(y,x,tsm_pars) 

Könnte dies ein Fehler in lmfit sein? Oder meinst du, es gibt einen Fehler in der Art, wie ich das Problem mit lmfit eingerichtet habe?

Edit: Die Daten in der Armatur verwendet wird unten angegeben:

Zeiten

7787.628 8330.04 8640 8756.244 8988.696 9143.676 9337.392 9492.372 9724.86 9918.576 10034.784 10228.536 10383.516 10577.232 10770.948 11003.4 11119.644 11313.36 11468.34 11700.792 11855.772 12010.752 12204.468 12359.448 12630.672 12824.388 13173.084 13483.044 13793.004 14412.924 14955.336 15575.256 16195.14 17357.472

Conc

0.00944669 0.0850202 0.236167 0.576248 1.00135 2.01215 2.84345 3.51417 4.53441 5.21457 5.59244 5.74359 5.88529 6.0081 5.75304 5.61134 5.20513 4.95007 4.41161 3.74089 3.46694 3.07962 2.80567 2.41835 2.1444 1.74764 1.47368 1.20918 0.935223 0.661269 0.406208 0.132254 0.11336 0.151147

+0

Können Sie die von Ihnen verwendeten Daten oder zumindest eine Teilmenge davon angeben? – Cleb

+0

Gemäß dem [docs online] (https://lmfit.github.io/lmfit-py/model.html#model.Model) erwartet 'Model.fit' die Übergabe von args data, params, weights, .. .; du hast es gegeben, das ist offensichtlich nicht richtig für mich. Insbesondere behandelt es dein 'x' als seine' params', von denen es erwartet, dass es ein 'Parameter'-Objekt ist. –

+0

Ich gehe einfach durch das, was ich im Web sehe - ich habe nie selbst py-lmfit benutzt - ich denke, vielleicht möchtest du etwas wie 'tsm_fit = tsm_mod.fit (y, tsm_pars, x = x)'. –

Antwort

0

Ihr Beispiel ist verwirrend leicht, dass dein Modell Funktion enthält sowohl eine unabhängige Variable t und eine Variable x, und in Ihrem Hauptprogramm rufen Sie die Zeiten x. Wie auch immer, der Anruf Sie wollen, ist

tsm_fit = tsm_mod.fit(y, tsm_pars, t=x) 

Die Passform auch nicht zu funktionieren scheint, aber das scheint ein anderes Thema zu sein.

+0

Ja, danke für die Eingabe. Ich hatte den Fehler in meinem Code erkannt und konnte ihn erfolgreich implementieren (siehe Kommentar oben). Das Modell weist jedoch Parameteridentifikationsprobleme auf, daher die schlechte Anpassung, wenn die ursprünglichen Parameterschätzungen weit von ihren optimalen Werten entfernt sind. Interessanterweise habe ich diesen Algorithmus auch in R implementiert und war in der Lage, eine bessere Anpassung (mit dem LMFit-Paket) mit Parameterwerten zu erreichen, die näher an dem liegen, was sie in kürzerer Zeit sein sollten als mit Python. Am interessantesten ist, dass Excel Solver die beste Schätzung der Parameterwerte liefert, aber keine Standardfehler melden kann. –

Verwandte Themen