我有一个客观的功能,比如obj(x, arg_1, arg_2)
在f()
内,variable_3 = f(x, arg_1, arg_2)
obj()
将返回abs(x-variable_3)
我需要使用obj()
scipy.optimize.minimize
的返回值
我想我需要这样做:
def obj(x, arg_1, arg_2)
v_3 = f(x, arg_1, arg_2)
return abs(x-v_3)
x0 = 1
result = minimize(obj, x0, args = (arg_1, arg_2))
这是对的吗?为什么我会得到错误?
或者,实际上我可以这样做:
def obj(x, v_3)
return abs(x-v_3)
def myfun(arg_1, arg_2)
x0 = 1
v_3 = f(x0, arg_1, arg_2)
result = minimize(obj, x0, args = v_3)
return result
但显然,这就是我想要的。 那么有人可以告诉我如何做到这种最小化吗?感谢
答案 0 :(得分:2)
希望它不会引起一些IP问题,引用答案的基本部分: 来自@ lmjohns3,Structure of inputs to scipy minimize function “默认情况下,scipy.optimize.minimize接受一个函数fun(x)接受一个参数x(可能是一个数组等)并返回一个标量.scipy.optimize.minimize然后找到一个参数值xp这样有趣对于x的其他值,(xp)小于fun(x)。优化器负责创建x的值并将它们传递给fun进行评估。
但是,如果你碰巧有一个函数fun(x,y),它有一些额外的参数y需要单独传递(但是为了优化的目的被认为是常数)会怎么样?这就是args元组的用途。该文档试图解释如何使用args元组 实际上,scipy.optimize.minimize将使用星号参数表示法将args中的任何内容传递给fun的其余部分:然后在优化期间将该函数称为fun(x,* args)。 x部分由优化器传入,args元组作为剩余参数给出。“
答案 1 :(得分:0)
对于scipy.optimize.minimize,应该将多个参数打包到一个元组中,然后在数值优化期间由目标函数解包。
看起来应该是这样的:
def obj(arguments)
"""objective function, to be solved."""
x, arg_1, arg_2 = arguments[0], arguments[1], arguments[2]
v_3 = f(x, arg_1, arg_2)
return abs(x-v_3)
x0 = 1
initial_guess = [1,1,1] # initial guess can be anything
result = minimize(obj, initial_guess)
print result.x