3.3.18 Escreva uma sub-rotina que testará se uma matriz real N \times N é simétrica. Simetria pode ser definida como
0 \leq\left|a_{i j}-a_{j i}\right| \leq \varepsilon,
em que \varepsilon é alguma pequena tolerância (que leva em conta o erro de truncamento, e assim por diante, no computador).

Passo 1

O problema pede uma sub-rotina que receba uma matriz real A de dimensão N\times N e uma tolerância \varepsilon, testando se
0 \le \lvert a_{ij} - a_{ji}\rvert \le \varepsilon
para todos os pares (i,j). O conteúdo envolve loops aninhados, comparação de valores em posições simétricas e uso de valor lógico de saída.

Passo 2

Formalizando: seja A = [a_{ij}]. Definimos que A é simétrica a menos de \varepsilon se, para todo 1 \le i<j\le N,
\lvert a_{ij} - a_{ji}\rvert \;\le\; \varepsilon.
Basta testar apenas a “metade” estrita da matriz (índices i<j).

Passo 3

Algoritmo essencial:
1. Inicializar a saída lógica \(IS_SYMM =\) .TRUE..
2. Para i de 1 até N-1:
2.1 Para j de i+1 até N:
- Calcular \Delta = \lvert a_{ij} - a_{ji}\rvert.
- Se \Delta > \varepsilon, atribuir \(IS_SYMM =\) .FALSE. e sair imediatamente (já não é simétrica).
3. Se os loops terminarem sem violar a desigualdade, manter \(IS_SYMM =\) .TRUE..

Passo 4

Implementação em Fortran (pseudocódigo detalhado):
  subroutine \(TEST_SIMETRICA\)(A, N, EPS, \(IS_SYMM\))  
  implicit none  
  integer, intent(in)    :: N  
  real    , intent(in)    :: A(N,N), EPS  
  logical , intent(out)   :: \(IS_SYMM\)  
  integer :: i, j  
  real    :: delta  

  ! \(1\)) assumimos simétrica até prova em contrário  
  \(IS_SYMM =\) .TRUE.  

  ! \(2\)) verifica apenas \(i<j\)  
  do i \(=1\), N-\(1\)  
     do j \(=\) i\(+1\), N  
        delta \(=\) abs( A(i,j) - A(j,i) )  
        if (delta > EPS) then  
           \(IS_SYMM =\) .FALSE.  
           return    ! sai da subrotina imediatamente  
        end if  
     end do  
  end do  

  end subroutine \(TEST_SIMETRICA\)

Resposta

Veja acima a sub-rotina \(TEST_SIMETRICA\) em Fortran que recebe A(N,N), dimensão N, tolerância EPS e retorna \(IS_SYMM\) indicando se a matriz é (quase) simétrica.

Exercícios de Livros Relacionados