使用lmfit v0_9_3时出错

2024-05-14 15:13:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我对使用python进行数据分析和使用lmfit进行非线性方程拟合有点陌生。我试图建立一个复杂的半解析函数模型,描述污染物羽流在一维通道中随时间的运动。我用的是lmfitv0.9.3。我已经成功地完成了lmfit教程中的几个示例,但似乎无法使我自己的模型正常工作。下面的脚本直到tsm_mod.fit()调用,但随后返回错误:

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

代码如下:

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设置问题的方式有错误吗?在

编辑: 拟合中使用的数据如下:

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

浓度

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


Tags: alphamodparamvaluenpacmassbeta
1条回答
网友
1楼 · 发布于 2024-05-14 15:13:15

您的示例有点令人困惑,因为您的模型函数既包含独立变量t和变量{},并且在主程序中调用timesx。不管怎样,你想要的电话是

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

这种方法似乎效果不佳,但这似乎是另一个问题。在

相关问题 更多 >

    热门问题