Python 带numpy的SQP方法

Python 带numpy的SQP方法,python,numpy,Python,Numpy,我试图用Python编写SQP方法,但遇到了很多困难 我在用一本书:豪尔赫·诺切达尔和斯蒂芬·赖特。数值优化。(开放存取) 这本书说我们必须解决这个问题: 我计算了右矩阵,我们称之为H,左矩阵,我们称之为G,以求pk和λ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.s

我试图用Python编写SQP方法,但遇到了很多困难

我在用一本书:豪尔赫·诺切达尔和斯蒂芬·赖特。数值优化。(开放存取)

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

我计算了右矩阵,我们称之为H,左矩阵,我们称之为G,以求pk和λ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)

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

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

编辑:


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      ]
])

定义矩阵的方式就是问题所在
H
应该是一个行列表列表,然后再将其转换为numpy数组。同样的情况也适用于
G
谢谢你的回答@cel,但是知道它是由矩阵组成的矩阵,我怎么能这样写呢?你能用乳胶写出你想要的
H
G
的样子吗?我很难在你的列表中看到任何结构更好,谢谢!Ak
Ak
保持不变?矩阵乘法没有意义谢谢!!你的意思是np.bmat而不是np.block?
np.block
在numpy 1.13中是新的。在2d中,
np.block(…)
np.bmat(…).A
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]
H = np.block([
   [laplace_Lk, -Ak.T],
   [        Ak,     0]
]
G = np.block([
    [-grad_fk ],
    [-ck      ]
])