我试图用Python编写SQP方法并且遇到了很多困难。
我正在使用一本书:Jorge Nocedal和Stephen J. Wright。数值优化。 (开放式访问)
这本书说我们必须解决这个问题:
我计算了正确的矩阵,让我们将其称为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.
编辑:
答案 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 ]
])