对于使用python进行数据分析,以及使用lmfit进行非线性方程拟合,我还是比较陌生的。我试图建立一个复杂的半解析函数来描述污染物羽流在一维通道中随时间的运动。我用的是lmfit v0.9.3。我已经成功地完成了lmfit教程中的几个例子,但似乎无法让我自己的模型正常工作。下面的脚本将处理到tsm_mod.fit()调用,但随后返回错误:
文件"C:\Anaconda\lib\site-packages\lmfit\model.py",第501行,适合params.values()中的p) TypeError:“numpy.ndarray”对象不可调用
守则如下:
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)这可能是在lmfit的窃听器吗?或者,您认为我使用lmfit设置问题的方式有错误吗?
编辑:在拟合中使用的数据如下:
《时代》
7787.628 8330.04 8640 8756.244 8988.696 9337.392 9492.372 9724.86 10034.784 10228.536 10383.516 10577.232 10777.232 10777.232 10777.232 10177.232 11003.4 11119.644 11313.36 11468.34 11700.792 11855.772 120152 12204.468 12359.448 12630.672 12824.388 13173.084 13483.004 13412.924 14412.924 14955.336 15575.256 165.14 17357.472
康克
0.00944669 0.0850202 0.236167 0.576248 1.00135 2.01215 2.84345 3.51417 4.53441 5.21457 5.74359 5.88529 6.0081 5.755.61134 5.20513 4.95007 4.41161 3.74089 3.46694 3.07962 2.80567 2.41835 2.1444 1.74764 1.47681.20918 0.935223 0.6612690.406208 0.132254 0.11336 0.151147
发布于 2016-04-30 19:35:08
您的示例有点混乱,因为您的模型函数同时包含一个独立变量t和一个变量x,并且在您的主程序中您调用了times x。不管怎样,你想要的电话是
tsm_fit = tsm_mod.fit(y, tsm_pars, t=x)这似乎不太合适,但这似乎是另一个问题。
https://stackoverflow.com/questions/36773892
复制相似问题