Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在保持某些变量不变的情况下最小化函数_Python_Minimize - Fatal编程技术网

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

Python 在保持某些变量不变的情况下最小化函数,python,minimize,Python,Minimize,我有一个函数的形式 def tmp(x,n): R, s, a, T = x[0], x[1], x[2], x[3] 经过长时间的计算后,返回一个浮点值 我需要最小化此函数,为此我使用了scipy.optimize.minimize() 上面的代码查找函数tmp()的最小值,起始值如图所示 现在我需要最小化同一个函数tmp,但是保持变量R,T不最小化,作为参数。换句话说,我希望函数的编写方式如下: def tmp(x,n,R,T): s, a = x[0], x[1]

我有一个函数的形式

def tmp(x,n):
    R, s, a, T = x[0], x[1], x[2], x[3]
经过长时间的计算后,返回一个浮点值

我需要最小化此函数,为此我使用了scipy.optimize.minimize()

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

现在我需要最小化同一个函数tmp,但是保持变量R,T不最小化,作为参数。换句话说,我希望函数的编写方式如下:

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

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

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


但也有可能,使用

不知道函数中发生了什么,这会使测试某些内容变得困难。。。 在函数中,在哪里定义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)

这是一个老问题,但我遇到了这个问题并找到了另一个解决方案。您可以定义一个“mask”函数,用于重新组合标量函数的“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))

谢谢,我来看看多方法库。我试图避免将tmp重写为新函数,因为这意味着我必须复制许多代码块,这对我来说似乎毫无意义。您可以使用默认参数def
tmp(x,n,R=None,T=None):
。根据
R
T
的值,您可以进行不同的操作。如果我这样做,我将不得不更改第一个函数,并且我希望保留这两个函数。好的,然后继续使用多方法。谢谢,这看起来更像我的想法。我在tmp(x,n)中定义了R,s,a,T,就在定义行之后,如我的第一篇文章所示。希望这能奏效。很抱歉,我不能在这里发布整个函数(一个36x36的微分方程系统),因为它是为我的客户工作的。
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))