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 № 1Para 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))