Você está na página 1de 26

Fsica Computacional 2

1
a
Aula
Flavio Aristone
FORTRAN
FORmula TRANsformation
Linguagem de BAIXO NVEL
Necessidade de controle absoluto sobre as
operaes que so feitas
Facilidade com nmeros
Ideal para clculos pesados
Programando
Encarar como uma folha de papel onde
vamos escrever PASSO a PASSO todas
as contas que vamos fazer para chegar ao
resultado que nos interessa
Diferente da realidade ou matemtica
conceitual, o LADO da equao
importante.
Exemplo
Matematicamente podemos concluir que:
Se x = a, ento (obviamente) a = x
J em FORTRAN isso NO verdade !
O lado ESQUERDO sempre de
DEFINIO. O lado DIREITO SEMPRE
CONFIRMAO
x = 5, ento x assume o valor 5
5 = x : isso NO existe em FORTRAN
Continuando
Voc pode dizer:
x = 5
e na prxima linha escrever:
x = 10
No tem problema algum.
Na mesma linha de raciocnio
x = 3
x = 5
x = x + 2

Quanto vale o X ?
Ele assume o valor 3. depois ele assume o
valor 5, ento na prxima linha ele vai valer
5 + 2, ou seja, 7!
Iniciando a escrever .
Program nome_do_programa
.
.
.
End program

No existe diferena entre MAISCULAS e
minsculas
Primeiro programa srio
program first
x = 2
print *, x
end program

2.000000
Segundo programa
program second
x = 2.0
print*,x = , x
pause
print*
x = log(x)
print*, x = , x
end program
x = 2.000000
Fortran Pause - Enter command<CR> or <CR> to continue.

x = 0.6931472
Definies
program nome
IMPLICIT REAL *8 (A-H,O-Z)
CHARACTER *4 :: gato
gato = dog
print 10, gato
10 format (gato = , A3)
end program

gato = dog
IMPLICIT REAL
*4 : preciso simples
*8 : dupla preciso
Program teste_precisao
Real*4::simples
Real*8::dupla
Simples = 1.0
Dupla = 1.0
Print*, precisao simples = ,simples
Print*, dupla precisao = , dupla
End program
precisao simples = 1.000000
dupla precisao = 1.00000000000000
SOMA
Para fazer a soma de J nmeros:
J = 100
Soma = 0.0
do I = 1, J
soma = soma + I
end do
Print *, soma
PRODUTO
J = 10
Prod = 1.0
do I = 1, j
prod = prod*I
end do
Print*, prod
INTEGRAL
Newton-Cotes: soma das reas
Regra do trapzio
Outras formas de aproximao
Gauss-Legendre
REGRA DO TRAPZIO
Dada uma funo, dividimos em diversos
intervalos, calculamos a rea embaixo de
cada intervalo, somamos
X
i+1

X
i

Y
i+1

Y
i

rea = (X
i+1
- X
i
) .(Y
i+1
+ Y
i
) / 2
Precisamos indexar o X e o Y
Como indexar?
Program indexar
Dimension::x(100)
do I = 1, 100
x(i) = I
print*, I, x(i)
end do
End program
Primeiro Problema
Calcular (numericamente) a seguinte
integral (definida):

}
=
2
1
) exp( dx x I
Como dividir o intervalo?
No caso o intervalo varia de 1 at 2. Para
ns ele sempre varia de xi (xinicial) at xf
(xfinal).
Precisamos escolher quanto spontos
vamos querer no intervalo. Digamos 100.
Digamos melhor: J, e depois s
mudarmos o J.
x
1
x
2
x
3
x
4
x
5
x
6

x
j

X
j-1
X
j-2
X
j-3

Nmero de pontos = J
Nmero de intervalos = J-1
ou ento
Nmero de pontos = J+1
Nmero de intervalos = J
O importante escolher, fixar e
ENTENDER o que estamos fazendo.
Finalmente
Vamos dividir o intervalo da integral (1,2), ou melhor, (xi,xf) em 100 intervalos,
ou melhor ainda, J intervalos.
Program divide_intervalo
Dimension::x(100)
J = 100
Xf = 2.0
Xi = 1.0
Intervalo = xf xi
Delta = intervalo/j
do I = 1, j+1
x(i) = xi + (i-1)*delta
end do
Print*,x
End program
Erros do programa anterior
Primeiro: intervalo uma varivel
INTEIRA a menos que eu defina de
outra forma

A dimenso de X est inferior ao
nmero de pontos: tem que ser
x(101)
1.000000 1.010000 1.020000 1.030000 1.040000
1.050000 1.060000 1.070000 1.080000 1.090000
1.100000 1.110000 1.120000 1.130000 1.140000
1.150000 1.160000 1.170000 1.180000 1.190000
1.200000 1.210000 1.220000 1.230000 1.240000
1.250000 1.260000 1.270000 1.280000 1.290000
1.300000 1.310000 1.320000 1.330000 1.340000
1.350000 1.360000 1.370000 1.380000 1.390000
1.400000 1.410000 1.420000 1.430000 1.440000
1.450000 1.460000 1.470000 1.480000 1.490000
1.500000 1.510000 1.520000 1.530000 1.540000
1.550000 1.560000 1.570000 1.580000 1.590000
1.600000 1.610000 1.620000 1.630000 1.640000
1.650000 1.660000 1.670000 1.680000 1.690000
1.700000 1.710000 1.720000 1.730000 1.740000
1.750000 1.760000 1.770000 1.780000 1.790000
1.800000 1.810000 1.820000 1.830000 1.840000
1.850000 1.860000 1.870000 1.880000 1.890000
1.900000 1.910000 1.920000 1.930000 1.940000
1.950000 1.960000 1.970000 1.980000 1.990000
2.000000
Press any key to continue
Agora vamos comear a fazer certo
program integracao
implicit real*8 (x,y)
real*8::integral, intervalo, delta
parameter(j=100)
dimension::x(j+1),y(j+1)
xf = 2.0
xi = 1.0
intervalo = xf - xi
delta = intervalo/j
do i= 1, j+1
xx = xi + (i-1)*delta
x(i) = xx
y(i) = dexp(-xx)
print*,i,xx,y(i)
end do
end program
program integracao
implicit real*4(x,y)
real*4::integral, intervalo, delta, area, soma, teorico
parameter(j=10)
dimension::x(j+1),y(j+1), area(j)
xf = 2.0
xi = 1.0
intervalo = xf - xi
delta = intervalo/j
! calculo dos pontos e dos valores da funcao nesses pontos
do i= 1, j+1
xx = xi + (i-1)*delta
x(i) = xx
y(i) = exp(-xx)
print*,i,xx,y(i)
end do
!calculo das areas dos trapzios
do i = 1, j
! area(i) = (y(i+1) + y(i))/2.0 * ( x(i+1) - x(i) )
area(i) = (y(i+1) + y(i))/2.0 * ( delta )
end do
!soma = integral
soma = 0.0
do i = 1, j
soma = soma + area(i)
end do
teorico = -(exp(-xf)-exp(-xi))
print*, soma, teorico
end program
Problema para prxima aula
Fazer a seguinte
integral:

}

=
0
2
) exp( dx x I
O resultado terico :
2
t
= I
Dicas
1. Faa a integral at 100 (suponha que infinito
= 100);
2. Faa a integra at 200 e compare com o valor
anterior;
3. Faa a seguinte transformao:



e compare com os resultados anteriores.

=
=
u u
u
d dx
x
) ( sec
) tan(
2

Você também pode gostar