/ / checando se uma matriz é diagonalmente dominante em python - python, numpy, matrix, linear-algebra

verificar se uma matriz é diagonal dominante em python - python, numpy, matrix, linear-algebra

Eu sei que meu código está errado porque np.sum (abs (X), axis = 1)) também soma o valor diagonal, portanto meu código sempre retornará "NOT diagonalmente dominante". Eu tentei colocar "-np.diag (X)", mas recebo uma mensagem de erro. Agradeço antecipadamente!

import numpy as np

A=np.array([[ 40., 7.,   5.],
[ 5., 90.,  7.],
[20., 7., 50.]])


def dd(X):
Sum_values_in_given_row = np.sum(abs(X),axis=1)
if np.all(((abs(np.diag(X)))) >= np.sum(abs(X),axis=1)):
print "matrix is diagonally dominant"
else:
print "NOT diagonally dominant"
return

dd(A)

Respostas:

3 para resposta № 1

Para determinar se uma matriz é diagonal dominante, você deve verificar se a soma dos coeficientes de linha excluindo o coeficiente diagonal é maior que ocoeficiente diagonal. Obviamente você toma os valores absolutos como parte do teste. Você não está fazendo isso e está incluindo o coeficiente diagonal. Como você mencionou, você deve subtrair essa soma de cada elemento com o coeficiente diagonal para garantir que a verificação esteja correta, mas você não colocou isso em seu código por algum motivo:

def dd(X):
D = np.diag(np.abs(X)) # Find diagonal coefficients
S = np.sum(np.abs(X), axis=1) - D # Find row sum without diagonal
if np.all(D > S):
print "matrix is diagonally dominant"
else:
print "NOT diagonally dominant"
return

Observe que o código aproveita a transmissão para facilitar a subtração das somas da linha com o coeficiente diagonal correspondente.


3 para resposta № 2

O Matrix UMA é diagonalmente dominante se | Aii| ≥ ∑j ≠ i | Aeu j| ou equivalentemente, 2 | Aii| ≥ ∑j | Aeu j|

def is_diagonally_dominant(x):
abs_x = np.abs(x)
return np.all( 2*np.diag(abs_x) >= np.sum(abs_x, axis=1) )
#                  ^^

0 para resposta № 3

O que há de errado com

matrix = [[ 40., 7.,   5.],
[ 5., 90.,  7.],
[20., 7., 50.]]

def dd(mat):
for numb, i in enumerate(mat):
if mat[numb][numb]<sum(i)-mat[numb][numb]:
return False
return True


print(dd(matrix))