我的代码如下:
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.optimize
import *
,然后从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 数组的过程。