问题描述
我正在学习python和scipy。在我的自学过程中,我尝试使用scipy.optimize
来最小化以下功能> def opti_min(sr1_opt,sr3_opt):
> op = np.sqrt(np.sum(sr1_opt)+np.sum(sr3_opt))
> return op
opt = minimize(opti_min,strip,method = 'nelder-mead')
sr1_opt是一个列表:- [6.536055555554877e-07, 6.668262226847675e-07, 4.935691987513913e-07, 6.422222222223324e-07, 7.493249219562971e-07, 7.812500000001055e-07, 8.513020291362223e-07]
sr3_opt也是一个列表:- [4.127111433753003e-06,4.419413067362789e-06,4.721714700973233e-06]
strip也是用于初始值的列表: 条= [0.0025,0.005]
sr1_opt值计算为(实际值-strip [0])** 2和 列表中每个条目的sr3_opt值计算为(实际值-strip [1])** 2。
因此,所需的输出是将最小化变量“ op”的条带值
我得到的错误是: TypeError:opti_min()缺少1个必需的位置参数:“ sr3_opt”
我想念什么?
更重要的是,如果我希望带材的输出大于零,应该使用哪种方法进行约束最小化? 在此先感谢
解决方法
您可以在文档底部看到一个示例,该示例用于最小化页面底部的两个参数的功能... https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
在您的情况下,您将opti_min
视为二维变量strip
的函数:
values = [0.12,0.65,...] # whatever your values are
def opti_min(strip,values=values):
# get your lists of edited values
sr1_opt = [(value - strip[0])**2 for value in values]
sr3_opt = [(value - strip[1])**2 for value in values]
# perform your sum
return np.sqrt(np.sum(sr1_opt)+np.sum(sr3_opt))
# init your initial estimate
strip0 = np.array([0.0025,0.005])
res = minimize(opti_min,strip0,method='nelder-mead')
# print result
print(res.x)