在 Python 中使用 LMFIT 最小化时出现令人困惑的错误



我的代码如下:

import numpy as np
from math import *
from scipy.optimize import *
import scipy.optimize as opt
from lmfit import Minimizer, Parameters, report_fit
import lmfit as lf
f = open('data.txt','r')
lines=f.readlines()   
n1=[]
n2=[]
n=[]
h=[]
for x in lines:
x=x.strip() # remove n before splitting the line
n1.append(x.split('t')[0])
n2.append(x.split('t')[1])
n.append(x.split('t')[2])
h.append(x.split('t')[3])
f.close()
n1 = [float(i) for i in n1]
n2 = [float(i) for i in n2]
n = [float(i) for i in n]
h = [float(i) for i in h]
# convert a list into an array
n1 = np.array(n1)
n2 = np.array(n2)
n = np.array(n)
h = np.array(h)
def fith(params,n1,n2,n,h):
a1 = params['p1']
b1 = params['p2']
a2 = params['p3']
b2 = params['p4']
model = (a1 + b1*n) * n1 + (a2 + b2*n) * n2
return model - h
params = Parameters()
params.add('p1',value=1.0)
params.add('p2',value=1.0)
params.add('p3',value=1.0)
params.add('p4',value=1.0)
out = minimize(fith,params,args=(n1,n2,n,h))
print(out)

运行后,我收到如下错误:

#

回溯(最近一次调用): 文件 "E:ew model\calculate_H_v2.py",第 50 行,在 out = minimize(fith,params,args=(n1,n2,n,h)) 文件 "E:\softwares\python\lib\site-packages\scipy\optimize_minimize.py",第 481 行,最小化 返回_minimize_bfgs(乐趣,x0,参数,jac,回调,**选项) 文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 943 行,_minimize_bfgs gfk = myfprime(x0) 文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 292 行,function_wrapper 返回函数((wrapper_args + 参数)) 文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 703 行,approx_fprime return _approx_fprime_helper(xk, f, epsilon, args=args) 文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 637 行,_approx_fprime_helper f0 = f(((xk,) + args)) 文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 292 行,function_wrapper 返回函数(*(wrapper_args + 参数)) 文件 "E:ew model\calculate_H_v2.py",第 35 行,第五行 a1 = 参数['p1'] 索引错误:只有整数、切片 (:)、省略号 (...)、numpy.newaxis (None) 和整数或布尔数组是有效的索引

#

我无法弄清楚为什么在阅读问题后会出现这种错误。你能帮我吗?

提前谢谢。

我认为基本问题是您使用的是scipy.optimize.minimize()而不是lmfit.minimize()。 也就是说,您从scipy.optimizeimport *,然后从lmfit导入Minimizer

即使用from lmfit import minimize, Parameters, report_fit或使用

mini = Minimizer(fith,params,args=(n1,n2,n,h))
out = mini.minimize()

应该让你的脚本使用lmfit.minimize()在我看来它应该可以工作。

这就是为什么import *是痛苦的:你很难分辨符号来自哪里。

作为附带注释,您可能可以使用numpy.loadtxt()来简化将数据读取到 numpy 数组的过程。

最新更新