Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ESCOLA POLITCNICA
DEPARTAMENTO DE MECNICA APLICADA E ESTRUTURAS
TRABALHO 1
TCNICAS COMPUTACIONAIS EM ENGENHARIA CIVIL
DETERMINAO DE REA DE CIRCUNFERNCIA - MTODO DE MONTE CARLO
Professor: Magluta
Aluna: Rachel Wysard Soares
DRE: 105038847
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
2 / 10
I. INTRODUO
O presente trabalho objetiva desenvolver, em linguagem de programao
Fortran, um programa que calcule a rea de uma circunferncia a partir do Mtodo de
Monte Carlo.
II. DESCRIO DO PROGRAMA
Cada trecho do programa ser comentado (comentrios aps pontos de
exclamao). O programa completo pode ser visto no arquivo com a extenso do
Fortran, assim como seu executvel, na pasta Debug.
III. CDIGO FONTE
Abaixo ser apresentado o cdigo fonte do programa, com cada trecho
comentado, para melhor compreenso do programa.
PROGRAM MMC
USE DFPORT !Esse termo indica que o Fortran deve buscar na biblioteca especifica dessa versao digital algum
modulo (no caso a funcao randomica RAND)
IMPLICIT NONE
INTEGER :: n
INTEGER :: int
INTEGER :: processo
INTEGER :: ext
INTEGER :: ptos
CHARACTER(len=15) :: continua
REAL :: rc
REAL :: x
REAL :: y
REAL :: amc
REAL :: erro
REAL :: area
REAL :: pi
REAL :: ertol
WRITE(*,*)'=============================================='
WRITE(*,*)' UFRJ-EP-DME '
WRITE(*,*)' Tecnicas Computacionais em Engenharia Civil '
WRITE(*,*)' '
WRITE(*,*)'Uso do metodo de Monte Carlo para determinacao'
WRITE(*,*)' de area de uma circunferencia '
WRITE(*,*)' '
WRITE(*,*)' '
WRITE(*,*)' Aluna: Rachel Wysard Soares DRE: 105038847 '
WRITE(*,*)'=============================================='
pi = 3.14159265359
continua='s'
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
3 / 10
DO WHILE (continua=='s') !Rotina para que o programa reinicie caso o usuario deseje.
WRITE(*,*)''
WRITE(*,*)'Para calcular fornecendo a precisao do calculo digite 1'
WRITE(*,*)'Para calcular fornecendo a quantidade de pontos digite 2'
WRITE(*,*)''
READ (*,*)processo
WRITE(*,*)''
IF (processo/=1 .AND. processo/=2) THEN
!Indica ao usuario que a opcao escolhida e invalida (caso ele nao digite 1 ou 2
!e que o programa sera encerrado
WRITE(*,*)''
WRITE(*,*)'Essa opcao nao e valida!'
WRITE(*,*)'O programa sera encerrado.'
WRITE(*,*)''
EXIT
END IF
IF (processo==1) THEN !Indica ao usuario qual a opcao escolhida
WRITE(*,*)''
WRITE(*,*)'Voce deseja calcular fornecendo a precisao.'
WRITE(*,*)''
END IF
IF (processo==2) THEN !Indica ao usuario qual a opcao escolhida
WRITE(*,*)''
WRITE(*,*)'Voce deseja calcular fornecendo a quantidade de pontos'
WRITE(*,*)''
END IF
WRITE(*,*)''
WRITE(*,*)'Forneca o raio da circunferencia.'
WRITE(*,*)''
READ (*,*)rc !Leitura do raio da circunferencia fornecido pelo usuario
IF (processo==1) THEN !Rotina da a opcao ao usuario de fornecer o erro limite do calculo
WRITE(*,*)''
WRITE(*,*)'Forneca o erro toleravel para o calculo:'
WRITE(*,*)''
READ (*,*)ertol
!Leitura do erro que o usuario considera toleravel para calcular
int = 0 !Inicio da contagem de numeros internos a circunferencia
ptos = 1 !Inicio da contagem de pontos
continua = 's' !Continua enquanto o erro encontrado e superior ao tolerado
DO WHILE ( continua=='s' ) !Inicio da contagem de numeros internos a circunferencia
DO n=1,ptos
!Rotina que calcula para a quantidade de pontos que o usuario desejar um numero randomico e
!verifica se ele esta dentro da circunferencia
x = 2*rc*rand()
!Rand e a funcao que gera o numero randomico, depois ele e multiplicado por duas vezes o raio
!sendo esse o lado do quadrado tangente a circunferencia
y = 2*rc*rand() !Para obtencao das coordenadas x e y
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
4 / 10
IF ( ((x-rc)*(x-rc) + (y-rc)*(y-rc)) <= (rc*rc) ) THEN
!Verificacao se o ponto encontra-se ou nao no interior da circunferencia
!Inicio da contagem de numeros internos a circunferencia
int = int + 1 !Caso esteja dentro soma um no contador
END IF
ext = ptos - int !Calculo de pontos externos,
!subtrai o numero de pontos internos do total de pontos
amc = 4 * int * rc * rc / ptos
!Calculo da area pelo processo de Monte Carlo. Multiplica-se o numero total
!interno gerados randomicamente pela area do quadrado tangente a circunferencia
area = pi * rc * rc !Calculo da area da circunferencia pelo metodo tradicional
erro = ABS( (area-amc)/(area) )*100 !Calculo do erro do metodo
IF (erro>=ertol) THEN !Verificacao se erro esta dentro do tolerado pelo usuario
!Se no estiver, aumenta o numero de pontos e retorna a rotina de calculo
!Se toleravel, encerra o calculo
ptos = ptos+1
continua = 's'
ELSE IF (erro<ertol) THEN
continua='n'
IF (continua=='n') EXIT
END IF
END DO
END DO
END IF
IF (processo==2) THEN
!Rotina da a opcao ao usuario de fornecer o numero de pontos para o calculo
WRITE(*,*)''
WRITE(*,*)'Forneca a quantidade de pontos que deseja calcular:'
WRITE(*,*)''
READ (*,*)ptos
!Leitura do numero de pontos com o qual o usuario quer calcular
int = 0 !Inicio da contagem de numeros internos a circunferencia
DO n = 1,ptos
!Rotina que calcula para a quantidade de pontos que o usuario desejar um numero randomico e
!verifica se ele esta dentro da circunferencia
x = 2*rc*rand()
!Rand e a funcao que gera o numero randomico, depois ele e multiplicado por duas vezes o raio
!sendo esse o lado do quadrado tangente a circunferencia
y = 2*rc*rand() !Para obtencao das coordenadas x e y
IF ( ((x-rc)*(x-rc) + (y-rc)*(y-rc)) <= (rc*rc) ) THEN
!Verificacao se o ponto encontra-se ou nao no interior da circunferencia
int = int + 1 !Caso esteja dentro soma um no contador
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
5 / 10
END IF
END DO
ext = ptos - int !Calculo de pontos externos,
!subtrai o numero de pontos internos do total de pontos fornecido pelo usuario
amc = 4 * int * rc * rc / ptos
!Calculo da area pelo processo de Monte Carlo. Multiplica-se o numero total
!interno gerados randomicamente pela area do quadrado tangente a circunferencia
area = pi * rc * rc !Calculo da area da circunferencia pelo metodo tradicional
erro = ABS( (area-amc)/(area) )*100 !Calculo do erro do metodo
END IF
!Saida do programa fornecendo as informacoes calculadas ao usuario
WRITE(*,*)'============================================='
WRITE(*,*)''
WRITE(*,*)'Raio da circunferencia: ',rc
WRITE(*,*)''
WRITE(*,*)'Total de pontos: ',ptos
WRITE(*,*)''
WRITE(*,*)'Area calculada por Monte Carlo: ',amc
WRITE(*,*)''
WRITE(*,*)'Area real (pi*r^2): ',area
WRITE(*,*)''
WRITE(*,*)'Erro (%) : ',erro
WRITE(*,*)''
WRITE(*,*)'============================================='
WRITE(*,*)''
WRITE(*,*)'Reiniciar o programa? (s/n)'
WRITE(*,*)''
READ(*,*)continua
IF (continua=='n') EXIT
END DO
END PROGRAM MMC
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
6 / 10
IV. CONCLUSO
Na execuo do programa percebe-se que o mtodo foi implementado
corretamente, j que fornece valores prximos aos da rea da circunferncia quanto
maiores os nmeros de pontos fornecidos ou quanto menor o erro tolerado. Abaixo
algumas figuras representativas do programa em execuo.
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
7 / 10
Ao compararmos o programa em Fortran com outro implementado em
Mathcad, percebemos que os resultados numricos ficam muito prximos, levando
concluso de que ambos os programas so eficazes no sentido de retornos de
resultados. O programa em Fortran demonstra, porm, eficincia maior, j que ao
comearmos a aumentar a preciso (aumentar o nmero de pontos ou diminuir
consideravelmente a tolerncia ao erro) vemos que o programa em Mathcad tem uma
limitao maior (comea a demorar muito a retornar resultados, trava, etc). O retorno
de resultados do programa em Mathcad para o mesmo exemplo de circunferncia
rodado anteriormente em Fortran encontra-se abaixo:
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
8 / 10
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
9 / 10
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
ESCOLA POLITCNICA - DME
Tcnicas Computacionais em Engenharia Civil
2010/2
Professor: Magluta
10 / 10