高斯消去导致最后一个对角线元素变为零



我正在使用高斯消除来反转矩阵。基本上是试图用它来寻找下降方向,因为不知何故,我觉得取相反的方向很慢。高斯消去法确实加快了寻找下降方向的速度。然而,在消除过程中,如果我从特定的初始向量开始,我会看到最后一个对角线元素将变为零(本质上意味着最后一行全部变为零(。如果我选择其他起点,我不会得到问题,但在几个特定的初始向量上,我会得到问题。有人遇到过它吗?有办法绕过它吗?还有一种更快的方法可以找到矩阵的逆,这样我就不必做所有这些了。

def powell_hessian(x):
g1_ph = np.array([2.0 + 120.0 * (x[0] - x[3]), 20.0, 0.0, -120 * (x[0] - x[3])])
g2_ph = np.array([20.0, 200.0 + 12.0 * (x[1] - 2.0 * x[2]) ** 2.0, -24.0 * (x[1]-2.0 * x[2]) ** 2.0, 0.0])
g3_ph = np.array([0.0, -24.0 * (x[1] - 2.0 * x[2]) ** 2.0, 10.0 + 48.0 *(x[1] - 2.0 * x[2]) ** 2.0, -10.0])
g4_ph = np.array([-120.0 * (x[0] - x[3]) ** 2.0, 0.0, -10.0, 10.0 + 120.0 * (x[0] - x[3]) ** 2.0])
return np.array([g1_ph, g2_ph, g3_ph, g4_ph])
def powell_grad(x):
g1_p = 2.0 * (x[0] + 10 * x[1]) + 40.0 * (x[0] - x[3]) ** 3.0
g2_p = 20.0 * (x[0] + 10 * x[1]) + 4.0 * (x[1] - 2 * x[2]) ** 3.0
g3_p = 10.0 * (x[2] - x[3]) - 8.0 * (x[1] - 2.0 * x[2]) ** 3.0
g4_p = -10.0 * (x[2] - x[3]) - 40.0 * (x[0] - x[3]) ** 3.0
return np.array([g1_p, g2_p, g3_p, g4_p])
def gauss_elimination(a, b):
n = len(b)
for k in range(0, n - 1):
for i in range(k + 1, n):
if a[i, k] != 0.0:
lam = a[i, k] / a[k, k]
a[i] = a[i] - lam * a[k]
b[i] = b[i] - lam * b[k]
print(a, "n")
# Back Substitution Phase
for k in range(n - 1, -1, -1):
b[k] = (b[k] - dot(a[k, k + 1:n], b[k + 1:n])) / a[k, k]
# print(dot(a[k, k + 1:n], b[k + 1:n]), "n")
print(b, "n")
return b
dk = gauss_elimination(powell_hessian(x1), powell_grad(x1))
x1 = np.array([1.0, -1.0, 0.0, 1.0]) # creates the issue by making last row zero
x1 = np.array([3.0, -1.0, 0.0, 1.0]) # doesn't create the issue but takes longer to find the minimum

在gaussian_elimination函数中,测试

if a[i, k] != 0.0:

应该是

if a[k, k] != 0.0:

然而,还有一个更根本的问题,那就是高斯消去法并不适用于所有可逆矩阵。考虑矩阵

M = ( 0 1 )
( 1 0 )

这是可逆的——这是它自己的逆——但要使用高斯消去法,需要交换列。

除非您对矩阵求逆特别感兴趣,否则最好使用库进行求逆,而不是编写自己的库。唉,我是来无知的python推荐用什么。

如果你对平行向量或具有平行分量的向量进行高斯消去过程,你会沿着对角线得到零(假设对角线下的所有元素都是平行的[等价](。如果对角线上有一个零,那么算法可能会将这一行交换到底部,移动下一个对角线元素,并尝试消除在减少剩余行的过程中刚刚被推到底部的那一行的所有剩余列元素。除非有其他零对角线条目,否则它将成功地消除向量中交换到底部的所有剩余元素,并且在底部留下一行全零。

在这一点上,如果任何给定的行都是零,并且该行的答案(或增广列元素(是零,那么你就有了一个线性相关系统。对于这样的每一行,任意地将对角线元素设置为1(如果需要,依赖性意味着您可以根据自己的需求进行设置(。

如果矩阵的行为零,并且该行的答案(或增广列元素(为非零,则这意味着系统不可解。

*与其试图制定高斯消去法这一非常通用的工具的硬性规则,不如考虑高斯消去法的这一有用方面;还原后剩余的每一个零对角元素表示一个因变量。对于不同维度的矩阵,你应该说服自己这一点。对于NXN矩阵,你会发现这是真的。对于W>L附加零行以形成NXN矩阵,然后计数零对角线。对于L>W将底部的零行剪切掉,然后计算对角线上的零条目。

最新更新