






Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Etste pdf trata do estudo de matrizes, implementação de suas propriedades operatórias em fortran.
Tipologia: Notas de estudo
1 / 11
Esta página não é visível na pré-visualização
Não perca as partes importantes!







2.1 Arrays, vetores e matrizes
Para implementar matrizes na linguagem Fortran 90 iremos utilizar uma array^1. Uma
array ´e uma estrutura de dados que consiste de uma cole¸c˜ao de valores (vari´aveis ou
constantes) de um mesmo tipo que s˜ao referidos por um mesmo nome. Um valor individual
dentro da array ´e chamado um elemento da array e ´e identificado pelo nome da array
juntamente com um ´ındice indicando a localiza¸c˜ao do elemento dentro da array. Por
exemplo, a seguinte cole¸c˜ao de 5 n´umeros inteiros
{ 5 , 7 , 9 , 1 , 8 }
poder´a ser representada em Fortran 90 por
i n t e g e r , d i m e n s i o n ( 5 ) : : numeros = ( / 5 , 7 , 9 , 1 , 8 / )
O trecho de c´odigo acima declara uma array chamada “numeros” contendo 5 n´umeros
inteiros. No c´odigo, a array “numeros” ´e inicializada j´a na sua pr´opria declara¸c˜ao pelo
construtor de arrays (/... /). Outra forma de declarar e inicializar esta array seria
i n t e g e r , d i m e n s i o n ( 5 ) : : numeros
numeros ( 1 ) = 5 numeros ( 2 ) = 7 numeros ( 3 ) = 9 numeros ( 4 ) = 1 numeros ( 5 ) = 8
O n´umero entre os parˆenteses ´e o ´ındice que localiza a posi¸c˜ao dentro da array; o
´ındice 1 localiza a primeira posi¸c˜ao na array, o 2 a segunda e assim em diante. Portanto,
o c´odigo acima atribui o valor 5 a posi¸c˜ao 1 da array, o valor 7a posi¸c˜ao 2, etc. O sinal
de igual “=” ´e a forma de atribuir valores a vari´aveis em Fortran 90.
As arrays em Fortran 90 podem ter mais de um ´ındice, podendo ser organizadas em
m´ultiplas dimens˜oes. Essas arrays s˜ao convenientes para representar dados organizados,
por exemplo, em forma matricial (linhas e colunas). Utilizaremos arrays bidimensionais
(dois ´ındices) para representar matrizes. Chamaremos de matrizes as arrays bidimensi-
onais e de vetores as arrays unidimensionais. Por exemplo, se quis´essemos representar a
matriz identidade de ordem 3
Id 3 =
1 0 0
0 1 0
0 0 1
poder´ıamos utilizar o seguinte c´odigo em Fortran 90
i n t e g e r : : i , j i n t e g e r , d i m e n s i o n ( 3 , 3 ) : : identidade
do i = 1 , 3 do j = 1 , 3 i f ( i /= j ) then identidade ( i , j ) = 0 e l s e identidade ( i , j ) = 1 end i f end do end do
nomes em express˜oes e s´o podem retornar um ´unico resultado a ser usado na express˜ao. Os
exemplos a seguir d˜ao a forma geral de uma subrotina e de uma fun¸c˜ao, respectivamente
s u b r o u t i n e minha_subrotina ( lista de argumentos )
... (declara¸c˜oes de vari´aveis) ... (c´odigo a ser executado) ... r e t u r n end s u b r o u t i n e
f u n c t i o n minha_funcao ( lista de argumentos )
... (declara¸c˜oes de vari´aveis) ... (c´odigo a ser executado) ... minha_funcao = express˜ao r e t u r n end f u n c t i o n
Tanto para subrotinas quanto para fun¸c˜oes, ´e poss´ıvel estabelecer uma lista de argu-
mentos que ser˜ao utilizados pela subrotina ou fun¸c˜ao. Vale destacar que na fun¸c˜ao, ´e
necess´ario que haja uma atribui¸c˜ao de valor ao nome da fun¸c˜ao, indicando o valor que
ser´a retornado pela mesma.
3 Implementa¸c˜ao
O c´odigo a seguir ´e a implementa¸c˜ao em Fortran 90 das opera¸c˜oes b´asicas sobre matrizes e
o c´alculo do determinante de uma matriz pela sua decomposi¸c˜ao em matrizes triangulares
inferior e superior, conhecida como decomposi¸c˜ao LU. O algoritmo utilizado ´e conhecido
como algoritmo de Doolittle. Utilizamos um algoritmo simples para o c´alculo da
inversa de uma matriz. Esse algoritmo ´e baseado no processo de elimina¸c˜ao gaussiana e
tem um car´ater mais did´atico, pois seu desempenho ´e baixo.
Tentamos, exageradamente, comentar o c´odigo para facilitar a compreens˜ao do ma-
terial. Utilizamos v´arias t´ecnicas e constru¸c˜oes sint´aticas para mostrar v´arias formas de
implementa¸c˜ao. O c´odigo ´e extenso devido ao seu car´ater did´atico, mas vocˆe poder´a
modific´a-lo `a vontade, buscando melhores formas de expor os algoritmos ou, at´e mesmo,
utilizar algoritmos mais eficientes e precisos!
E aconselh´´ avel que vocˆe digite (ao inv´es de copiar-e-colar) todo o c´odigo e tente exe-
cut´a-lo, pois assim, estar´a treinando suas habilidades para detectar e corrigir erros, caso
ocorram. Vale ressaltar que este ´e um c´odigo com car´ater did´atico e n˜ao deve ser utilizado
em outros ambientes que n˜ao os de sala de aula.
Algumas instru¸c˜oes em Fortran 90 possuem op¸c˜oes at´e agora n˜ao utilizadas, como por
exemplo, a op¸c˜ao advance=‘no’ na instru¸c˜ao write. N˜ao detalharemos o significado
dessas op¸c˜oes, mas todas elas s˜ao facilmente encontradas em [1].
! A vari´avel seed ser´a compartilhada com a subrotina que cria os elementos das matrizes A e B ! aleatoriamente. Isto ´e necess´ario para que os valores das matrizes n˜ao sejam iguais. ! ! M´odulos devem sempre vir definidos antes do seu uso no programa. module global i m p l i c i t none i n t e g e r : : seed end module
! In´ıcio do programa program matrizes u s e global ! ! Prop´osito: ! Criar procedimentos para somar, multiplicar, transpor, inverter e decompor matrizes e ! calcular o determinante de uma matriz. ! ! Data: 1.5. ! Programador: Juvenal Muniz ! ! Revis˜oes ! 1.5.2010 : C´odigo original i m p l i c i t none
! Declara¸c˜oes das vari´aveis e das subrotinas utilizadas ! Descri¸c˜ao das vari´aveis e/ou matrizes ! n Dimens˜ao da matriz ! i Contador ! condicao Indica se houve erro ao abrir o arquivo ! opcao Armazena a opcao selecionada pelo usu´ario ! determinante Valor do determinante da matriz ! a, b, c Matrizes a, b e c ! arquivo Constante utilizada para acessar o arquivo ! resposta Armazenar´a a resposta `a pergunta (S ou N) ! nome arquivo Nome do arquivo contendo os elementos das matrizes
! Descri¸c˜ao das subrotinas ! matriz aleatoria Gera uma matriz quadrada aleat´oria de ordem n ! matriz adicao Efetua a adi¸c˜ao de duas matrizes ! matriz mul Efetua a multiplica¸c˜ao de duas matrizes ! matriz transposta Obt´em a transposta de uma matriz ! matriz inversa Obt´em a inversa de uma matriz ! matriz lu Decomp˜oe a matriz em matrizes triangulares inferior e superior ! matriz imprime Exibe os elementos da matriz
i n t e g e r : : n , i , j , condicao , opcao r e a l : : determinante r e a l , a l l o c a t a b l e , d i m e n s i o n ( : , : ) : : a , b , c i n t e g e r , pa rameter : : arquivo = 17 c h a r a c t e r ( 1 ) : : resposta c h a r a c t e r ( 2 0 ) : : nome_arquivo
! Valor inicial para a fun¸c˜ao RAN() seed = 32764561
! Leitura da dimens˜ao das matrizes quadradas w r i t e ( ∗ , ' (A) ' , advance= ' no ' ) ' Qual e a dimensao das m a t r i z e s? ' r e a d ( ∗ , ' ( I ) ' ) n
! Verifica se a dimens˜ao ´e maior ou igual a 2. Caso contr´ario, interrompe o programa. i f ( n >= 2 ) then a l l o c a t e ( a ( n , n ) , b ( n , n ) , c ( n , n ) ) e l s e w r i t e ( ∗ , ∗ ) ' As m a t r i z e s devem p o s s u i r dimensao maior ou i g u a l a 2! ' s t o p end i f
! Pede confirma¸c˜ao para gerar as matrizes aleatoriamente w r i t e ( ∗ , ' (A) ' , advance= ' no ' ) ' D e s e j a que a s m a t r i z e s a e b sejam g e r a d a s? ( S ou N) ' r e a d ( ∗ , ' (A1) ' ) resposta
! Verifica a resposta dada pelo usu´ario i f ( ( resposta == ' S ' ). or. ( resposta == ' s ' ) ) then ! Usu´ario prefere que as matrizes sejam geradas aleatoriamente c a l l matriz_aleatoria ( a , n )
e l s e i f ( opcao == 5 ) then ! Decomposi¸c˜ao de A em LU c a l l matriz_lu ( a , n )
! C´alculo do determinante para uma matriz LU determinante = 1. 0 do i = 1 , n determinante = determinante ∗ a ( i , i ) end do
w r i t e ( ∗ , ' ( / , x ,A) ' ) 'MATRIX A ' c a l l matriz_imprime ( a , n ) w r i t e ( ∗ , ' ( / , x , A, F) ' ) 'O d e t e r m i n a n t e da m a t r i z A v a l e : ' , determinante e l s e i f ( opcao == 6 ) then ! Exibe os elementos das matrizes A e B w r i t e ( ∗ , ' ( / , x ,A) ' ) 'MATRIX A ' c a l l matriz_imprime ( a , n )
w r i t e ( ∗ , ' ( / , x ,A) ' ) 'MATRIX B ' c a l l matriz_imprime ( b , n ) e l s e i f ( opcao == 0 ) then ! Interrompe o programa w r i t e ( ∗ , ' ( / , x , A, / ) ' ) ' Programa terminado. Ate mais! ' e x i t end i f end do
! Libera a mem´oria ocupada pelas matrizes A, B, C d e a l l o c a t e ( a , b , c ) end program
! Esta subrotina exibe os valores dos elementos de uma matriz ! ! Parˆametros: ! a Matriz cujos elementos ser˜ao exibidos ! n Dimens˜ao da matriz (apenas matrizes quadradas) s u b r o u t i n e matriz_imprime ( a , n ) i m p l i c i t none i n t e g e r : : n , i , j r e a l : : a ( n , n )
do i = 1 , n do j = 1 , n w r i t e ( ∗ , ' ( f , 2 x ) ' , advance= ' no ' ) a ( i , j ) end do p r i n t ∗ end do end s u b r o u t i n e
! Esta subrotina gera uma matriz com valores aleat´orios para seus elementos ! ! Parˆametros: ! a Matriz que armazenar´a os elementos gerados ! n Dimens˜ao da matriz (apenas matrizes quadradas) s u b r o u t i n e matriz_aleatoria ( a , n ) u s e global i m p l i c i t none i n t e g e r : : n , i , j r e a l : : a ( n , n )
do i = 1 , n do j = 1 , n ! Calcula valores aleat´orios de -5 `a + ! A fun¸c˜ao ran() retorna valores entre 0.0 e 1. a ( i , j ) = ( −1.0) ∗ ∗ ( i+j ) ∗ 5. 0 ∗ ran ( seed ) end do end do end s u b r o u t i n e
! Esta subrotina faz a adi¸c˜ao de duas matrizes quadradas (a + b) ! ! Parˆametros: ! a e b Matrizes de entrada
! c Matriz que armazenar´a a soma de a com b ! n Dimens˜ao da matriz (apenas matrizes quadradas) s u b r o u t i n e matriz_soma ( a , b , c , n ) i m p l i c i t none i n t e g e r : : n , i , j r e a l : : a ( n , n ) , b ( n , n ) , c ( n , n )
do i = 1 , n do j = 1 , n c ( i , j ) = a ( i , j ) + b ( i , j ) end do end do end s u b r o u t i n e
! Esta subrotina faz a multiplica¸c˜ao de duas matrizes quadradas (a * b) ! ! Parˆametros: ! a e b Matrizes de entrada ! c Matriz que armazenar´a o produto de a por b ! n Dimens˜ao da matriz (apenas matrizes quadradas) s u b r o u t i n e matriz_mul ( a , b , c , n ) i m p l i c i t none i n t e g e r : : n , i , j , k r e a l : : a ( n , n ) , b ( n , n ) , c ( n , n )
c = 0. 0
do i = 1 , n do j = 1 , n do k = 1 , n c ( i , j ) = c ( i , j ) + a ( i , k ) ∗ b ( k , j ) end do end do end do end s u b r o u t i n e
! Esta subrotina cria a transposta de uma matriz ! ! Parˆametros: ! a Matriz de entrada ! n Dimens˜ao da matriz (apenas matrizes quadradas) ! ! AVISO: A matriz a ser´a modificada no processo s u b r o u t i n e matriz_transposta ( a , n ) i m p l i c i t none i n t e g e r : : n , i , j r e a l : : a ( n , n ) , temp
do i = 1 , n do j = 1 , n i f ( i < j ) then temp = a ( i , j ) a ( i , j ) = a ( j , i ) a ( j , i ) = temp end i f end do end do end s u b r o u t i n e
! Esta subrotina calcula a inversa de uma matriz por elimina¸c˜ao gaussiana ! ! Parˆametros: ! matriz Matriz de entrada ! inversa Matriz que armazenar´a a inversa ! n Dimens˜ao da matriz (apenas matrizes quadradas) ! ! AVISO: A matriz a ser´a modificada no processo ! Referˆencia : ! http://math.uww.edu/˜mcfarlat/inverse.htm ! http://www.tutor.ms.unimelb.edu.au/matrix/matrix inverse.html s u b r o u t i n e matriz_inversa ( matriz , inversa , n ) i m p l i c i t none i n t e g e r : : n
m = matriz_aumentada ( i , k+1) do j = k , 2 ∗ n matriz_aumentada ( i , j ) = matriz_aumentada ( i , j ) − matriz_aumentada ( k +1 , j ) ∗ m end do end do end do
! Armazene o resultado do i =1 , n do j = 1 , n inversa ( i , j ) = matriz_aumentada ( i , j + n ) end do end do
end s u b r o u t i n e
! Esta subrotina verifica se a matriz inversa ´e v´alida (a * b = identidade) ! ! Parˆametros: ! a Matriz original ! b Matriz inversa de a ! n Dimens˜ao da matriz (apenas matrizes quadradas) s u b r o u t i n e matriz_inversa_verifica ( a , b , n ) i m p l i c i t none i n t e g e r : : n , i , j r e a l , d i m e n s i o n ( n , n ) : : a , b , identidade l o g i c a l : : ok
ok =. true.
c a l l matriz_mul ( a , b , identidade , n )
do i = 1 , n do j = 1 , n ! Elementos fora da diagonal principal n˜ao podem ser diferentes de zero i f ( ( i /= j ). and. ( abs ( identidade ( i , j ) ) >= 1. 0 E −6) ) then ok =. false. ! Elementos na diagonal principal n˜ao podem ser diferentes de um e l s e i f ( ( i == j ). and. ( abs ( identidade ( i , i ) − 1. 0 ) >= 1. 0 E −6) ) then ok =. false. end i f end do end do
i f ( ok ==. false. ) then w r i t e ( ∗ , ' ( / , x , A, / ) ' ) 'A v e r f i c a c a o da m a t r i z i n v e r s a f a l h o u ' e l s e w r i t e ( ∗ , ' ( / , x , A, / ) ' ) 'A v e r f i c a c a o da m a t r i z i n v e r s a f o i c o n c l u i d a com s u c e s s o! ' end i f
end s u b r o u t i n e
! Esta subrotina decomp˜oe uma matriz em matrizes triangulares inferior e superior (LU) ! pelo algoritmo de Doolittle (diagonal principal da matriz L igual a 1). Para uma ! descri¸c˜ao te´orica sobre o algoritmo de Doolittle, veja [2]. ! ! Parˆametros: ! a Matriz que armazenar´a as matrizes LU ! n Dimens˜ao da matriz (apenas matrizes quadradas) ! ! AVISO: A matriz a ser´a modificada no processo s u b r o u t i n e matriz_lu ( a , n ) i m p l i c i t none i n t e g e r : : n , i , j , k r e a l : : a ( n , n ) , s , ss
! Os elementos da diagonal n˜ao podem ser zero i f ( abs ( a ( 1 , 1 ) ) <= 1. 0 E −6) then w r i t e ( ∗ , ' ( / , x , A, / ) ' ) ' ∗∗ I m p o s s i v e l f a t o r a r a m a t r i z ∗∗ ' s t o p end i f
do i = 2 , n a ( i , 1 ) = a ( i , 1 ) / a ( 1 , 1 )
end do
do i = 2 , n − 1
s = 0. 0 do k = 1 , i − 1 s = s − a ( i , k ) ∗ a ( k , i ) end do
a ( i , i ) = ( a ( i , i ) + s )
! Os elementos da diagonal n˜ao podem ser zero i f ( abs ( a ( i , i ) ) <= 1. 0 E −6) then w r i t e ( ∗ , ' ( / , x , A, / ) ' ) ' i m p o s s i v e l f a t o r a r a m a t r i z ' s t o p end i f
do j = i + 1 , n ss = 0. 0 s = 0. 0
do k = 1 , i − 1 ss = ss − a ( i , k ) ∗ a ( k , j ) s = s − a ( j , k ) ∗ a ( k , i ) end do
a ( i , j ) = a ( i , j ) + ss a ( j , i ) = ( a ( j , i ) + s ) / a ( i , i ) end do end do
s = 0. 0
do k = 1 , n − 1 s = s − a ( n , k ) ∗ a ( k , n ) end do
a ( n , n ) = a ( n , n ) + s end s u b r o u t i n e
Referˆencias
[1] Stephen J. Chapman, Fortran 95/2003 for scientists and engineers, McGrall-Hill Com-
panies, New York, NY, 2007.
[2] R.L. Burden e J.D. Faires, Numerical analysis, Brooks Cole, California, CA, 2000.
[3] J.L. Boldrini et al., Algebra linear´ , Editora Harbra, Ltda., S˜ao Paulo, SP, 1980.