Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Programação com matrizes em Fortran, Notas de estudo de Matemática

Etste pdf trata do estudo de matrizes, implementação de suas propriedades operatórias em fortran.

Tipologia: Notas de estudo

2013

Compartilhado em 06/02/2013

juliano-deividy-b-santos-2
juliano-deividy-b-santos-2 🇧🇷

4.8

(12)

3 documentos

1 / 11

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Matrizes em Fortran 90
Flavio Aristone
Juvenal Muniz
1 de maio de 2010
Resumo
Discutiremos neste documento a implementa¸ao de opera¸oes asicas sobre ma-
trizes na linguagem de programa¸ao Fortran 90: adi¸ao, multiplica¸ao, transposta
e inversa. Calcularemos o determinante de uma matriz pela sua decomposi¸ao LU.
Sum´ario
1 Introdu¸ao 1
2 Teoria 1
2.1 Arrays, vetores e matrizes ........................... 2
2.1.1 Aloca¸ao dinˆamica de arrays ...................... 3
2.2 Fun¸oes e subrotinas .............................. 3
3 Implementa¸ao 4
Referˆencias 11
1 Introdu¸ao
Uma matriz ´e um arranjo retangular de umeros. Por exemplo,
A=
8 7 2
3 5 10
4 11 3
1 15 7
As opera¸oes asicas que podem ser aplicadas a matrizes ao: adi¸ao,multiplica¸ao,
transposi¸ao einvers˜ao. Nossa preocupa¸ao maior neste documento ´e a implementa¸ao
destas opera¸oes na linguagem de programa¸ao Fortran 90. Para uma discuss˜ao te´orica
sobre matrizes, sugerimos o livro [3].
2 Teoria
Antes de implementarmos as opera¸oes matriciais, vamos fornecer um breve resumo de
alguns conceitos da linguagem Fortran 90 que iremos utilizar mais adiante neste docu-
mento.
1
pf3
pf4
pf5
pf8
pf9
pfa

Pré-visualização parcial do texto

Baixe Programação com matrizes em Fortran e outras Notas de estudo em PDF para Matemática, somente na Docsity!

Matrizes em Fortran 90

Flavio Aristone

Juvenal Muniz

1 de maio de 2010

Resumo

Discutiremos neste documento a implementa¸c˜ao de opera¸c˜oes b´asicas sobre ma-

trizes na linguagem de programa¸c˜ao Fortran 90: adi¸c˜ao, multiplica¸c˜ao, transposta

e inversa. Calcularemos o determinante de uma matriz pela sua decomposi¸c˜ao LU.

Sum´ario

1 Introdu¸c˜ao 1

2 Teoria 1

2.1 Arrays, vetores e matrizes........................... 2

2.1.1 Aloca¸c˜ao dinˆamica de arrays...................... 3

2.2 Fun¸c˜oes e subrotinas.............................. 3

3 Implementa¸c˜ao 4

Referˆencias 11

1 Introdu¸c˜ao

Uma matriz ´e um arranjo retangular de n´umeros. Por exemplo,

A =

As opera¸c˜oes b´asicas que podem ser aplicadas a matrizes s˜ao: adi¸c˜ao, multiplica¸c˜ao,

transposi¸c˜ao e invers˜ao. Nossa preocupa¸c˜ao maior neste documento ´e a implementa¸c˜ao

destas opera¸c˜oes na linguagem de programa¸c˜ao Fortran 90. Para uma discuss˜ao te´orica

sobre matrizes, sugerimos o livro [3].

2 Teoria

Antes de implementarmos as opera¸c˜oes matriciais, vamos fornecer um breve resumo de

alguns conceitos da linguagem Fortran 90 que iremos utilizar mais adiante neste docu-

mento.

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

1 Por falta de uma melhor tradu¸c˜ao da palavra, iremos utilizar o termo em inglˆes neste documento.

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.