FIS045
Métodos Computacionais em física
Cap 7: Equações diferenciais parciais
Prof. Gustavo Guerrero (sala 4120)
e-mail para enviar as listas de exercicios:
s045.ufmg@gmail.com
Universidade Federal de Minas Gerais
2017
Introdução
Em ciências naturais comunmente encontramos problemas com muitas variáveis limitadas por condições de iniciais e de contorno. A grande maioria desses problemas pode ser modelado por equações diferenciais parciais (EDP). Um caso familiar de EDP é a equação de onda que em 1 dimensão tem a forma:
∂2u ∂x2 = A
∂2u
∂t2 (1)
Onde A é uma constante. A solução u depende de variáveis espaciais e temporais, i.e., u = u(x, t)
Eq. de onda em duas dimensões, (
equação hiperbólica
)
Em duas dimensões temos u = u(x, y, t) (u por simplicidade). Essa equação aparece em e.g., ondas em uma mola, ondas de pressão, ondas de supercie, ondas eletromagnéticas, ondas de som.
∂2u ∂x2 + ∂2u ∂y2 = A ∂2u ∂t2,
Equação de difusão (
equação parabólica
)
A equação de difuão em uma dimensão é: ∂2u ∂x2 = A
∂u
∂t (2)
Nesse caso A é chamada de constante de difusão. Pode ser usada para um grande número de processos difusivos, desde a difusão de moléculas, calor ou campo magnético.
As equações hiperbólica e parabólica são chamados problemas de valor inicial (ou problemas de Cauchy). O valor de u é conhecido em um tempo inicial e a equação descreve como u(x, t) se propaga no espaço e no tempo.
Equação de Laplace (
equação elíptica
)
A equação de Laplace aparece em electrostática, é similar a equação de onda, exeto que A = 0:
∂2u ∂x2+
∂2u
∂y2 =0, (3)
Ou, em caso de existur uma carga representada por uma densidade de carga ρ(x), temos a equação de Poisson:
∂2u ∂x2 +
∂2u
∂y2 = −4πρ(x). (4) Na equação elíptica queremos encontrar uma solução estática u(x, y) que satisfaz a equação numa região (x, y) de interesse. Esse tipo de
problemas são chamado problemas de contorno, com:
I Condições de Dirichlet: especica valores nas fronteiras como
função do tempo.
I Condições de Neumann: especica os valores dos gradientes
normais.
I Condições abertas: permitem o uxo das quantidades através das
Equação de Schroedinger
Em mecanica quantica temos a equação de Schroedinger que em duas dimensões tem a forma:
−∂2u ∂x2 − ∂2u ∂y2+ f (x , y )u = ı ∂u ∂t.
Equações de Maxwell
Um importante sistema de equações diferenciais parciais lineares são as equações de Maxwell, que no caso de carga nula são:
∂E
∂t =curlB, −curlE = B, divE = divB = 0.
Equações de Euler
Um conhecido sistema de EDP não lineares são as equações de Eular, as quais para um caso de um uido incompresivel é não viscoso são:
∂u ∂t + (u · ∇)u = −Dp; divu = 0, onde p é a pressão, e ∇ = ∂ ∂xeˆx+ ∂ ∂yeˆy,
é o operador gradiente. No caso de um uido viscoso temos a equação de Navier-Stokes:
∂u
Equações de uxo-conservativo, problemas de valor inicial
Um grande número de problemas de valor inicial são as equações de uxo conservativo:
∂u ∂t = −
∂F(u) ∂x =0,
onde o vetor F é chamado de uxo conservado. Como exemplo, considere uma equação hiperbólica padrão, i.e., a equação de onda 1D com velocidade de propagação v:
∂2u ∂t2 = v
2∂2u
∂x2, que pode ser escrita como o sistema de equações:
∂r ∂t = v ∂s ∂x, ∂s ∂t = v ∂r ∂x
(eq. de Maxwell em 1D para propagação de uma onda EM???? ) com r ≡ v∂u
∂x, s ≡ ∂u ∂t
Neste caso r e s são as duas componentes de u e o uxo é dado por F = 0 −v −v 0 ·u
Logo, uma possível solução numérica para uma equação hiperbólica consiste em resolver a equação de uxo conservativo.
∂u ∂t = −v
∂u ∂x
A partir da solução analítica, sabemos a solução de essa equação é uma onda que se propaga na direção positiva do eixo x: u = f (x − vt). Vamos estudar inicialmente como várias estrategias para resolver esse problema numericamente.
Diferenças nitas
Usamos diferenças nitas para discretizar a equação acima com pontos igualmente espaçados nos eixos t e x:
xi = x0+ j ∆x , j =0, 1, ..., J
tn= t0+ n∆t, n =0, 1, ..., N
Temos varias alternativas para representar a derivada temporal, a mais obvia a diferenciação de eular para frente.
∂u ∂t =
ujn+1− un j
∆t + O(∆t)
Calculamos um valor desconhecido, n + 1 em termos dos valores desconhecidos, n. Para a derivada espacial podemos usar a rep. de segunda ordem forward time centered space (FTCS):
∂u ∂x = un j +1− u n j −1 2∆x + O(∆x2)
O que resulta em ujn+1− un j ∆t = −v unj +1− un j −1 2∆x (5)
É um algoritmo explícito, simple, ocupa pouca memoria e é rapido.
Infelizmente não funciona.
Analise de estabilidade de von Neumann: Imagine os coecientes das equações variar tão suavemente que podem ser considerados constantes. Nesse caso, soluções independentes da equação tem a forma:
ujn= ζneikj ∆x (6)
Com k: número de onda espacial e ζ = ζ(k) é um número complexo. A dependência temporal dessa solução para um automodo simples, é uma suscesão de numeros complexos que dependem de k. Assim, se |ζ(k)| >1 implica modos que crescem exponencialmente (uma instabilidade numérica).
Substituindo (6) em (5) temos e dividindo por ζntemos (ver
ζ(k) =1 − iv ∆t
∆x sin(k∆x)
com modulo > 1 para todo k. Assim o esquema é incondicionalmente instável.
Método de Lax: O método FTCS pode "ser curado"fazendo uma mudança simples introduzida por Lax. Remplazamos un
j na derivada
temporal por sua média:
ujn→ 1
2(uj +n 1+ u n j −1),
o que resulta em: un+j 1= 1 2(unj +1+ u n j −1) − v ∆t un j +1− unj −1 2∆x (7) Substituindo (6) em (7) encontramos: ζ(k) = cos(k∆x ) − iv ∆t ∆x sin(k∆x),
que para representar um sistema estável requer: |v |∆t
∆x ≤1.
Esse o famoso criterio de estabilidade de Courant-Friedrichs-Lewy, mais conhecido como a condição de Courant.
Mas como uma mudança tão simples estabiliza o código? (resolver EDP é uma arte mais do quem uma ciência.) Podemos desmiticar essa arte reescrevendo a equação (7) na forma:
ujn+1− un j ∆t = −v unj +1− un j −1 2∆x + 1 2 uj +n 1−2un j + u n j −1 ∆t , (8)
que é a representação exata em FTCS da equação: ∂u ∂t = −v ∂u ∂x + (∆x )2 2∆t ∇2u
i.e., adicionamos um termo difusivo a equação de uxo conservativo. O esquema de Lax têm difusão numérica ou viscosidade numérica.
Segunda ordem de precisao em tempo
Metodo de Lax-Wendro: é um método de segunda ordem em tempo que elimina grande dissipação numérica. Devemos denir passos
intermediarios, uj +1/2em passos de tempo intermediarios, tn+1/2e no
ponto intermediario da grade, xj +1/2. Esses pontos são calculados pelo
método de Lax: uj +n+1/21/2= 1 2(unj +1+ u n j) − ∆t 2∆x(Fj +n1− F n j ) (9)
Usando essas variáveis podem se calcular, Fn+1/2
j ±1/2, depois o valor de u n+1 j
pode ser calculado usando diferenças centradas: ujn+1= ujn− ∆t ∆x(F n+1/2 j +1/2 − F n+1/2 j −1/2) (10)
Substituindo (9) em (10), com F = vu, e α = v∆t/∆x, temos: ujn+1= ujn−α 2 1 2(uj +n 1+ u n j −1) − α 2(unj +1−2u n j − u n j −1)
Figura:Representação do método de 2 passos de Lax-Wendro. Os pontos com a × são calculados com o método de Lax. Esses pontos, mais os 3 pontos originais, permitem calcular o ponto un+1
j . O método
tem segunda ordem de precisão em tempo. O salto no ponto un+1/2
j é
conhecido como leapfrog.
Infelizmente o método de Lax-Wendro pode levar a outra clase de erros conhecida como erros de fase, gerando oscilações em comprimentos de onda pequenos.
Podemos aprofundar mais no problema da advecção: Nos métodos de Euler e Lax, assumimos que dentro de cada celda o uxo, vu, se mantém constante. Mas isso é só uma suposição. Podemos supor também que o estado dentro de cada celula é uma função linear da posição, ou um picewise linear subgrid scale model.
Dentro de cada celda, o estado no começo de um passo temporal é: u(x , t = tn) = unj + σ(x − xj) , para xj −1/2< x < xj +1/2
Onde σn
j é uma inclinação (slope), e xj = (xj −1/2− xj +1/2)/2. Na
interface, o uxo varia no tempo entre tne tn+1:
Fj −1/2(t) = vu(x = xj −1/2, t) = vunj −1+ v σnj −1(xj −1/2− xj −1− v (t − tn)) = vunj −1+ v σ n j −1 ∆x 2 − v (t − tn)
De forma similar para Fj +1/2(t). O uxo médio durante o passo temporal ∆té: < Fj −1/2(t) > tn+1 tn = 1 ∆t Z tn+1 tn vu(x = xj −1/2, t) = vunj −11 2v σnj −1(∆x − v ∆t)
Com um resultado similar para < Fj +1/2(t) > tn+1 tn . A diferença é: < Fj +1/2(t) > tn+1 tn − < Fj −1/2(t) > tn+1 tn = v (u n j − u n j −1) + 1 2v (σjn− σ n i −1)(∆x − v ∆t)
Finalmente usando a equação (10) acima: ujn+1= ujn− ∆t ∆x(F n+1/2 j +1/2 − F n+1/2 j −1/2) temos: un+j 1= ujn− v ∆t ∆x (u n j − u n j −1) − v ∆t ∆x 1 2(σ n j − σ n i −1)(∆x − v ∆t)
A questão é agora, como escolher a inclinação apropriada? centered slope : σj = un j +1−unj −1 2∆x Fromm0s method upwind slope : σj = unj−un j −1
2∆x Beam − Warming method
downwind slope : σj = unj +1−un
j
Limitadores de inclinação
Métodos de alta ordem como Beam-Warming ou Lax-Wendro temdem a produzir oscillações como consequência de erros de fase ou super estimação da inclinação.
Para corrigir esse problema se utilizam os limitadores de inclinação. A inclinação, σj é modicada unicamente quando necessário.
Para medir oscilações em uma solução numérica denimos a variação total (TV) do estado u: TV (u) − N X i =1 |qi− qi −1|,
Se a quantidade u varia monotonicamente, TV se mantém constante, se udesenvolve máximos ou minimos, então TV aumenta. Um esquema é chamado de redutor da variação total (TVD), se:
TV (un+1) ≤ TV (un) Alguns limitadores de inclinação são:
I inclinação minmod σn=minmod un j − u n j −1 ∆x , unj +1− un j ∆x onde minmod(a, b) = ( a sim |a| < |b| e ab >0 b sim |a| > |b| e ab >0 0 sim ab <0 )
I inclinação superbee σn=maxmodσ(j1), σ(j2) Com: σ(j1)=minmod un j +1− u n j ∆x ,2 unj − un j −1 ∆x σ(j2)=minmod 2u n j +1− u n j ∆x , un j − u n j −1 ∆x
Equação de difusão
Procuramos a seguir a solução numérica da equação de difusão: ∂u
∂t = −D ∂2u
∂x2 (11)
Onde D é o coeciente de difusividade. Podemos resolver a equação usando diferenças nitas de forma explicita:
ujn+1− un j ∆t = D uj +n 1−2un j + u n j −1 ∆x2
A analise de estabilidade de von-Neumann indica que esse método é estavel sob a condição:
D∆t ∆x2 <
1 2
Outra possibilidade é expresar (11) em forma implícita: un+j 1− un j ∆t = D un+j +11−2ujn+1+ un+j −11 ∆x2 assim:
ujn+1− ηuj +n+11+2ηujn+1− ηuj −n+11= ujn −ηuj +n+11+ (1 + 2η)ujn+1− ηun+j −11= ujn com η = D∆t/∆x2. Pode se ver o sistema tridiagonal:
ˆ AUj +1=Uj onde A = 1 + 2η −eta 0 0 ... −η 1 + 2η −eta 0 ... ... ... ... ... ... ... ... ... ... −eta 0 0 ... −eta 1 + 2η
O método implicito é incondicionalmente estável (ou seja, funciona para todo ∆t e ∆x). Porem, tanto os métodos explicito quanto implícito são de primeira ordem no tempo.
O método de Crank-Nicolson combina estabilidade com a precisão da segunda ordem no tempo. Ele simplesmente combina os dois esquemas, explícito e implícito. A equação discreta caria:
ujn+1− un j ∆t = D 2 " (uj +n+11−2un+1 j + u n+1 j −1) + (u n j +1−2ujn+ uj −n 1) ∆x2 #
Que pode ser resolvido na forma tridiagonal: ˆ
AUj +1=Rj
Neste caso ˆA é igual ao caso implicito, mas R = η2uj +n 1+ (1 − η)unj +η
Figura:Comparação entre os diferentes esquemas numéricos para resolver a equação de difusão.
Equações diferenciais em múltiples dimensões
Os métodos discutidos anteriormente podem ser geralizados a 2 ou 3 dimensões. No entanto, o tempo de computo aumenta signicativamente quando os problemas são tri-dimensionais. Veremos alguns exemplos sobre como geralizar as equações de uxo conservativo e de difussão. Método de Lax em duas dimensões:
∂u ∂t = −∇F = − ∂Fx ∂x + ∂Fy ∂y
Considerando a grade espacial:
xj = x0+ j ∆x yl= x0+ l ∆y
O esquema de Lax resulta em: uj ,ln+1 = 1 4 unj +1,l+ u n j −1,l+ u n j ,l +1+ u n j ,l −1 − Fj +n1,l− Fn j −1,l+ F n j ,l +1− F n j ,l −1
A analise de estabilidade leva à seguinte condição de Courant : ∆t ≤√ ∆
2(vx2+ vy2)1/2
No caso N-dimensional, se |v| é a velocidade máxima de propagação no problema, então:
∆t ≤ √∆ N|v | (Demonstração em Numerical Recipes, Sec. 19.3)
Equação de difusão em duas dimensões: ∂u ∂t = −D ∂2u ∂x2 + ∂2u ∂y2
O problema pode ser abordado usando diferenças nitas centradas (FTCS). No entanto, ja vimos que esse esquema tem limitações de estabilidade.
Por outro lado, o método de Crank-Nicolson resulta num sistema de equações acopladas que por sua vez não formam um sistema tri-diagonal. Metodo alternando a direção implícita (ADI):
Divide cada passo temporal em dois passos de tamanho ∆t/2. Em cada sub-passo, uma direção é tratada implicitamente.
un+j ,l1/2 = uj ,ln +1 2α δx2uj ,ln+1/2+ δ2yuj ,ln uj ,ln+1 = uj ,ln+1+1 2α δx2uj ,ln+1/2+ δy2uj ,ln+1 onde δx2unj ,l = uj +n 1,l−2un j ,l+ u n j −1,l e similar para δ2 .
Equações de Laplace e Poisson
A equação de Laplace é:
∇2u = uxx+ uyy =0
para ser resolvida precisa de condições de contorno, tal que u(x , y ) = g (x , y )na borda do dominio, δΩ. Não há dependencia temporal. O dominio pode ter qualquer forma e tamanho, por simplicidade escolhemos um dominio quadrado, e uma grade igual em cada direção:
h = ∆x = ∆y = L n
Onde L é o comprimento do dominio e n o número de pontos. Como visto anteriormente, las segundas derivadas podem ser escritas de forma discreta: uxx ' ui +1,j−2ui ,j+ ui −1,j h uyy ' ui ,j +1−2ui ,j + ui ,j −1 h
Assim, a equação de Laplace termina sendo: ui ,j = 1
4[ui ,j +1+ ui ,j −1+ ui +1,j+ ui −1,j] (12)
A equação de Poisson adiciona uma complexidade na equação anterior uxx+ uyy = −ρ(x , y )
Precisamos só adicionar uma versão discreta de ρ, na equação discreta: ui ,j = 1
4[ui ,j +1+ ui ,j −1+ ui +1,j+ ui −1,j] +
h2
As condições de contorno seriam:
ui ,0= gi ,0 0 ≤ i ≤ n
ui ,L= gi ,L 0 ≤ i ≤ n
u0,j = g0,j 0 ≤ j ≤ n uL,j= gL,j 0 ≤ j ≤ n
Uma "molecula"computacional para encontrar o valor de u no ponto i, i é mostrada na gura seguinte
Para resolver a equação acima, para n = 3 (por simplicidade) podemos reorganizar a equação acima da forma
Onde ˜ρi ,j = h2ρi ,j. Isolando as variáveis u11, u12, u21e u22, i.e, os pontos
internos independentes das condições de contorno, temos:
O lado direito corresponde aos pontos conhecidos no contorno mais os valores de ρ.
O sistema pode ser resolvido usando métodos de substituição, porem, já que a matriz A não é tridiagonal, o calculo pode ser ineciente.
Um método mais eciente é o conhecido método iterativo de Jacobi. O método é simples,
I Começamos fazendo um chute inicial para os pontos internos (fora
da fronteira), u(0) i ,j.
I Resolvemos depois as Eq. (13) ou Eq. (14), para obtermos ui ,j(1). I Repetimos o processo iterativamente k vezes, até que ui ,j(k) e ui ,j(k−1)
Como aumentar a performance de códigos em python
Porque Python é lento?
I Variáveis dinmâmicas. Contrario a Fortran ou C++, quando uma
variável é digitada python asigna um tipo.
I Python é uma linguagem interpretada e nao compilada. Python
carece da optimização dada pelo compilador.
I Objetos em Python podem ter um accesso ineciente à memoria
I Por outro lado Fortran e C++ utilizam variáveis previamente
denidas, precisam de compiladores que podem aumentar a performance do código e tém excelente accesso à memoria.
I Rotinas e funções escritas em Fortram ou C podem ser compiladas e
depois interpretadas como módulos de python. Dessa forma a velocidade de execução de um programa aumenta
consideravelmente. Para isso utilizamos f2py.
I Dessa forma podemos desenvolver códigos rápida e facilmente em
Python e deixar as partes do código que demandam mais computo a rotinas ecientes escitas em Fortran (ou C).
I Normalmente f2py é parte do pacote NUMPY que possue funções
vetorizadas para trabalhar com arrays.
I É importante vericar se a rotina que queremos converter a modulo
não existe já dentro da biblioteca NUMPY.
I Para compilarmos uma rotina de Fortran usamos (usaremos como
exemplo nossa função rel_func.f90 que resolve a eq. de Laplace em 2 dimensões.
I f2py -c -m rel_func rel_func.f90
I Se tudo der certo, o arquivorel_func.soserá criado I Para usar o módulo no python, usamos:
I import rel_func
I print rel_func.relax.__doc__
I Bibliograa completa de f2py pode ser encotrada em: