Sei sulla pagina 1di 10

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO

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

Potrebbero piacerti anche