Questão 3: Usando numPy, escreva um programa que leia uma matriz quadrada elemento a elemento do teclado e classifique-a segundo uma das 5 categorias abaixo:
- Definida positiva: todos os auto-valores são positivos.
- Semidefinida positiva: todos os auto-valores são não-negativos (isto é, podem ser zero).
- Definida negativa: todos os auto-valores são negativos.
- Semidefinida negativa: todos os auto-valores são não-positivos (isto é, podem ser zero)…
- Indefinida: existe ao menos um auto-valor positivo e ao menos um auto-valor negativo.
Nesse exercício, considere que um auto-valor cujo módulo seja inferior a
na realidade vale zero.
Passo 1
A gente tem que ler uma matriz quadrada de tamanho n digitando cada elemento, calcular os autovalores com o NumPy e depois classificar a matriz conforme o sinal desses autovalores, lembrando que valores com módulo menor que 1.0×10⁻⁶ são considerados zero.
Passo 2
Primeiro, importamos o NumPy e pedimos ao usuário o tamanho n da matriz. Em seguida, inicializamos uma matriz n×n com zeros e usamos dois loops for para preencher cada elemento via input.
Passo 3
Depois de montar a matriz, usamos a função np.linalg.eigvals para obter o vetor de autovalores. Aplicamos o critério de tolerância: qualquer autovalor cuja
valor absoluto for menor que 1.0×10⁻⁶ vira exatamente zero.
valor absoluto for menor que 1.0×10⁻⁶ vira exatamente zero.
Passo 4
Com os autovalores ajustados, verificamos quantos são positivos, quantos são negativos e quantos são zeros usando np.all e operadores lógicos. A partir daí, aplicamos as definições: se todos >0 → definida positiva; se todos ≥0 → semidef. positiva; se todos <0 → definida negativa; se todos ≤0 → semidef. negativa; caso contrário, indefinida.
Passo 5
Por fim, imprimimos a categoria apropriada. Isso resolve o problema pedindo e classificando a matriz automaticamente. O programa cobre todos os casos e usa a regra de tolerância para tratar autovalores quase nulos.
Resposta
import numpy as np
def main():
# lê o tamanho da matriz
n = int(input("Digite o tamanho n da matriz quadrada: "))
# inicializa a matriz n×n
M = np.zeros((n, n), dtype=float)
# lê o tamanho da matriz
n = int(input("Digite o tamanho n da matriz quadrada: "))
# inicializa a matriz n×n
M = np.zeros((n, n), dtype=float)
# lê os elementos da matriz
for i in range(n):
for j in range(n):
M[i, j] = float(input(f"M[{i+1},{j+1}] = "))
# calcula os autovalores
eigvals = np.linalg.eigvals(M)
# aplica tolerância: valores próximos de zero viram zero
tol = 1.0e-6
eigvals[np.abs(eigvals) < tol] = 0.0
# verifica sinais dos autovalores
all_pos = np.all(eigvals > 0)
all_nonneg = np.all(eigvals >= 0)
all_neg = np.all(eigvals < 0)
all_nonpos = np.all(eigvals <= 0)
# classifica a matriz
if all_pos:
print("Definida positiva")
elif all_nonneg:
print("Semidefinida positiva")
elif all_neg:
print("Definida negativa")
elif all_nonpos:
print("Semidefinida negativa")
else:
print("Indefinida")
if name == “main”:
main()
main()