3.3.18 Escreva uma sub-rotina que testará se uma matriz real
é simétrica. Simetria pode ser definida como
,
em que
é alguma pequena tolerância (que leva em conta o erro de truncamento, e assim por diante, no computador).
em que
Passo 1
O problema pede uma sub-rotina que receba uma matriz real
de dimensão
e uma tolerância
, testando se
para todos os pares
. 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
. Definimos que
é simétrica a menos de
se, para todo
,
Basta testar apenas a “metade” estrita da matriz (índices
).
Passo 3
Algoritmo essencial:
. Inicializar a saída lógica
. Para
de
até
:
Para
de
até
:
- Calcular .
- Se , atribuir
. Se os loops terminarem sem violar a desigualdade, manter
\(IS_SYMM =\) .TRUE..- Calcular
- Se
\(IS_SYMM =\) .FALSE. e sair imediatamente (já não é simétrica).\(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.