具有numpy

时间:2017-04-30 11:32:03

标签: python numpy

我试图用Python编写SQP方法并且遇到了很多困难。

我正在使用一本书:Jorge Nocedal和Stephen J. Wright。数值优化。 (开放式访问)

这本书说我们必须解决这个问题:

page 553

我计算了正确的矩阵,让我们将其称为H以及左边的矩阵让我们称之为G,以便找到pk和lambda k + 1.

我该如何解决这个问题?

这就是我的尝试:

H=[[[[1,0],[0,1]],[[-2],[0]]],
   [[2,0],0]
   ]
G=[[[-1],[-1]],
   0
   ]
H=np.array(H)
G=np.array(G)
np.linalg.solve(H,G)

或者

np.linalg.lstsq(H,G)

但两人都给了我一些错误:

TypeError: No loop matching the specified signature and casting
was found for ufunc solve1

setting an array element with a sequence.

编辑:

enter image description here

1 个答案:

答案 0 :(得分:0)

Numpy并不了解矩阵的矩阵 - 你需要将这些矩阵展平为单个矩阵,你可以这样做:

H = np.array([
    [1, 0, -2]
    [0, 1,  0],
    [2, 0,  0],
])

G = np.array([
    [-1],
    [-1],
    [0]
])

np.linalg.solve(H,G)

如果你想从他们的部件组装这些,你可以

Ak         = np.array([[2, 0]])
laplace_Lk = np.eye(2)
grad_fk    = np.array([[1, 1]]).T
ck         = 0

H = np.r_[
    np.c_[laplace_Lk, -Ak.T],
    np.c_[        Ak,     0]
]
G = np.c_[-grad_fk, -ck]

在即将发布的1.13中,您也可以将其写为:

H = np.block([
   [laplace_Lk, -Ak.T],
   [        Ak,     0]
]
G = np.block([
    [-grad_fk ],
    [-ck      ]
])