首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用渐近、lambdify和scipy优化Python

使用渐近、lambdify和scipy优化Python
EN

Stack Overflow用户
提问于 2015-12-06 15:50:24
回答 1查看 3.5K关注 0票数 5

我正在尝试最大化由渐近定义的函数,但无法使其工作。它的基本思想可以概括如下:

代码语言:javascript
复制
    import sympy
    from scipy.optimize import minimize
    from sympy.utilities.lambdify import lambdify

    a,b,G = sympy.symbols('a b G')
    func = (G - a)**2 + b
    my_func = lambdify((G,a,b), -1*func)
    results = minimize(my_func,[0.1,0.1,0.1])

如果我定义了一个单变量函数,则代码可以工作,但只要我有多个变量,我就会收到以下错误消息。

代码语言:javascript
复制
    TypeError: <lambda>() takes exactly 3 arguments (1 given)

有人能帮我找出哪里出了问题吗?

EN

回答 1

Stack Overflow用户

发布于 2015-12-07 15:02:35

正如@Dair指出的那样,sympy的lambdify通常需要多个参数,而scipy只需要一个参数,一个包含每个变量的所有值的列表(或数组)。因为我的目标函数最方便地使用scipy来定义,所以我需要找到一种方法来绕过sympy和scipy的不兼容。

@lhcgeneva.指出the answer to a similar question。这个答案不能方便地处理大量的自变量,特别是当自变量的数量可以改变时,需要写出要重新定义的目标函数的“矢量化”版本。然而,受这篇文章的启发,我想出了使用*tuple()的解决方案:

代码语言:javascript
复制
    import sympy
    from scipy.optimize import minimize
    from sympy.utilities.lambdify import lambdify

    a,b,G = sympy.symbols('a b G')
    func = -1*((G - a)**2 + b)
    my_func = lambdify((G,a,b), func)

    def my_func_v(x):
        return my_func(*tuple(x))

    results = minimize(my_func_v,[0.1,0.1,0.1])

在我给出的例子中,似乎没有必要使用*tuple(),但是对于我想要解决的问题,它省去了很多麻烦。这里有一个更类似于我想要解决的问题的例子

代码语言:javascript
复制
NUM_VAR = 10
x = np.array(sympy.symbols('x0:%d'%NUM_VAR))
func = np.sum((x-1)**2)
my_func = lambdify(x, func)


def my_func_v(x):
    return my_func(*tuple(x))

results = minimize(my_func_v,np.zeros(NUM_VAR))

这个*tuple()方法可以让我不必像下面这样写出x的所有元素(对于NUM_VAR=10的情况):

代码语言:javascript
复制
def my_func_v(x):
    return my_func(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9])

而且,当NUM_VAR改变时,我们不需要改变my_func_v。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34115233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档