python 在保持某些变量不变的情况下最小化函数

rkkpypqq  于 2022-12-21  发布在  Python
关注(0)|答案(4)|浏览(112)

我有一个函数的形式

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]

怎么可能在不编辑我的第一个函数的情况下创建像上面这样的函数呢?

iq3niunx

iq3niunx1#

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

a2mppw5e

a2mppw5e2#

不知道函数中发生了什么会使测试变得困难......在函数中,您在哪里定义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)
pinkon5k

pinkon5k3#

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

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

oknwwptz4#

我发现这个问题的答案是使用lmfit,它允许您轻松地固定一些参数,同时最小化其他参数。

相关问题