Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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/0/performance/5.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 scipy.optimize.minimize与矩阵约束_Python_Scipy_Constraints_Mathematical Optimization_Minimize - Fatal编程技术网

Python scipy.optimize.minimize与矩阵约束

Python scipy.optimize.minimize与矩阵约束,python,scipy,constraints,mathematical-optimization,minimize,Python,Scipy,Constraints,Mathematical Optimization,Minimize,我不熟悉scipy.optimize模块。我使用它的最小化函数试图找到一个x来最小化一个多元函数,它接受矩阵输入,但返回一个标量值。我有一个等式约束和一个不等式约束,都接受向量输入和返回向量值。特别是,以下是限制条件列表: sum(x) = 1 ; AST + np.log2(x) >= 0 其中AST只是一个参数。我将约束函数定义如下: 对于相等约束:lambda x:sumx-1 对于不等式约束: def asset_cons(x): #global AST

我不熟悉scipy.optimize模块。我使用它的最小化函数试图找到一个x来最小化一个多元函数,它接受矩阵输入,但返回一个标量值。我有一个等式约束和一个不等式约束,都接受向量输入和返回向量值。特别是,以下是限制条件列表:

sum(x) = 1 ;

AST + np.log2(x) >= 0
其中AST只是一个参数。我将约束函数定义如下:

对于相等约束:lambda x:sumx-1

对于不等式约束:

def asset_cons(x):

      #global AST

      if np.logical_and.reduce( (AST + np.log2(x)) >= 0):
        return 0.01
      else:
        return -1   
然后我打电话

cons = ({'type':'eq', 'fun': lambda x: sum(x) - 1},

            {'type':'ineq', 'fun': asset_cons})

res = optimize.minize(test_obj, [0.2, 0.8], constraints = cons)
但我仍然有错误抱怨我的约束函数。是允许为约束函数返回向量值,还是必须返回标量才能使用此最小化函数


有人能帮我看看我指定约束的方式是否有问题吗

原则上,这看起来一点也不错。然而,如果没有看到关于test_obj和实际错误的信息,就有点难说了。它是否抛出了一个提示编程错误的异常,或者抱怨了提示数学挑战的收敛性

你的基本想法是正确的;您需要有一个函数来接受一个包含N个元素的输入向量,并返回要最小化的值。边界条件还应接受相同的输入向量,并返回单个标量作为其输出

在我看来,你的边界条件有问题。第一个sumx-1很好,但是第二个在数学上很有挑战性,因为您已经将其定义为一个逐步函数。许多优化算法都希望具有连续函数,且具有较好的平滑特性。我不知道这个函数使用的算法是否能很好地处理逐步函数,所以这只是一个猜测

如果上述情况成立,您可以通过以下方式使事情变得更简单:

np.amin(AST + np.log2(x))
如果所有AST+log2x[n]>=0,则该函数将为非负函数。这仍然不是非常顺利,但如果这是一个问题,它很容易改善。现在它也可以装进一个lambda了


如果您在收敛方面有困难,您可能应该同时尝试COBYLA和SLSQP,除非您已经知道其中一种更适合您的问题。

请发布准确的错误和资产成本代码,可能会重现问题。