在保持一些变量不变的同时最小化函数

时间:2014-06-12 13:24:33

标签: python minimize

我有一个

形式的功能
def tmp(x,n):
    R, s, a, T = x[0], x[1], x[2], x[3]

在经过长时间的计算后返回一个浮点数。

我需要最小化这个功能,为此我使用了scipy.optimize.minimize():

minimize(tmp,[0,0,3,60000], args=(n,),tol =1e-15)

上面的代码查找函数tmp()的最小值,其初始值如图所示。

现在我需要最小化相同的函数tmp,但保持变量R,T不受最小化影响,作为参数。换句话说,我希望函数写成:

def tmp(x,n,R,T):
        s, a = x[0], x[1]

如何在不编辑第一个函数的情况下创建上述函数?

3 个答案:

答案 0 :(得分:1)

默认情况下,它是不可能的。您需要为tmp(x,n,R,T)提供不同的名称。

但可以使用multimethod library

答案 1 :(得分:0)

不知道你的功能发生了什么,这使得测试很难... 你在哪里定义函数内的R,s,a和T ......

你不能写一个像:

这样的函数
def tmp(x,n,cons):
       if cons is False:#case 1
           R, s, a, T = x[0], x[1], x[2], x[3]
       elif cons is True:#case 2
           R=0 #change them if you want 
           T=60000
           s, a = x[0], x[1]
       #your calculations
       #...

比你必须记住(!)你的“最小化”必须看起来像第一种情况:

minimize(tmp,[0,0,3,60000], args=(n,cons),tol =1e-15)#where args is (2,False) for example

和案例2中的情况一样:

minimize(tmp,[0,3], args=(n,cons),tol =1e-15)#where args is (2,True)

答案 2 :(得分:0)

这是一个古老的问题,但是我遇到了这个问题并找到了替代解决方案。您可以定义一个“掩码”函数,该函数可用于重组标量函数的“馈送”向量。例如

import numpy as np
from scipy.optimize import minimize

def test_fun(x):
    return (x[0] - 1)**2 + (x[1] - 2)**2 + (x[2] - 3)**2

def mask_fun(x, x0, mask):
    x_re = np.zeros(len(mask))
    x_re[mask > 0] = x
    x_re[mask == 0] = x0
    return test_fun(x_re)

mask = np.array([1, 1, 1])  # ones to estimate, zero for known/apriori
x_est = np.array([1., 2., 3.])
x_in = x_est[mask > 0]
x_param = x_est[mask == 0]

minimize(mask_fun, x_in, args=(x_param, mask))