如何使用scipy.optimize.minimize

时间:2015-05-09 03:19:40

标签: python numpy scipy

我有一个客观的功能,比如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

但显然,这就是我想要的。 那么有人可以告诉我如何做到这种最小化吗?感谢

2 个答案:

答案 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
相关问题