检查是否可以用Jacobi方法解决矩阵的代码

时间:2018-09-14 15:40:40

标签: python python-3.x

def checkJacobi(m):
    row = m.shape[0]
    col = m.shape[1]
    solv = 0
    for i in range(row):
        x = abs(m[i,i])
        y = 0
        for j in range(col):
            y = y + abs(m[i,j])
        y = y - x
        if (y < x):
            solv = solv + 1
    if (solv == col):
        return True
    else:
        return False

到目前为止,这是我的代码,仅检查矩阵是否可以使用Jacobi方法求解(Jacobi方法只能在每行对角线元素的绝对值主导该矩阵的绝对值之和时使用)同一行中的其他元素)。我用应该起作用的矩阵对其进行了测试,并且它们返回False。我的代码有什么问题?

2 个答案:

答案 0 :(得分:0)

RTFM:https://en.m.wikipedia.org/wiki/Diagonally_dominant_matrix

测试为abs(m[i, i]) >= sum(abs(m[i, j]) for j in range(cols)) - abs(m[i, i])。因此,您的代码应为:

if y <= x: # not y < x
    solv = solv + 1

您的代码正在检查 strict 对角线优势,而Jacobi方法甚至适用于简单的“非严格”对角线。

答案 1 :(得分:-1)

主要错误是(y 必须是(y <= x)

进一步将绝对值映射到行可能会更干净:

def checkJacobi(m):
row = m.shape[0]
col = m.shape[1]
solv = 0
for i in range(row):
    m[i] = list(map(abs,m[i]))
    x = m[i,i]
    y = 0
    for j in range(col):
        y = y + m[i,j]
    y = y - x
    if (y <= x):
        solv = solv + 1
if (solv == row):
    return True
else:
    return False