MetComp 2014-2 IF-UFRJ
Métodos Computacionais em Física
Tatiana G. Rappoport tgrappoport@if.ufrj.br 2014-2
MetComp 2014-2 IF-UFRJ
Macros
• Funções facilitam a organização do programa. • Mas:
• as informações locais devem ser guardadas no ponto de chamada da função
• novas variáveis devem ser criadas e inicializadas, consumindo tempo de execução
• Se a função puder ser escrita em uma só́ linha podemos usar MACROS – são mais eficientes
• #define F(x) (5*(cos((x)*(x)-1.)-1./2))
• x pode ser um número, uma variá́vel ou uma expressãomais complexa. • Sempre que F(x) for encontrado, ele sera ́ substituído por
MetComp 2014-2 IF-UFRJ
Exemplos de macros
#include <stdio.h>
#define SQR(x) ((x)*(x))
#define CUBE(a) ((a)*(a)*(a))
#define MAXIMO(x,y) (((x) > (y)) ? (x) : (y)) #define MINIMO(x,y) (((x) < (y)) ? (x) : (y))
#define SOMA(x,y) x+y // Definicao errada
int main(){ double x = -5.0, y = 10.0; printf("SQR(x) = %f\n", SQR(x)); printf("CUBE(x) = %f\n", CUBE(x)); printf("MAXIMO(x,y) = %f\n", MAXIMO(x,y)); printf("MINIMO(x,y) = %f\n", MINIMO(x,y));
printf("Dobro de x+y = %f\n", 2*SOMA(x,y));//Errado return 0;
MetComp 2014-2 IF-UFRJ
Dividindo o programa em vários arquivos
• Ja ́ vimos como estruturar a lógica de um programa atravé́s de funções e macros
• Um programa grande, com vários includes, protótipos de funções, macros e constantes simbólicas, torna-se rapidamente de difícil leitura.
• Um programa deve caber na tela do computador
• Um programa deve ser dividido em vários arquivos
• Não precisamos ter uma có́pia da função em todos os programas principais
• Podemos compilar apenas o arquivo modificado
• Funções genéricas (p.ex. raiz de uma função) podem ser usadas em outros códigos
MetComp 2014-2 IF-UFRJ
Compilando
• Quando dividimos um programa em vários arquivos devemos incluir os .h em cada arquivo em que as definições contidas nesse arquivo sejam usadas.
• Compilando:
gcc -o executavel principal.c parte1.c parte2.c ...
• Para compilar um arquivo de implementação isoladamente (útil para achar erros):
gcc -c parte1.c
será criado um arquivo chamado parte1.o
• Para compilar o programa o comando é:
• gcc -o executavel.exe principal.c parte1.o parte2.c . . .
• Compare os programas contidos nos arquivos fatorial2.c (sem funções) e fatorial1.c (com funções).
MetComp 2014-2 IF-UFRJ
Sistema de equações diferenciais acopladas
• O método de Euler pode ser aplicado a sistemas de equações acopladas com mais de uma variável dependente e uma variável independente.
• Ex: problemas em duas ou mais dimensões, onde temos a posição das
partículas descritas por duas ou mais coordenadas dependentes do tempo.
• Aplicando o método de Euler, teriamos
Aplicando o m´etodo de Euler a cada uma delas, ter´ıamos:
y
1(x
i+1) = y
1(x
i) + hf
1(x
i, y
1(x
i), y
2(x
i), y
3(x
i))
y
2(x
i+1) = y
2(x
i) + hf
2(x
i, y
1(x
i), y
2(x
i), y
3(x
i))
y
3(x
i+1) = y
3(x
i) + hf
3(x
i, y
1(x
i), y
2(x
i), y
3(x
i))
· · ·
Devemos resolvˆe-las simultaneamente, calculando todas num dado x
iantes de passar a x
i+1.
Podemos tratar o conjunto de vari´aveis dependentes e suas respectivas
derivadas como componentes de um vetor. Introduzindo uma notac¸˜ao
vetorial:
Equac¸˜ao diferencial:
!y
!= !
f (x, !y(x))
Condic¸˜oes iniciais:
!y(x
0)
Soluc¸˜ao pelo m´etodo de Euler:
!y(x
i+1) = !y(x
i) + h !
f (x
i, !y(x
i))
M´etodos Computacionais em F´ısica I
7
Sistema de equac¸ ˜oes diferenciais acopladas
O m´etodo de Euler pode ser aplicado a sistemas de equac¸˜oes
acopladas, com mais de uma vari´avel dependente, todas func¸˜ao da mesma vari´avel independente.
Ex: problemas em duas ou mais dimens˜oes, onde temos a posic¸˜ao das part´ıculas descritas por duas ou mais coordenadas dependentes do
tempo. y! 1 = f1(x, y1, y2, y3) y! 2 = f2(x, y1, y2, y3) y! 3 = f3(x, y1, y2, y3) · · ·
conhecidas as condic¸˜oes iniciais y1(x0), y2(x0), y3(x0), · · ·
M´etodos Computacionais em F´ısica I 6
Sistema de equac¸ ˜oes diferenciais acopladas
O m´etodo de Euler pode ser aplicado a sistemas de equac¸˜oes
acopladas, com mais de uma vari´avel dependente, todas func¸˜ao da mesma vari´avel independente.
Ex: problemas em duas ou mais dimens˜oes, onde temos a posic¸˜ao das part´ıculas descritas por duas ou mais coordenadas dependentes do
tempo. y! 1 = f1(x, y1, y2, y3) y! 2 = f2(x, y1, y2, y3) y! 3 = f3(x, y1, y2, y3) · · ·
conhecidas as condic¸˜oes iniciais y1(x0), y2(x0), y3(x0), · · ·
M´etodos Computacionais em F´ısica I 6
conhecidas as condições iniciais
calculamos todos os y(xi) antes de passar
MetComp 2014-2 IF-UFRJ
Equações diferenciais de segunda ordem
• Como sistema de equações diferenciais de primeira ordem acopladas!
• Queremos resolver y”=f(x,y,y’) conhecidos y(0) e y’(0).
• Fazemos y1=y e y2=y’ ( a derivada de uma função é outra função!)
Equac¸ ˜oes diferenciais de segunda ordem
✘
como sistema de equac¸˜oes diferenciais de primeira
ordem acopladas
Queremos resolver
y
!!= f (x, y, y
!)
conhecidos
y(0)
e
y
!(0)
.
Seja y
1= y
e y
2= y
!( a derivada de uma func¸˜ao ´e outra func¸˜ao!).
Ent˜ao temos:
y
! 1= y
2y
! 2= f (x, y
1, y
2)
Aplicando o m´etodo de Euler simples a cada uma delas:
y
1(x
i+1) = y
1(x
i) + hy
2(x
i)
y
2(x
i+1) = y
2(x
i) + hf (x
i, y
1(x
i), y
2(x
i))
M´etodos Computacionais em F´ısica I
8
• Aplicando o método de Euler
Equac¸ ˜oes diferenciais de segunda ordem
✘
como sistema de equac¸˜oes diferenciais de primeira
ordem acopladas
Queremos resolver
y
!!= f (x, y, y
!)
conhecidos
y(0)
e
y
!(0)
.
Seja y
1= y
e y
2= y
!( a derivada de uma func¸˜ao ´e outra func¸˜ao!).
Ent˜ao temos:
y
! 1= y
2y
! 2= f (x, y
1, y
2)
Aplicando o m´etodo de Euler simples a cada uma delas:
y
1(x
i+1) = y
1(x
i) + hy
2(x
i)
y
2(x
i+1) = y
2(x
i) + hf (x
i, y
1(x
i), y
2(x
i))
MetComp 2014-2 IF-UFRJ
Exemplo: Pêndulo simples
A equação que descreve o movimento de um pêndulo é dada por:
Exemplo: Pˆendulo simples
A equac¸˜ao que descreve o movimento de um pˆendulo ´e dada por:
d
2θ/dt
2+
g
l
senθ = 0
podemos escrever dθ/dt = ω, d
2θ/dt
2= dω/dt
, de forma a ter duas
equac¸˜oes diferenciais acopladas
dθ/dt = ω
dω/dt = −
glsenθ
Chamando de #y o vetor cujas componentes s˜ao as func¸˜oes a serem
integradas, podemos fazer:
y[0] = θ
e teremos f [0] = dy[0]/dt = ω = y[1]
y[1] = ω
f [1] = dy[1]/dt = −
glsenθ = −
glsen(y[0])
M´etodos Computacionais em F´ısica I
9
mas
Exemplo: Pˆendulo simples
A equac¸˜ao que descreve o movimento de um pˆendulo ´e dada por:
d
2θ/dt
2+
g
l
senθ = 0
podemos escrever dθ/dt = ω, d
2θ/dt
2= dω/dt, de forma a ter duas
equac¸˜oes diferenciais acopladas
dθ/dt = ω
dω/dt = −
glsenθ
Chamando de #y o vetor cujas componentes s˜ao as func¸˜oes a serem
integradas, podemos fazer:
y[0] = θ
e teremos
f [0] = dy[0]/dt = ω = y[1]
y[1] = ω
f [1] = dy[1]/dt = −
glsenθ = −
glsen(y[0])
M´etodos Computacionais em F´ısica I
9
Exemplo: Pˆendulo simples
A equac¸˜ao que descreve o movimento de um pˆendulo ´e dada por:
d
2θ/dt
2+
g
l
senθ = 0
podemos escrever dθ/dt = ω, d
2θ/dt
2= dω/dt, de forma a ter duas
equac¸˜oes diferenciais acopladas
dθ/dt = ω
dω/dt = −
glsenθ
Chamando de #y o vetor cujas componentes s˜ao as func¸˜oes a serem
integradas, podemos fazer:
y[0] = θ
e teremos
f [0] = dy[0]/dt = ω = y[1]
y[1] = ω
f [1] = dy[1]/dt = −
glsenθ = −
glsen(y[0])
M´etodos Computacionais em F´ısica I
9
Podemos criar um vetor cujas componentes são as funções a serem integradas
Exemplo: Pˆendulo simples
A equac¸˜ao que descreve o movimento de um pˆendulo ´e dada por: d2θ/dt2 + g
l senθ = 0
podemos escrever dθ/dt = ω, d2θ/dt2 = dω/dt, de forma a ter duas
equac¸˜oes diferenciais acopladas
dθ/dt = ω
dω/dt = −gl senθ
Chamando de #y o vetor cujas componentes s˜ao as func¸˜oes a serem integradas, podemos fazer:
y[0] = θ e teremos f [0] = dy[0]/dt = ω = y[1]
y[1] = ω f [1] = dy[1]/dt = −gl senθ = −gl sen(y[0])
MetComp 2014-2 IF-UFRJ
Projétil com resistência do ar
• Desejamos calcular a trajetória de um corpo lançado para cima com um certo ângulo se considerarmos a resistência do ar.
• Existem vários regimes de resistência do ar.
• Modelo simples com dependência com a velocidade na forma
F
x=
B
2v
2cos(✓)
F
y=
B
2v
2sen(✓)
F
x=
B
2vv
xF
y=
B
2vv
yF
r⇡ B
1v
B
2v
2 Velocidade alta! M´et Comp Eq. diferenciais de primeira ordem EDO primeira ordem: Revis˜ao do M´etodo de Euler Sistema de equac¸ ˜oes diferenciais acopladas Equac¸ ˜oes diferenciais de segunda ordem Melhorando o M´etodo de Euler Runge-Kutta de Quarta Ordem C: Divis˜ao do Programa em Arquivos x y v vy vx F Fx Fy !F
x=
B
2v
2cos✓
(1)
F
y=
B
2v
2sen✓
F
x=
B
2vv
xF
y=
B
2vv
yEnt˜ao as equac¸˜oes
de movimento para x e y s˜ao escritas como
m
d
2x
dt
2=
B
2vv
xe
m
d
2y
dt
2=
B
2vv
ymg
y
x
MetComp 2014-2 IF-UFRJ
Projétil com resistência do ar
• Equações diferenciais
m
d
2x
dt
2=
B
2vv
xm
d
2y
dt
2=
B
2vv
ymg
dx
dt
= v
xdv
xdt
=
B
2m
q
v
x2+ v
y2v
xdy
dt
= v
ydv
ydt
=
B
2m
q
v
x2+ v
y2v
yg
duas equações diferenciais de segunda ordem
quatro equações diferenciais de primeira ordem
MetComp 2014-2 IF-UFRJ
Preparando o programa
• Podemos escrever as equações de forma compacta definindo um vetor de quatro componentes
d~
S
dt
= ~
f (~
S)
j
S[j]
f [j]
0
x
v
x1
v
x B2 mq
v
x2+ v
y2v
x2
y
v
y1
v
x B2 mq
v
x2+ v
y2v
xMetComp 2014-2 IF-UFRJ
Mastigando um pouco mais
M´et Comp Eq. diferenciais de primeira ordem EDO primeira ordem: Revis˜ao do M´etodo de Euler Sistema de equac¸ ˜oes diferenciais acopladas Equac¸ ˜oes diferenciais de segunda ordem Melhorando o M´etodo de Euler Runge-Kutta de Quarta Ordem C: Divis˜ao do Programa em Arquivos j S[j] f [j] 0 x vx 1 vx B2m q vx2 + vy2 vx 2 y vy 3 vy B2m q vx2 + vy2 vy g
As equac¸˜oes que definem a dinˆamica podem ent˜ao ser reescritas como dS[0] dt = f [0] = S[1] (7) dS[1] dt = f [1] = B2 m q S[1]2 + S[3]2 S[1] dS[2] dt = f [2] = S[3] dS[3] dt = f [3] = B2 m q S[1]2 + S[3]2 S[3] g
j
S[j]
f [j]
0
x
v
x1
v
x B2 mq
v
2 x+ v
y2v
x2
y
v
y1
v
x B2 mq
v
2 x+ v
y2v
xMetComp 2014-2 IF-UFRJ
Exercício
• Escreva um programa para resolver uma equação diferencial de segunda ordem usando o método de Euler. Utilize a ideia de separar o programa em arquivos.
• Como teste, resolva a equação diferencial para o movimento do pêndulo, que tem solução analítica para ângulos pequenos.
• Utilize diferentes valores de Δt e faça um gráfico no gnuplot contendo a solução analítica e outras três soluções para Δt diferentes.