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
Können Sie die von Ihnen verwendeten Daten oder zumindest eine Teilmenge davon angeben? – Cleb
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. –
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)'. –