Ошибка при использовании lmfit v0_9_3
Я немного новичок в использовании python для анализа данных и в использовании lmfit для подбора нелинейных уравнений. Я пытаюсь смоделировать сложную полуаналитическую функцию, которая описывает движение струи загрязняющего вещества в одномерном канале с течением времени. Я использую lmfit v0.9.3. Я успешно работал с несколькими примерами из учебников lmfit, но не могу заставить свою собственную модель работать. Сценарий ниже, работает до tsm_mod.fit()
позвонить, но затем возвращает ошибку:
Файл "C:\Anaconda\lib\site-packages\lmfit\model.py", строка 501, в соответствии с p в params.values ()])
Ошибка типа: объект '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 8640 8756,244 8330,04 8988,696 9143,676 9337,392 9492,372 9724,86 9918,576 10034,784 10228,536 10383,516 10577,232 10770,948 11119,644 11003,4 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,31 025 2,125 028 2,12 0282 0282 0282 0281 0281 0282 0281 0262 0282 0282 0282 0282 0282 0281 026,125 2,138 2,138 0282,126 2,126 028 2,146 2,132 028 2,146 2,132 026 2,146 2,132 026 2,146 2,126 2,132 2,126 2,132 2,126 2,132 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,126 2,144 2,144 2,144 2,144 2,12 0282,20 2,144,126 2,02,144,32 0,121,125,02,132,12,032,30 У унатаются
1 ответ
Ваш пример немного сбивает с толку в том, что ваша функция модели содержит как независимую переменную t
и переменная x
и в своей основной программе ты называешь время x
, Во всяком случае, звонок, который вы хотите
tsm_fit = tsm_mod.fit(y, tsm_pars, t=x)
Подгонка, кажется, не работает хорошо, но это, кажется, отдельная проблема.