【问题标题】:Minimizing a function while keeping some of the variables constant在保持一些变量不变的同时最小化一个函数
【发布时间】:2020-07-30 23:32:24
【问题描述】:

我有表格的功能

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]

如何在不编辑我的第一个函数的情况下创建像上面这样的函数?

【问题讨论】:

    标签: python minimize


    【解决方案1】:

    默认情况下这是不可能的。你需要给tmp(x,n,R,T) 一个不同的名字。

    这是可能的,使用multimethod library

    【讨论】:

    • 谢谢,我去看看多方法库。我试图避免将 tmp 重写为一个新函数,因为这意味着我将不得不复制许多代码块,这对我来说似乎毫无意义。
    • 您可以使用默认参数 def tmp(x,n,R=None,T=None):。根据RT 的值,您会以不同的方式进行操作。
    • 如果我这样做了,我将不得不更改第一个函数,并且我想同时保留它们..
    • 好吧,那就坚持多方法吧。
    【解决方案2】:

    不知道你的函数中发生了什么使得测试某些东西变得困难...... 你在函数内部哪里定义了 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)
    

    【讨论】:

    • 谢谢,这看起来更像我的想法。我在定义行之后的 tmp(x,n) 中定义了 R,s,a,T,如我的第一篇文章所示。希望这会奏效。抱歉,我不能在这里发布整个函数(一个 36x36 的微分方程系统),因为它是为我正在使用的客户服务的。
    【解决方案3】:

    这是一个老问题,但我遇到了这个问题并找到了替代解决方案。您可以定义一个“掩码”函数,您可以使用它来重新组装您的标量函数的“feed”向量。例如

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多