在python中使用最小化lmfit时出现混淆错误

时间:2018-04-15 18:34:10

标签: python-3.5 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:\ new model \ calculate_H_v2.py",第50行,in     out =最小化(fith,params,args =(n1,n2,n,h))   文件" E:\ softwares \ python \ lib \ site-packages \ scipy \ optimize_minimize.py",第481行,最小化     return _minimize_bfgs(fun,x0,args,jac,callback,** options)   文件" E:\ softwares \ python \ lib \ site-packages \ scipy \ optimize \ optimize.py",第943行,在_minimize_bfgs中     gfk = myfprime(x0)   在function_wrapper中的文件" E:\ softwares \ python \ lib \ site-packages \ scipy \ optimize \ optimize.py",第292行     返回函数((wrapper_args + 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))   在function_wrapper中的文件" E:\ softwares \ python \ lib \ site-packages \ scipy \ optimize \ optimize.py",第292行     返回函数(*(wrapper_args + args))   文件" E:\ new model \ calculate_H_v2.py",第35行,在fith中     a1 =参数[' p1'] IndexError:只有整数,切片(:),省略号(...),numpy.newaxis(None)和整数或布尔数组才是有效索引

我无法弄清楚为什么在阅读完问题之后我会遇到这种错误。你能救我一下吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

即使用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数组。