Академический Документы
Профессиональный Документы
Культура Документы
1. Introdução 1
2. Linguagens de Programação 1
3. Uso da Linguagem Fortran em Computadores 3
4. Formatação de um Programa em Fortran 3
5. Estrutura de um Programa em Fortran 4
6. Constantes e Variáveis 5
6.1 Declaração de Constantes e Variáveis 6
6.2 Inicialização de Valores de Variáveis 6
6.3 Programa com Diferentes Tipos de Variáveis 7
7. Leitura e Impressão de Dados em Arquivo Externo 8
8. Comentários 9
9. Formatação de Dados de Entrada e Saída 9
10. Funções Internas 11
11. Expressões Aritméticas e Lógicas 11
11.1 Exemplos 12
12. Comandos IF e DO 12
13. Sub-rotinas e Funções 13
14. Arranjos ou Variáveis Compostas 14
14.1 Dimensionamento Dinâmico de Arranjos 15
14.2 Operações com Arranjos em F90 15
Anexo – Lista de Programas 16
Referências Bibliográficas 35
1. Introdução:
• Solução Analítica.
• Laboratório.
• Computador.
2. Linguagens de Programação:
• Linguagens de máquina.
• Linguagens assembly.
• Linguagens de alto nível.
Qualquer computador pode entender apenas a sua própria linguagem de máquina, que está
relacionada intimamente com o seu projeto de hardware. Geralmente as linguagens de
máquina consistem em strings de números (reduzidos em última análise de 1s e 0s) que dizem
ao computador para realizar uma de suas operações mais elementares de cada vez. As
linguagens de máquina são dependentes da máquina (não padronizadas), ou seja, uma
determinada linguagem de máquina só pode ser usada com um tipo de computador. As
linguagens de máquina são complicadas para os humanos, como se pode ver no trecho de um
programa em linguagem de máquina extraído de Deitel & Deitel [1994], que adiciona o
Termo_B ao Termo_A e armazena o resultado no Termo_C.
+1300042774
+1400593419 : linguagem de máquina
+1200274027
À medida que os computadores se tornaram mais populares, ficou claro que a programação
em linguagem de máquina era muito lenta e tediosa para a maioria dos programadores. Em
vez de usar strings de números que os computadores podiam entender diretamente, os
programadores começaram a usar abreviações parecidas com palavras em inglês para
representar as operações elementares de um computador. Estas abreviações formam a base
das linguagens assembly. Foram desenvolvidos programas tradutores, chamados assemblers,
para converter programas de linguagem assembly para linguagem de máquina. O trecho de
um programa em linguagem assembly a seguir, extraído de Deitel & Deitel [1994], também
Métodos Computacionais / 1º Semestre de 2005 2
LOAD Termo_A
ADD Termo_B : linguagem assembly
STORE Termo_C
Obviamente, as linguagens de alto nível são muito mais desejáveis do ponto de vista do
programador do que as linguagens de máquina ou assembly. Dentre as linguagens de
computador de alto nível mais comuns hoje em dia, destacam-se: Ada, Basic, Cobol, C, C++,
Delphi, Fortran e Pascal. Destas linguagens, o Fortran tem sido uma das linguagens mais
utilizadas nos últimos cinqüenta anos para cálculos científicos em geral, tendo sido
empregada para uma grande variedade de aplicações: modelos computacionais de centrais
nucleares, projetos de aeronaves, sistemas de processamento de sinais sísmicos, programação
em supercomputadores, computação paralela de grande porte, etc...
A linguagem Fortran foi a primeira linguagem de alto nível usada para programação de
computadores. Foi proposta em 1953 por J. Backus, mas o seu primeiro compilador, feito
para o computador IBM 704, só foi liberado em 1957. Seu nome é formado pelas letras
iniciais das palavras FORmula TRANslation, que indicam sua principal inovação na época: a
facilidade de transcrição de fórmulas matemáticas para serem usadas em computadores.
Posteriormente, numerosos aperfeiçoamentos foram introduzidos em novas versões, sendo
principais as denominadas Fortran II (1958), Fortran IV (1961), Fortran 66 (1966) e o
Fortran 77 (1977), o qual resultou de um esforço para modernizar as versões anteriores e
formar um padrão que foi aprovado pelo American National Standards Institute (ANSI).
Dentre as modernizações destacam-se a introdução de estruturas de controle, (bloco IF) e
facilidades na manipulação de variáveis literais.
A próxima grande atualização da linguagem foi representada pelo Fortran 90. Dentre os
avanços do Fortran 90 podem-se destacar: new free source format (na versão Fortran 77, as
colunas 1 a 5 deveriam conter o número do comando ou declaração, quando usado, a coluna 6
era usada para indicar a continuação da linha anterior e os comandos deveriam estar
compreendidos entre as colunas 7 a 72 ao passo que na versão Fortran 90, pode-se iniciar a
digitação dos comandos na coluna 1); facilidades na criação e operações de manipulação de
arrays (vetores e matrizes); interfaces mais amigáveis; etc...
Nas próximas seções serão apresentadas algumas estruturas, palavras chaves, comandos de
atribuição, comandos de entrada e saída de dados, ferramentas para modularização (subrotinas
e funções) e aspectos em geral para construção de programas na linguagem Fortran, dando-se
ênfase à versão F90, porém fazendo uma analogia à versão F77 quando necessário.
Métodos Computacionais / 1º Semestre de 2005 3
Vale ressaltar que tanto no Fortran 77 quanto no Fortran 90, os espaços em branco são
irrelevantes e ignorados pelo programa compilador. Eles são considerados apenas nas
constantes literais.
* Nome ! Purpose:
* Declarações (não executáveis) ! To illustrate some of the basic features of a Fortran program.
* Linhas executáveis
* End program ! Declare de variables used in this program:
integer I,J,K
end program
Vale ressaltar que os programas fonte em Fortran escritos na versão F77 devem ter a
extensão “.for” ao passo que os programas fonte escritos na versão F90 devem possuir uma
extensão “.f90”. É através da extensão que o compilador reconhece em que versão o
programa fonte foi escrito. O compilador não aceitará o free source format se o arquivo
fonte for definido com a extensão “.for”.
Métodos Computacionais / 1º Semestre de 2005 5
6. Constantes e Variáveis:
As constantes, conforme o próprio nome diz, são entidades cujos valores são fixos ao
longo de todo o programa, não sendo possível alterar os seus valores durante a execução,
sendo declaradas através do comando parameter. Já as variáveis podem sofrer alterações ao
longo da execução do programa. A cada variável corresponde uma posição de memória, cujo
conteúdo pode variar ao longo do tempo, durante a execução do programa. Embora uma
variável possa assumir diferentes valores, ela só pode armazenar um valor a cada instante.
Toda constante ou variável é identificada por um nome ou identificador, cuja formação
obedece a determinadas regras:
1. Identificadores permitidos:
Nota, total, A, X5, Var1, A32B, F1G3H5, step_1,...
2. Identificadores não permitidos:
5B : começa pelo dígito 5
E(13) : contém os caracteres especiais ( )
A:B : contém o caractere especial :
Var A : contém espaço em branco
Var–A : contém o caractere especial – .
Observação: Não confundir o caractere “_ “ com o caractere “–“.
Conforme o seu tipo, as constantes e variáveis podem ser classificadas como numéricas
(inteiras ou reais), lógicas ou literais, entre outras.
No F77 havia uma regra de declaração implícita de variáveis, segundo a qual qualquer
variável que começasse com as letras (I, J, K, L, M, N) representavam variáveis inteiras
(integer) e todas as variáveis que começassem com outra letra diferente destas representavam
variáveis reais (real), a não ser que se declarasse diferente, de forma explícita. Desta forma
obtém-se declarando a variável inteira Juro1 de forma implícita e a variável real Juro2 de
forma explícita:
Real Juro2
Juro1 = 0.09 ! Resultado: Juro1 = 0 (integer)
Juro2 = 0.09 ! Resultado: Juro2 = 0.09 (real)
Embora seja permitido este tipo de declaração implícita, para maior clareza do programa é
aconselhável que as variáveis sejam declaradas explicitamente, o que pode ser feito da
seguinte forma, conforme o tipo de variável:
Pode-se inibir a declaração implícita com o comando: implicit none, colocado antes da
declaração de variáveis, no início do programa.
a) Explicitar:
Contador = 1
Taxa = 0.09
Word = ‘Met_Computacionais’
b) Utilizando declaração DATA:
DATA A,B,C /1,2,3.1415/ ! Observação: A = 1, B = 2 e C = 3.1415
c) Entrar via teclado (recomendado para pequena quantidade de dados).
d) Leitura de arquivo de entrada de dados (recomendado para grandes volumes).
Métodos Computacionais / 1º Semestre de 2005 7
Program exercise_2
! Objetivo:
! Ilustrar a utilização de diferentes tipos de variáveis.
end program
Valor de K = 4
Valor de var3 (simple precision) = 6.000000
Valor de var4 (double precision) = 6.000000000000000
Valor de flag3 =F
Valor de flag4 =T
Valor de flag5 =F
String const3 = Fortran90
Constante const 4 = 2500.000000000000000
Métodos Computacionais / 1º Semestre de 2005 8
Program exercise_3
! Objetivo: Ilustrar a leitura e impressão de dados em arquivos externos.
8. Comentários:
read(u,n) lista-de-identificadores
write(u,n) lista-de-identificadores
n format(especificação-de-edição)
Vale ressaltar que caso seja digitado o caractere asterisco na unidade de entrada do
comando read ou na unidade de saída do comando write, ou seja (u = *), isto significa que os
dados de entrada (read) e de saída (write) são respectivamente lidos e impressos na tela do
computador, não sendo utilizados arquivos externos de entrada ou saída de dados.
No caso do rótulo da especificação format ser definido com o símbolo asterisco (n = *),
não é necessário colocar o formato da entrada ou saída de dados, uma vez que os mesmos
serão lidos ou impressos em formato livre.
Recomenda-se que não seja utilizada formatação nos arquivos de entrada, uma vez que isto
pode ocasionar a leitura de dados de forma inadequada por um usuário desavisado.
Em um campo de saída, os números aparecem sempre alinhados à direita. Se o número for
negativo, um sinal “–“ é colocado antes do número e se o número for positivo, nenhum sinal é
colocado antes do número. Se o valor de um dado de saída precisar de mais posições do que
as previstas no formato, este será preenchido com asteriscos.
Program exercise_4
! Objetivo: Ilustrar a formatação de dados de saída
end program
Podem-se usar nas expressões aritméticas algumas funções muito comuns na matemática e
que são supridas pelo compilador Fortran. Na tabela abaixo são apresentadas algumas das
principais funções intrínsecas existentes no Fortran 90:
11.1 Exemplos:
Vale ressaltar que é possível abrir uma série de laços IF ou DO, um dentro do outro,
tomando-se o cuidado de sempre fechar os laços mais internos dentro dos laços mais externos.
Tal construção é conhecida pelo nome de ninho de IF ou de DO:
Para o caso de se querer usar uma estrutura de repetição, porém sem saber inicialmente
quantas vezes o laço de DO deve ser executado, pode-se utilizar o comando DO WHILE:
do while (expressão_lógica)
bloco_de_comandos
enddo
! Programa Principal
....
! Chamada da Sub-rotina S1:
call S1(...)
! Chamada da Sub-rotina S2:
call S2(...)
! Chamada da Função F1:
A = F1(...)
...
contains
subroutine S1(...)
bloco_de_comandos
end subroutine S1
subroutine S2(...)
bloco_de_comandos
end subroutine S2
function F1(...)
bloco_de_comandos
end function F1
End program ! Término do programa principal
Métodos Computacionais / 1º Semestre de 2005 14
! Declaração de variáveis:
integer var_1 ! variável simples
integer vector_1(5), vector_2(10)
real vector_3(4), matriz_1(3,3)
real*8 matriz_2(2,3),matriz_3(3,3,3) ! pode possuir até 7 dimensões em F90
...
vector_1(3) = 2 ! terceiro elemento da variável vector_1
matriz_1(1,2) = 3.0 ! elemento na primeira linha e segunda coluna de matriz_1
...
var_1 = 2*vector_1(4)+vector_2(10)
...
! tentar referenciar: vector_1(6), vector_1(0) ou vector_1(-2) produz erros
! tentar referenciar: vector_1(2.5) também produz erros
Porém, devem-se tomar certos cuidados: ao alterar o tamanho de um arranjo perde-se o seu
conteúdo e portanto deve-se armazenar o seu conteúdo em outro local caso se queira uma
cópia dos seus valores. Arranjos sem dimensões não podem ser passados para sub-rotinas
como argumentos, ou seja, é necessário fixar antes a sua dimensão. A seguir é apresentado o
funcionamento da alocação dinâmica de arranjos:
! declaração de variáveis:
! real*8, dimension(:), allocatable :: vector_1 ! vetor sem dimensão
! real*8, dimension(:,:), allocatable :: matriz_1 ! matriz sem dimensões
! integer n,m
...
read(*,*) n,m
allocate(vector_1(n)) ! definindo a dimensão do vetor
allocate(matriz_1(n,m)) ! definindo as dimensões da matriz
...
No Fortran F90 é possível fazer uma série de operações em parte ou na totalidade dos
elementos de um arranjo com expressões simples, sem a necessidade de se utilizar laços de
DO, conforme ocorria para o caso da versão F77:
! Declaração de Variáveis:
real*8 x(10),y(10),z(10),a(4),b(5),M(10,10),M1(3,3), prod
real*8 M2(3,2),M3(2,3), M4(3,3),M5(3,3)
...
z = x+y ! efetua a soma de cada um dos termos x(i)+y(i) isoladamente
z = x*3.0 ! efetua a multiplicação de cada um dos termos x(i) por 3.0
z =(x*y) ! efetua o produto de cada um dos termos x(i)*y(i) isoladamente
prod=sum(z) ! efetua o produto escalar dos vetores x*y
x=y ! arranjo x igual a y
a=x(1:4) ! inicializa o vetor a com os quatro primeiros termos de x
b(1:5)=x(1:5)+y(6:10) ! b(1)=x(1)+y(6), b(2)=x(2)+y(7), ...
M(1:10,1:10)=0.0 ! atribui o valor 0.0 a todos os termos da matriz M.
M1(1:3,1:3)=M(4:6,4:6) ! M1(1,1)=M(4,4), M1(1,2)=M(4,5),...
M3=transpose(M2) ! efetua a transposta da matriz
M5=M1+M4 ! soma de matrizes (mesma dimensão)
x(1:10) = M(1,1:10) ! vetor x igual a primeira linha da matriz M
MC=Matmul(MA,MB) ! multiplicação de matrizes: MA(n,m)*MB(m,k) = MC(n,k)
program exercise_5
! Objetivo: Definir a menção de um aluno com base na sua nota
! Declaração de variáveis:
real nota
! Entrada de Dados:
write(*,*) 'Digitar a nota do aluno: '
read (*,*) nota
if (nota<0.or.nota>10) then
write(*,*)'Nota deve ser positiva entre 0 e 10'
write(*,*)'Entre novamente com a nota:'
read (*,*) nota
endif
! Laços de IF:
if (nota==0) then
write(*,*)'Final Grade = SR'
elseif (nota>0.and.nota<3) then
write(*,*)'Final Grade = II'
elseif (nota>=3.and.nota<5) then
write(*,*)'Final Grade = MI'
elseif (nota>=5.and.nota<7) then
write(*,*)'Final Grade = MM'
elseif (nota>=7.and.nota<9) then
write(*,*)'Final Grade = MS'
else
write(*,*)'Final Grade = SS'
endif
end program
__________________________________________________________________________________________
program exercise_6
! Objetivo: Definir a menção de um aluno com base na sua nota e presença
! Declaração de variáveis:
real nota,attendance
! Entrada de Dados:
write(*,*) 'Digitar a nota do aluno: '
read (*,*) nota
if (nota<0.or.nota>10) then
write(*,*)'Nota deve ser positiva entre 0 e 10'
write(*,*)'Entre novamente com a nota:'
read (*,*) nota
endif
write(*,*) 'Digitar a presenca do aluno: '
read(*,*) attendance
! Laços de IF:
if (attendance<=75) then
write(*,*)'Final Grade = SR'
else
if (nota==0) then
write(*,*)'Final Grade = SR'
elseif (nota>0.and.nota<3) then
write(*,*)'Final Grade = II'
elseif (nota>=3.and.nota<5) then
write(*,*)'Final Grade = MI'
elseif (nota>=5.and.nota<7) then
write(*,*)'Final Grade = MM'
Métodos Computacionais / 1º Semestre de 2005 17
end program
__________________________________________________________________________________________
program exercise_7
! Declaração de variáveis:
integer i,meses
real saldo,juros,taxa
! Entrada de Dados:
write(*,*) 'Digitar saldo original: '
read (*,*) saldo
write(*,*) 'Digitar taxa de juros (0-100%): '
read (*,*) taxa
write(*,*) 'Digitar numero de meses: '
read (*,*) meses
taxa=taxa/100.0
! Laços de DO:
do i=1,meses
juros=taxa*saldo
saldo=saldo+juros
write(*,*)'Mes:',i,' Juros:',juros,' Saldo:',saldo
enddo
end program
__________________________________________________________________________________________
program exercise_8
! Objetivo: Rendimentos bancários
! Mostrar laço de DO aberto
! Declaração de variáveis:
integer meses
real saldo,juros,taxa
! Entrada de Dados:
write(*,*) 'Digitar saldo original: '
read (*,*) saldo
write(*,*) 'Digitar taxa de juros (0-100%): '
read (*,*) taxa
saldo_inicial=saldo
taxa=taxa/100.0
! Laços de DO:
do
meses=meses+1
juros=taxa*saldo
saldo=saldo+juros
write(*,*)'Mes:',meses,' Juros:',juros,' Saldo:',saldo
if (saldo>2*saldo_inicial) stop
enddo
end program
__________________________________________________________________________________________
Métodos Computacionais / 1º Semestre de 2005 18
program exercise_9
! Declaração de variáveis:
real numero,raiz
integer i
! Entrada de dados:
write(*,*)'Entrar com o numero: '
read (*,*) numero
raiz = 1 ! Chute inicial (Não importa que seja muito longe)
do i=1,10
raiz = 0.5*(raiz+numero/raiz)
write(*,*)'Iteration: ',i,' Raiz: ',raiz
enddo
write(*,*)'Raiz por iteracoes : ',raiz
write(*,*)'Raiz pela funcao SQRT: ',sqrt(numero)
end program
__________________________________________________________________________________________
program exercise_10
! Declaração de variáveis:
real M,L,W,A,dx,distance
integer i
! Características Geométricas:
L = 10.0 ! comprimento total da viga
W = 100.0 ! carregamento concentrado
A = 8.0 ! distância do carregamento concentrado ao apoio esquerdo
dx = L/10
end program
__________________________________________________________________________________________
Métodos Computacionais / 1º Semestre de 2005 19
program exercise_11
! Declaração de variáveis:
integer ifact ! cálculo do fatorial como integer
real*8 rfact ! cálculo do fatorial como real*8
character*15 fileout
! Cálculo do Fatorial
ifact=1
rfact=1.0d0
write(*,*) ' i ifact rfact'
write(10,*)' i ifact rfact'
do i=1,20
ifact=ifact*i
rfact=rfact*i
write(*,*)i,ifact,rfact
write(10,*)i,ifact,rfact
enddo
end program
i ifact rfact
1 1 1.000000000000000
2 2 2.000000000000000
3 6 6.000000000000000
4 24 24.000000000000000
5 120 120.000000000000000
6 720 720.000000000000000
7 5040 5040.000000000000000
8 40320 40320.000000000000000
9 362880 362880.000000000000000
10 3628800 3628800.000000000000000
11 39916800 3.991680000000000E+007
12 479001600 4.790016000000000E+008
13 1932053504 6.227020800000000E+009 ! Observação: 6.227e+09 = 6227000000 > 2147483647
14 1278945280 8.717829120000000E+010
15 2004310016 1.307674368000000E+012
16 2004189184 2.092278988800000E+013
17 -288522240 3.556874280960000E+014
18 -898433024 6.402373705728000E+015
19 109641728 1.216451004088320E+017
20 -2102132736 2.432902008176640E+018
__________________________________________________________________________________________
Métodos Computacionais / 1º Semestre de 2005 20
program exercise_12
! Entrada de Dados:
TOL=1.0E-05 !TOL: tolerância para evitar divisão por zero
write(*,*)'Calculo das raizes de uma equacao de segunda ordem'
write(*,*)'Valor de coeficiente quadratico: '
read (*,*) A
if (ABS(A).LT.TOL) then
write(*,*)'O coeficiente quadratico deve ser maior que 1.0E-05'
stop
endif
write(*,*)'Valor do coeficiente linear: '
read (*,*) B
write(*,*)'Valor do coeficiente independente: '
read(*,*) C
write(*,*)'Nome do arquivo de saida de dados: '
read(*,*) file_out
3. ( 2 raizes complexas )
CÁLCULO DAS RAIZES DE UMA EQUAÇÃO DE 2a ORDEM:
program exercise_13
! Objetivo: Escrever um programa que leia os comprimentos dos três lados a,b e c de um
! paralelepípedo, calcule e escreva o valor da sua diagonal e do seu volume:
! Volume = a*b*c e Diagonal = sqrt(sqrt(a^2+b^2)+c^2)
! Observação: Utilização de funções (function)
! Declaração de variáveis:
real a,b,c,d,vol
! Entrada de Dados;
write(*,*)'Entrar com os comprimentos dos lados (a,b,c):'
read (*,*) a,b,c
! Cálculo do volume e diagonal do paralelepípedo:
vol = volume(a,b,c)
d = hipotenusa(hipotenusa(a,b),c)
write(*,*) 'Volume = ',vol
write(*,*) 'Diagonal = ',d
contains
function volume(x,y,z)
real x,y,z,volume
volume =x*y*z
end function volume
function hipotenusa(x,y)
real x,y,hipotenusa
hipotenusa =sqrt(x**2+y**2)
end function hipotenusa
end program
__________________________________________________________________________________________
Métodos Computacionais / 1º Semestre de 2005 22
program exercise_14
! Objetivo: Escrever um programa que calcule a distância entre dois pontos no espaço,
! sendo fornecidas as coordenadas X1,Y1,Z1 e X2,Y2,Z2.
! Observação: Utilização de funções (function)
! Declaração de variáveis:
real x1,y1,z1,x2,y2,z2,dist
! Entrada de Dados;
write(*,*)'Entrar com as coordenadas X1,Y1 e Z1 do primeiro ponto:'
read (*,*) x1,y1,z1
write(*,*)'Entrar com as coordenadas X2,Y2 e Z2 do segundo ponto:'
read (*,*) x2,y2,z2
contains
function distance(x1,y1,z1,x2,y2,z2)
real x1,y1,z1,x2,y2,z2,distance
distance =sqrt((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)
end function distance
end program
__________________________________________________________________________________________
program exercise_15
! Declaração de variáveis:
real*8 fac_n
integer n
contains
subroutine factorial(n,fac_n)
real*8 fac_n
integer n
fac_n=1
do i=2,n
fac_n=i*fac_n
enddo
end subroutine factorial
end program
__________________________________________________________________________________________
Métodos Computacionais / 1º Semestre de 2005 23
program exercise_16
! Objetivo: Escrever um programa que calcule a função:
! exp(x)=1+x+(x^2/2!)+(x^3/3!)+...
! Observação: Na função acima deve-se incluir apenas os termos maiores que tol=1.0E0-6.
! Imprima os resultados e compare com a função interna exp
! Declaração de variáveis:
integer i
real*8 x,fexp,tol,parcela
character*15 file_out
! Entrada de dados:
write(*,*)'Calculo da funcao F=exp(x)'
write(*,*)
write(*,*)'Valor de x: '
read (*,*) x
write(*,*)'Nome do arquivo de saida de dados (Max=15char): '
read (*,*) file_out
contains
function fact(n)
integer n,j
real*8 fact,temp
temp=1
do j=2,n
temp=temp*j
enddo
fact=temp
end function fact
end program
Valor de x = 5.000000000000000
F(x)=1+x+(x^2/2!)+(x^3/3!)+... = 148.413158521647700
F(x)=exp(x) = 148.413159102576600
__________________________________________________________________________________________
Métodos Computacionais / 1º Semestre de 2005 24
program exercise_17
! Objetivo: Dados dois números distintos,colocá-los em ordem crescente
! Declaração de variáveis:
real*8 A,B
! Entrada de dados:
write(*,*) 'Entrar com os valores de A e B:'
read (*,*) A,B
write(*,10)A,B
10 format(/' Ordem original dos numeros: ',/,f10.2,/,f10.2)
contains
subroutine trocar(A,B)
real*8 A,B,aux
aux = A
A=B
B = aux
end subroutine trocar
end program
__________________________________________________________________________________________
program exercise_18
! Objetivo: Encontrar uma das raizes de uma função f(x)=0 usando o método de Newton
! Método de Newton: x = x-f(x)/df(x)
! Declaração de variáveis;
implicit none
integer :: its = 0 ! contador de iterações
integer :: maxits = 20 ! número máximo de iterações
logical :: converged = .false. ! indicador de convergência
real*8 :: toler = 1.0e-06 ! tolerância
real*8 :: x = 2.0d0 ! chute inicial
if (converged) then
write(*,*)' Metodo de Newton convergiu'
else
write(*,*)' Metodo de Newton Nao convergiu'
endif
write(*,*)' Raiz da funcao = ',x
Métodos Computacionais / 1º Semestre de 2005 25
contains
end program
__________________________________________________________________________________________
program exercise_19
! Objetivo: Calcular a média e o desvio padrão de uma série de números
! Declaração de Variáveis:
integer i,n
real std,media,x(100)
character*15 file_in
! Entrada de Dados:
write(*,*)'Nome do arquivo de entrada de dados (Max=15Char): '
read (*,*) file_in
open (unit=10, file=file_in, status='unknown')
media=0.0
std =0.0
read (10,*)n
do i=1,n
read(10,*)x(i)
media=media+x(i)
enddo
end program
__________________________________________________________________________________________
program exercise_20
! Objetivo: Calcular a média e o desvio padrão de uma série de números.
! Usar subrotinas e passar arranjo usando argumentos.
! Declaração de Variáveis:
integer i,n
real std,media,x(100)
character*15 file_in
! Entrada de Dados:
write(*,*)'Nome do arquivo de entrada de dados (Max=15Char): '
read (*,*) file_in
open (unit=10, file=file_in, status='unknown')
Métodos Computacionais / 1º Semestre de 2005 26
read (10,*)n
do i=1,n
read(10,*)x(i)
enddo
contains
! Subrotina Stats:
subroutine stats(x,n,media,std) ! passagem de argumentos
real std,media,x(100) ! variáveis privativas da subrotina (private)
integer i,n
media=0.0
std =0.0
do i=1,n
media=media+x(i)
enddo
media = media/n
do i=1,n
std=std+(x(i)-media)**2
enddo
std=sqrt(std/(n-1))
end subroutine stats
end program
__________________________________________________________________________________________
program exercise_21
! Declaração de Variáveis:
integer i,n
real std,media
character*15 file_in
real,dimension(:), allocatable::x ! Importante: declaração de variável sem dimensão definida
! Entrada de Dados:
write(*,*)'Nome do arquivo de entrada de dados (Max=15Char): '
read (*,*) file_in
open (unit=10, file=file_in, status='unknown')
read (10,*)n
allocate (x(n)) ! definir dimensão do vetor
do i=1,n
read(10,*)x(i)
enddo
contains
Métodos Computacionais / 1º Semestre de 2005 27
! Subrotina Stats:
subroutine stats(x,n,media,std) ! passagem de argumentos
real std,media ! variáveis privativas da subrotina (private)
integer i,n
real, dimension(:) :: x ! vetor alocado dinamicamente no programa principal
media=0.0
std =0.0
do i=1,n
media=media+x(i)
enddo
media = media/n
do i=1,n
std=std+(x(i)-media)**2
enddo
std=sqrt(std/(n-1))
end subroutine stats
end program
__________________________________________________________________________________________
program exercise_22
! Declaração de Variáveis:
integer tamanho,n
real, dimension(:), allocatable::x
end program
__________________________________________________________________________________________
program exercise_23
! Objetivo: Multiplicação de Matrizes: A(n,m)*B(m,k)=C(n,k),utilizando diferentes técnicas
! Declaração de Variáveis:
integer i,j,n,m,k
integer in,io
real, dimension(:,:), allocatable::A,B,C
character*15 file_in,file_out
Métodos Computacionais / 1º Semestre de 2005 28
! Entrada de Dados:
write(*,*)'Nome do arquivo de entrada de dados (Max=15char): '
read (*,*) file_in
open (in, file=file_in, status='unknown')
write(*,*)'Nome do arquivo de saída de dados (Max=15char): '
read (*,*) file_out
open (io, file=file_out, status='unknown')
read (in,*) n,m,k
allocate (A(n,m),B(m,k),C(n,k))
do i=1,n
read(in,*)(A(i,j),j=1,m)
enddo
do i=1,m
read(in,*)(B(i,j),j=1,k)
enddo
write(io,*)'Matriz A: '
do i=1,n
write(io,*)(A(i,j),j=1,m)
enddo
write(io,*)'Matriz B: '
do i=1,m
write(io,*)(B(i,j),j=1,k)
enddo
contains
Métodos Computacionais / 1º Semestre de 2005 29
subroutine prodF77(A,B,C)
real, dimension(:,:) :: A,B,C
integer i,j,l
do i=1,n
do j=1,k
C(i,j)=0.0
do l=1,m
C(i,j)=C(i,j)+A(i,l)*B(l,j)
enddo
enddo
enddo
end subroutine prodF77
subroutine prodF90(A,B,C)
real, dimension(:,:) :: A,B,C
integer i,j
C(1:n,1:k)= 0.0
do i=1,n
do j=1,k
C(i,j)=sum(A(i,1:m)*B(1:m,j))
enddo
enddo
end subroutine prodF90
subroutine prod_function(A,B,C)
real, dimension(:,:) :: A,B,C
C=Matmul(A,B)
end subroutine prod_function
end program
3 2 3 ! n,m,k
1.0 2.0
2.0 3.0
3.0 4.0
1.0 1.0 1.0
2.0 2.0 2.0
! *******************************************************
! Programa: Matrix
! Operações com vetores e matrizes no F90
! Author: Renato César Gavazza Menin
! *******************************************************
program matrix
! 3. Composição de matrizes:
! ---------------------------------
MABST(1:3,1:3)=MA
MABST(1:3,4:6)=MB
MABST(4:6,1:3)=MS
MABST(4:6,4:6)=MT
write(io,*)'Matriz MABST: '
do i=1,6
write(io,10)(MABST(i,j),j=1,6)
10 format(f4.1,X,f4.1,X,f4.1,X,f4.1,X,f4.1,X,f4.1)
enddo
! Configuração Inicial:
do i=1,3
do j=1,10
Config_C0(i,j)=i+j
enddo
enddo
E_0(1:3,1)=Config_C0(1,1:3)
E_0(1:3,2)=Config_C0(1,4:6)
E_0(1:3,3)=Config_C0(1,7:9)
write(io,*)'Matriz Config_C0: '
do i=1,3
write(io,15)(E_0(i,j),j=1,3)
15 format(f4.1,X,f4.1,X,f4.1)
enddo
! 4. Multiplicação de matrizes:
! ------------------------------------
! 4.1 Multiplicação de Matriz Quadrada por Escalar:
aM=2.0*MA
write(io,*)'Multiplicar matriz por escalar: '
do i=1,3
write(io,*)(aM(i,j),j=1,3)
enddo
! 4.2 Multiplicação de matrizes - Função Interna "MATMUL"
MM=MATMUL(MA,MB)
write(io,*)'Multiplicar matrizes - MA*MB: '
do i=1,3
write(io,*)(MM(i,j),j=1,3)
enddo
MABT=MATMUL(MM,MT)
write(io,*)'Multiplicar matrizes - MA*MB*MT: '
do i=1,3
write(io,*)(MABT(i,j),j=1,3)
enddo
MM=MATMUL(MM,MT)
write(io,*)'Multiplicar matrizes - MM=MA*MB*MT: '
do i=1,3
write(io,*)(MM(i,j),j=1,3)
enddo
MA=Matmul(MA,transpose(MA))
write(io,*)'[MA] = [MA]*transpose[MA]: '
do i=1,3
write(io,*)(MA(i,j),j=1,3)
enddo
CONTAINS
Subroutine cross(A,B,PV)
real*8 A(3),B(3),PV(3)
PV(1)=A(2)*B(3)-A(3)*B(2)
PV(2)=A(3)*B(1)-A(1)*B(3)
PV(3)=A(1)*B(2)-A(2)*B(1)
end subroutine cross
Function norm(V)
real*8 V(3),norm
norm=dsqrt(V(1)*V(1)+V(2)*V(2)+V(3)*V(3))
end function norm
Function vecmul(A,B)
real*8 A(3),B(3),mat(3,3),vecmul(3,3)
integer i,j
do i=1,3
do j=1,3
mat(i,j)=A(i)*B(j)
enddo
enddo
vecmul=mat
end function vecmul
Vetor Soma:
11.000000000000000
22.000000000000000
33.000000000000000
Vetor Subt:
-9.000000000000000
-18.000000000000000
-27.000000000000000
Matriz Transposta:
1.000000000000000 4.000000000000000 7.000000000000000
2.000000000000000 5.000000000000000 8.000000000000000
3.000000000000000 6.000000000000000 9.000000000000000
Soma de Matrizes:
2.000000000000000 2.000000000000000 3.000000000000000
4.000000000000000 6.000000000000000 6.000000000000000
7.000000000000000 8.000000000000000 10.000000000000000
Matriz MABST:
1.0 2.0 3.0 1.0 .0 .0
4.0 5.0 6.0 .0 1.0 .0
7.0 8.0 9.0 .0 .0 1.0
2.0 2.0 3.0 1.0 4.0 7.0
4.0 6.0 6.0 2.0 5.0 8.0
7.0 8.0 10.0 3.0 6.0 9.0
Matriz Config_C0:
2.0 5.0 8.0
3.0 6.0 9.0
4.0 7.0 10.0
Multiplicar matriz por escalar:
2.000000000000000 4.000000000000000 6.000000000000000
8.000000000000000 10.000000000000000 12.000000000000000
14.000000000000000 16.000000000000000 18.000000000000000
Multiplicar matrizes - MA*MB:
1.000000000000000 2.000000000000000 3.000000000000000
4.000000000000000 5.000000000000000 6.000000000000000
7.000000000000000 8.000000000000000 9.000000000000000
Multiplicar matrizes - MA*MB*MT:
14.000000000000000 32.000000000000000 50.000000000000000
32.000000000000000 77.000000000000000 122.000000000000000
50.000000000000000 122.000000000000000 194.000000000000000
Multiplicar matrizes - MM=MA*MB*MT:
14.000000000000000 32.000000000000000 50.000000000000000
32.000000000000000 77.000000000000000 122.000000000000000
50.000000000000000 122.000000000000000 194.000000000000000
Multiplicar matriz e vetor:
14.000000000000000
32.000000000000000
50.000000000000000
Métodos Computacionais / 1º Semestre de 2005 35
__________________________________________________________________________________________
REFERÊNCIAS BIBLIOGRÁFICAS:
• H.M. Deitel & P.J.Deitel, “Como programar em C”, Livros Técnicos e Científicos Editora, S.A., Rio de
Janeiro , 1994.
• S.J. Chapman, “Fortran 90/95 for Scientists and Engineers”, WCB/McGraw-Hill, USA, 1998.
• J. Liberty, “SAMS Teach Yourself C++ in 21 Days”, Fourth Edition, SAMS Publishing, Indiana / USA,
2001.
• A.Huerta, J. Sarrate, A.R. Ferran, “Métodos numéricos, Introducion, aplicaciones y programacion”,
Universiat Politécnica de Catalunya, Barcelona, 1998.
• H. Farrer, C.G. Becker, E.C. Faria, “Fortran Estruturado”, Editora Guanabara Koogan, Rio de Janeiro,
1992.
• P. W. Partridge, “Notas de aula do curso: Métodos Computacionais / 1º Semestre de 2002”, Brasília,
2002.