Python 带numpy的SQP方法
我试图用Python编写SQP方法,但遇到了很多困难 我在用一本书:豪尔赫·诺切达尔和斯蒂芬·赖特。数值优化。(开放存取) 这本书说我们必须解决这个问题: 我计算了右矩阵,我们称之为H,左矩阵,我们称之为G,以求pk和λk+1 我怎样才能解决这个问题 这就是我尝试的: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
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
的样子吗?我很难在你的列表中看到任何结构更好,谢谢!AkAk
保持不变?矩阵乘法没有意义谢谢!!你的意思是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 ]
])