Python 尝试使用scipy使用jacobian最小化函数时出现错误消息

Python 尝试使用scipy使用jacobian最小化函数时出现错误消息,python,optimization,scipy,Python,Optimization,Scipy,使用Python3.6,我试图使用scipy.optimize.minimize最小化函数。我的最小化问题作为两个约束,我可以找到一个解决方案。到目前为止,我有以下几点: import numpy as np from scipy.optimize import minimize array = np.array([[3.0, 0.25, 0.75], [0.1, 0.65, 2.50], [0.80, 2.5, 1.20

使用Python3.6,我试图使用
scipy.optimize.minimize
最小化函数。我的最小化问题作为两个约束,我可以找到一个解决方案。到目前为止,我有以下几点:

import numpy as np
from scipy.optimize import minimize

array = np.array([[3.0, 0.25, 0.75],
                  [0.1, 0.65, 2.50],
                  [0.80, 2.5, 1.20],
                  [0.0, 0.25, 0.15],
                  [1.2, 2.40, 3.60]])

matrix = np.array([[1.0, 1.5, -2.],
                   [0.5, 3.0, 2.5],
                   [1.0, 0.25, 0.75]])


def fct1(x):
    return -sum(x.dot(array.T))


def fct2(x):
    return x.dot(matrix).dot(x)

x0 = np.ones(3) / 3
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1.0},
        {'type': 'eq', 'fun': lambda x: fct2(x) - tgt})

tgt = 0.15

w = minimize(fct1, x0, method='SLSQP', constraints=cons)['x']
res1 = fct1(w)
res2 = fct2(w)
def fct1_deriv(x):
    return -sum(np.ones_like(x).dot(array.T))

w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x']
我现在正试图让我的优化器运行得更快,因为这只是一个简化的问题。最后,我的数组和矩阵要大得多。在前面的问题中,有人提出了定义要优化的函数的雅可比矩阵的想法,因此我添加了以下内容:

import numpy as np
from scipy.optimize import minimize

array = np.array([[3.0, 0.25, 0.75],
                  [0.1, 0.65, 2.50],
                  [0.80, 2.5, 1.20],
                  [0.0, 0.25, 0.15],
                  [1.2, 2.40, 3.60]])

matrix = np.array([[1.0, 1.5, -2.],
                   [0.5, 3.0, 2.5],
                   [1.0, 0.25, 0.75]])


def fct1(x):
    return -sum(x.dot(array.T))


def fct2(x):
    return x.dot(matrix).dot(x)

x0 = np.ones(3) / 3
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1.0},
        {'type': 'eq', 'fun': lambda x: fct2(x) - tgt})

tgt = 0.15

w = minimize(fct1, x0, method='SLSQP', constraints=cons)['x']
res1 = fct1(w)
res2 = fct2(w)
def fct1_deriv(x):
    return -sum(np.ones_like(x).dot(array.T))

w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x']
问题是我在尝试运行时收到以下错误消息:

0-th dimension must be fixed to 4 but got 2
Traceback (most recent call last):
  File "C:\Anaconda2\envs\py36\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-111-d1b854178c13>", line 1, in <module>
    w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x']
  File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize
    constraints, callback=callback, **options)
  File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\slsqp.py", line 410, in _minimize_slsqp
    slsqp(m, meq, x, xl, xu, fx, c, g, a, acc, majiter, mode, w, jw)
_slsqp.error: failed in converting 8th argument `g' of _slsqp.slsqp to C/Fortran array
0维必须固定为4,但得到2
回溯(最近一次呼叫最后一次):
文件“C:\Anaconda2\envs\py36\lib\site packages\IPython\core\interactiveshell.py”,第2881行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
w=最小化(fct1,x0,method='SLSQP',jac=fct1_deriv,constraints=cons)['x']
文件“C:\Anaconda2\envs\py36\lib\site packages\scipy\optimize\\u minimize.py”,最小化中第458行
约束,回调=回调,**选项)
文件“C:\Anaconda2\envs\py36\lib\site packages\scipy\optimize\slsqp.py”,第410行,位于slsqp中
slsqp(m、meq、x、xl、xu、fx、c、g、a、acc、majiter、mode、w、jw)
_slsqp.error:未能将_slsqp.slsqp的第8个参数“g”转换为C/Fortran数组
你知道问题出在哪里吗?我先前回答的链接如下:
最小化函数以3向量作为输入,因此雅可比矩阵也应相应地为3向量,每个分量都是对应输入分量的偏导数。SciPy抱怨不知道如何处理您提供的单个值

就你而言,我认为这就是你想要的:

def fct1_deriv(x):
    return -np.sum(array, axis=1)

此外,如果速度是一个问题,您可能希望在
fct1
中使用
np.sum
,而不是
sum
,我想我终于找到了答案,并将在这里发布,以便人们可以使用它或纠正我:

在形式为
y=x^2
的优化问题中,可以通过将y与x微分,并将导数设置为0来求解,从而找到解决方案。因此,可以使用
2x=0.0
(求解
x=0.0
)找到解决方案。因此,我觉得传递函数的雅可比(一阶导数)进行优化有助于优化器找到解决方案


在我试图优化的问题中,我的函数的形式是
y=x
。通过区分
y
x
之间的差异,无法优化此函数(除了为其提供约束)。这将导致以下等式:
1.0=0.0
。因此,将函数的雅可比矩阵赋予优化器可能会导致上述问题。

我尝试运行您的解决方案,但仍然会显示相同的错误消息。然而,我不认为我的雅可比矩阵应该是3向量。雅可比矩阵是优化函数的导数,它产生一个值,而不是一个3向量。因此,我的雅可比矩阵也应该产生一个值。事实上,我使用向量只是为了让我的函数更干净一点。因为我的优化函数是一个线性函数,雅可比矩阵可能没有用,因为它不再是数组x的函数了吗?