Escolar Documentos
Profissional Documentos
Cultura Documentos
Considere a equao
u u
+c = 0, u(x, 0) = g(x). (13.1)
t x
u u
+2 = 0, (13.3)
t x
u(x, 0) = 2x(1 x). (13.4)
A condio inicial, juntamente com u(x, 1), u(x, 2) e u(x, 3) esto mostrados na figura
13.1. Observe que a soluo da equao uma simples onda cinemtica.
3
u(x, t)
tempo
0.50 1
0.00 0
0 2 4 6 8 10
x
233
Matemtica Aplicada 234
com
x = L/Nx , (13.8)
t = T /Nt (13.9)
u un+1 uni
= i + O(t), (13.10)
t i,n t
u un uni1
= i+1 + O(x 2 ). (13.11)
x i,n x
o que significa selecionar 3 sadas (alm da condio inicial), de 250 em 250 interva-
los de tempo t. Observe que para isto ns utilizamos uma lista (v), cujos elementos
so arrays.
O resultado dos primeiros 750 intervalos de tempo de simulao mostrado na
figura 13.2. Repare como a soluo se torna rapidamente instvel. Repare tambm
como a soluo numrica, em t = 750t = 0,375, ainda est bastante distante dos
tempos mostrados na soluo analtica da figura 13.1 (que vo at t = 4). Clara-
mente, o esquema explcito que ns programamos jamais nos levar a uma soluo
numrica satisfatria para tempos da ordem de t = 1!
235 13.1 Adveco pura: a onda cinemtica
0.500
0.375
tempo de simulao
u(x, t)
0.250
0.50 0.125
0.00 0.000
0 2 4 6 8 10
x
Por que o esquema utilizado em (13.12) fracassa? Uma forma de obter a resposta
fazer uma anlise de estabilidade de von Neumann.
A anlise de estabilidade de von Neumann consiste primeiramente em observar
que, em um computador real, (13.12) jamais ser calculada com preciso infinita. O
que o computador realmente calcula um valor truncado uni . Por enquanto, ns s
vamos fazer essa distino de notao, entre u e u, aqui, onde ela importa. O erro de
truncamento
ni uni uni . (13.13)
Note que (13.12) se aplica tanto para u quanto para u; subtraindo as equaes resul-
tantes para uin+1 e uin+1 , obtm-se a mesma equao para a evoluo de ni :
Co
in+1 = ni (ni+1 ni1 ), (13.14)
2
onde
ct
Co (13.15)
x
o nmero de Courant. Isso s foi possvel porque (13.12) uma equao linear em
u. Mesmo para equaes no-lineares, entretanto, sempre ser possvel fazer pelo
menos uma anlise local de estabilidade.
O prximo passo da anlise de estabilidade de von Neumman escrever uma srie
de Fourier para ni , na forma
t n = nt,
x i = ix,
N /2
X
ni = l eat n eikl x i , (13.16)
l=1
Matemtica Aplicada 238
p
onde e a base dos logaritmos naturais, i = 1, N = L/x o nmero de pontos
da discretizao em x, e L o tamanho do domnio em x.
Argumentando novamente com a linearidade, desta vez de (13.14), ela vale para
cada modo l de (13.16), donde
Co at ik (i+1)x
l ea(t n +t) eikl ix = l eat n eikl ix l eat n eikl (i1)x ;
l e n e l (13.17)
2
Co +ik x
eat = 1 e l eikl x
2
= 1 iCo sen kl x. (13.18)
O lado direito um nmero complexo, de maneira que o lado esquerdo tambm tem
que ser! Como concili-los? Fazendo a = + i, e substituindo:
et cos(t) = 1, (13.19)
e t
sen(t) = Co sen(kl x). (13.20)
1 +ik x
e at = e l + eikl x Co e+ikl x eikl x ;
2
e at = cos(kl x) iCo sen(kl x) (13.22)
que este termo adicional significa? A resposta uma derivada numrica de ordem 2.
De fato, considere as expanses em srie de Taylor
du 1 d 2u
ui+1 = ui + x + + O(x 2 ),
d x i 2 d x 2 i
du 1 d 2u
ui1 = ui x + + O(x 2 ),
d x i 2 d x 2 i
e some:
d 2u
ui+1 + ui1 = 2ui + x 2 + O(x 2 ),
2
dx i
2
d u u 2ui + ui1
= i+1 + O(x 2 ). (13.25)
2
dx i x 2
Portanto, a equao (13.24) ou seja: o esquema de Lax (13.21) pode ser inter-
pretada tambm como uma soluo aproximada da equao de adveco-difuso
u u 2u
+c =D ,
t c x2
com
x 2
D= .
2t
portanto verificar se
2
D xu2
1,
c ux
D xu 2
u 1,
c x
D
c,
x
x 2
c,
2tx
ct 1
= Co
x 2
Em outras palavras, ns descobrimos que o critrio para que o esquema seja acurado
do ponto de vista fsico conflitante com o critrio de estabilidade: enquanto que
estabilidade demandava Co < 1, o critrio de que a soluo seja tambm fisicamente
acurada demanda que Co 1/2. Na prtica, isto significa que, para c = 2, ou o
esquema estvel com muita difuso numrica, ou ele instvel. Isto praticamente
elimina a possibilidade de qualquer uso srio de (13.21).
Mesmo assim, vamos program-lo! O programa onda1d-lax.py est mostrado
na listagem 13.3. Ele usa os mesmos valores t = 0,0005 e x = 0,01, ou seja,
Co = 0,10.
O programa gera um arquivo de sada binrio, que por sua vez lido pelo pr-
ximo programa na sequncia, surf1d-lax.py, mostrado na listagem 13.4. O nico
trabalho deste programa selecionar algumas linhas da sada de onda1d-lax.py;
no caso, ns o rodamos com o comando
surf1d-lax.py 3 500 ,
o que significa selecionar 3 sadas (alm da condio inicial), de 500 em 500 interva-
los de tempo t. Com isto, ns conseguimos chegar at o instante 0,75 da simulao.
O resultado dos primeiros 1500 intervalos de tempo de simulao mostrado na
figura 13.3. Observe que agora no h oscilaes esprias: o esquema estvel no
tempo. No entanto, a soluo est agora amortecida pela difuso numrica!
1.000
0.750
tempo de simulao
u(x, t)
0.500
0.50 0.250
0.00 0.000
0 2 4 6 8 10
x
l ea(t n +t) eikl ix = l eat n eikl ix Co l eat n eikl ix l eat n eikl (i1)x
eat = 1 Co 1 eikl x
1 cos(kl x) [Co 1] 0,
Co 1
Matemtica Aplicada 244
1.000
0.750
tempo de simulao
u(x, t)
0.500
0.50 0.250
0.00 0.000
0 2 4 6 8 10
x
Figura 13.4: Soluo numrica produzida pelo esquema upwind, para t = 500t,
1000t e 1500t.
Exerccios Propostos
Em particular, se
D = 2,
L = 1,
f (x) = 2x(1 x),
Z1
8
An = 2 2x(1 x) sen(nx) dx = 3 3
[1 (1)n ] .
0
n
Esquema explcito Talvez o esquema explcito mais bvio para discretizar (13.28)
seja
uin+1 uni uni+1 2uni + uni1
=D . (13.34)
t x 2
A derivada parcial em relao ao tempo de O(t), enquanto que a derivada segunda
parcial em relao ao espao , como vimos em (13.25), de O(x 2 ). Mas no nos
preocupemos muito, ainda, com a acurcia do esquema numrico. Nossa primeira
preocupao, como voc j sabe, outra: o esquema (13.34) estvel?
Explicitamos uin+1 em (13.34):
onde
Dt
Fo = (13.36)
x 2
Matemtica Aplicada 246
0.5
t = 0,00
0.4
0.3
u(x, t)
0.2
t = 0,05
0.1
t = 0,10
t = 0,15
0.0
0 0.2 0.4 0.6 0.8 1
x
= 1 + 2Fo cos(kl x) 1
kl x
2
= 1 4Fo sen (13.37)
2
kl x kl x
at 2 2 2 4
|e | = 1 8Fo sen + 16Fo sen <1
2 2
ou
kl x kl x
2 2 4
8Fo sen + 16Fo sen < 0,
2 2
kl x kl x
2 2
8Fo sen 1 + 2Fo sen < 0,
2 2
1
Fo < . (13.38)
2
Podemos agora calcular o nmero de Fourier que utilizamos para plotar a soluo
analtica (verifique nas listagens 13.5 e 13.6):
2 0,0005
Fo = = 1000.
(0,001)2
249 13.2 Difuso pura
Repare que Fo < 1/2 um critrio de estabilidade muito mais exigente do que
Co < 1/2 (para D = 2). Ns esperamos que nosso esquema explcito agora rode muito
lentamente. Mas vamos implement-lo. O programa que implementa o esquema o
difusao1d-exp.py, mostrado na listagem 13.7.
O programa divisao1d-exp.py, mostrado na listagem 13.8, seleciona alguns
instantes de tempo da soluo analtica para visualizao:
divisao1d-exp 3 5000 .
Matemtica Aplicada 250
0.5
t = 0,00
0.4
0.3
u(x, t)
0.2
t = 0,05
0.1
t = 0,10
t = 0,15
0.0
0 0.2 0.4 0.6 0.8 1
x
Figura 13.6: Soluo numrica com o mtodo explcito (13.35) (crculos) versus a
soluo analtica (linha cheia) da equao de difuso para t = 0, t = 0,05, t = 0,10 e
t = 0,15. Apenas 1 a cada 5 pontos da grade numrica so mostrados, para facilitar
a comparao com a soluo analtica.
un+1
i
uni un+1
i+1
2un+1
i
+ un+1
i1
=D ,
t x 2
un+1
i
uni = Fo(un+1
i+1
2un+1
i
+ un+1
i1
),
n+1
Foui1 + (1 + 2Fo)un+1
i
Foun+1
i+1
= uni . (13.39)
in+1 = ni + Fo(n+1
i+1
2n+1
i
+ n+1
i1
)
l e a(t n +t) eikl ix = l e at n eikl ix
+ Fo l e a(t n +t) eikl (i+1)x 2l e a (t n + t)eikl ix
e at = 1 + e at Fo eikl x 2 + eikl x ,
e at = 1 + e at 2Fo cos(kl x) 1 ,
kl x
at at 2
e = 1 e 4Fo sin ,
2
kl x
at 2
e 1 + 4Fo sin = 1,
2
1
|e at | = k x 1 sempre. (13.43)
1 + 4Fo sin2 l 2
Listagem 13.9: alglin.py Exporta uma rotina que resolve um sistema tridiagonal,
baseado em Press et al. (1992)
1 # -*- coding: iso-8859-1 -*-
2 # ------------------------------------------------------------------------------
3 # alglin.py implementa uma soluo de um sistema linear com matriz tridiagonal
4 # ------------------------------------------------------------------------------
5 from numpy import zeros
6 def tridag(A,y): # A,y tm que ser arrays!
7 m = A.shape[0] # garante que A representa uma
8 n = A.shape[1] # matriz tridiagonal
9 assert(m == 3) # garante que todos os tamanhos esto OK
10 o = y.shape[0]
11 assert (n == o)
12 x = zeros(n,float) # vetor de trabalho: vai retornar a soluo
13 gam = zeros(n,float) # vetor de trabalho: vai ficar por aqui
14 if A[1,0] == 0.0 :
15 exit("Erro 1 em tridag")
16 bet = A[1,0]
17 x[0] = y[0]/bet
18 for j in range(1,n):
19 gam[j] = A[2,j-1]/bet
20 bet = A[1,j] - A[0,j]*gam[j]
21 if (bet == 0.0):
22 exit("Erro 2 em tridag")
23 x[j] = (y[j] - A[0,j]*x[j-1])/bet
24 for j in range(n-2,-1,-1):
25 x[j] -= gam[j+1]*x[j+1]
26 return x
programao mais compacta e clara. Por exemplo, na linha 43, todos os elementos
A[0,1]. . . A[0,nx-1] recebem o valor -Fon.
Existe um programa divisao1d-imp.py, mas ele no precisa ser mostrado aqui,
porque as modificaes, por exemplo a partir de divisao1d-exp.py, so demasia-
damente triviais para justificarem o gasto adicional de papel. Para t = 0,001, e
x = 0,01, o resultado do mtodo implcito est mostrado na figura 13.7
Nada mal, para uma economia de 100 vezes (em relao ao mtodo explcito) em
passos de tempo! (Note entretanto que a soluo, em cada passo de tempo, um
pouco mais custosa, por envolver a soluo de um sistema de equaes acopladas,
ainda que tridiagonal.)
0.5
t = 0,00
0.4
0.3
u(x, t)
0.2
t = 0,05
0.1
t = 0,10
t = 0,15
0.0
0 0.2 0.4 0.6 0.8 1
x
Figura 13.7: Soluo numrica com o mtodo implcito (13.39) (crculos) versus a
soluo analtica (linha cheia) da equao de difuso para t = 0, t = 0,05, t = 0,10 e
t = 0,15. Apenas 1 a cada 5 pontos da grade numrica so mostrados, para facilitar
a comparao com a soluo analtica.
Fo Fo
at ikl x ikl x ikl x ikl x
e 1 e 2+e = 1+ e 2+e
2 2
e at 1 Fo cos(kl x) 1 = 1 + Fo cos(kl x) 1
kl x kl x
at 2 2
e 1 + 2Fo sin = 1 2Fo sin
2 2
2 kl x
1 2Fo sin
e at = 2 .
2 kl x
1 + 2Fo sin 2
0.5
t = 0,00
0.4
0.3
u(x, t)
0.2
t = 0,05
0.1
t = 0,10
t = 0,15
0.0
0 0.2 0.4 0.6 0.8 1
x
u 2u
=D , 0 x L,
t x2
257 13.2 Difuso pura
e o esquema de discretizao
x = L/Nx ,
x i = ix, i = 0, . . . , Nx ,
t n = tt,
uni = u(x i , t n ),
1 n+1 n n+1 n
uni+1 2uni + uni1
(ui+1 ui+1 ) + (ui1 ui1 ) = D ,
2t x 2
obtenha o critrio de estabilidade por meio de uma anlise de estabilidade de von Neumann.
SOLUO
Suponha que a equao diferencial se aplique ao erro:
ni =
X
l e at n eikl ix
l
Ento
1
(l e a(t n +t) eikl (i+1)x l e at n eikl (i+1)x ) + (l e a(t n +t) eikl (i1)x l e at n eikl (i1)x =
2t
l e at n eikl (i+1)x 2l e at n eikl ix + l e at n eikl (i1)x
D ;
x 2
1
(l e at eikl (i+1)x l eikl (i+1)x ) + (l e at eikl (i1)x l eikl (i1)x =
2t
l eikl (i+1)x 2l eikl ix + l eikl (i1)x
D ;
x 2
1 at ik (i+1)x
eikl (i+1)x ) + ( e at eikl (i1)x eikl (i1)x =
(e e l
2t
eikl (i+1)x 2 eikl ix + eikl (i1)x
D ;
x 2
( e at eikl (i+1)x eikl (i+1)x ) + ( e at eikl (i1)x eikl (i1)x =
2Dt ik (i+1)x
2 eikl ix + eikl (i1)x .
2
e l
x
Segue-se que
e at eikl (i+1)x + eikl (i1)x = eikl (i+1)x + eikl (i1)x + 2Fo eikl (i+1)x 2 eikl ix + eikl (i1)x
2 cos(kl x) 2
e at = 1 + 2Fo
2 cos(kl x)
cos(kl x) 1
= 1 + 2Fo
cos(kl x)
sen2 (kl x/2)
= 1 4Fo .
cos(kl x)
A funo
sen2 (x/2)
f (x) =
cos(x)
possui singularidades em /2 + k, e muda de sinal em torno destas singularidades: no
possvel garantir que |e at | < 1 uniformemente, e o esquema incondicionalmente instvel.
259 13.2 Difuso pura
Exerccios Propostos
u 2u
=D , 0 x L,
t x2
u
u(x, 0) = 0, u(0, t) = c, (L, t) = 0,
x
[A][u]n+1 = [ b]
h h
= h ,
t x x
h(x, 0) = H,
h(0, t) = H0 ,
h
= 0,
x x=1
da seguinte forma:
aproxime h dentro do colchete por hni (este o truque que lineariza o esquema de
diferenas finitas) e mantenha-o assim;
(x 2 + y 2 )
u(x, y, 0) = u0 exp ; (13.49)
L2
a soluo analtica
u0 (x 2 + y 2 )
u(x, y, t) = exp . (13.50)
1 + 4t D/L 2 L 2 + 4Dt
Na verdade esta soluo se espalha por todo o plano x y, mas ns podemos trabalhar
com um problema finito em x e y, por exemplo, fazendo L x L, L y L, e
impondo condies de contorno que se ajustem exatamente soluo analtica:
u0 (L 2 + y 2 )
u(L, y, t) = exp 2 , (13.51)
1 + 4t D/L 2 L + 4Dt
u0 (L 2 + y 2 )
u(L, y, t) = exp 2 , (13.52)
1 + 4t D/L 2 L + 4Dt
u0 (x 2 + L 2 )
u(x, L, t) = exp 2 , (13.53)
1 + 4t D/L 2 L + 4Dt
u0 (x 2 + L 2 )
u(x, L, t) = exp 2 . (13.54)
1 + 4t D/L 2 L + 4Dt
que ns vamos precisar de duas anlises de estabilidade de von Neumann, uma para
cada equao.
2011-09-24T17:07:04 Por enquanto, vou supor que os dois esquemas so incon-
dicionalmente estveis, e mandar ver.
Alm disto, por simplicidade vamos fazer x = y = , de maneira que s
haver um nmero de Fourier de grade no problema,
Dt
Fo = , (13.57)
2
e ento teremos, para x:
un+1
i, j
u n
i, j
= Fo u n+1
i1, j
2u n+1
i, j
+ u n+1
i+1, j
+ u n
i, j1
2u n
i, j
+ u n
i, j+1
,
n+1 n+1 n+1 n+1 n n n n
ui, j Fo ui1, j 2ui, j + ui+1, j = ui, j + Fo ui, j1 2ui, j + ui, j+1 ,
n+1
Foui1, j
+ (1 + 2Fo)ui,n+1
j
Foun+1
i+1, j
= Founi, j1 + (1 2Fo)uni, j + Founi, j+1 (13.58)
Na dimenso y,
un+2
i, j
ui,n+1
j
n+1 n+1 n+1 n+2 n+2
= Fo ui1, j 2ui, j + ui+1, j + ui, j1 2ui, j + ui, j+1 , n+2
ui,n+2
j
Fo u n+2
i, j1
2u n+2
i, j
+ u n+2
i, j+1
= u n+1
i, j
+ Fo u n+1
i1, j
2u n+1
i, j
+ u n+1
i+1, j
,
Foui,n+2
j1
+ (1 + 2Fo)ui,n+2
j
Foun+2
i, j+1
= Foun+1
i1, j
+ (1 2Fo)un+1
i, j
+ Foun+1
i+1, j
(13.59)
2L
N= ; (13.60)
x i = L + i, i = 0, . . . , N , (13.61)
y j = L + j, j = 0, . . . , N , (13.62)
Exemplo 13.2 Utilizando a anlise de estabilidade de von Newmann, mostre que o esquema
numrico correspondente primeira das equaes acima incondicionalmente estvel. Su-
ponha x = y = s.
SOLUO
Inicialmente, rearranjamos o esquema de discretizao, multiplicando por t e dividindo
por x 2 :
h i
ui,n+1
j u n
i, j = Fo u n+1
i+1, j 2u n+1
i, j + u n+1
i1, j + u n
i, j+1 2u n
i, j + u n
i, j1 ,
onde
Dt
Fo = .
s2
Faa agora
t n = nt,
x i = is,
y j = js,
ni =
X
l,m eat n eikl x i eikm y j ,
l,m
Matemtica Aplicada 266
l,m eat n eikl is eikm ( j+1)s 2l,m eat n eikl is eikm js + l,m eat n eikl is eikm ( j1)s .
e simplificamos:
1 + 2Fo(cos(km s) 1)
at .
|e | =
1 2Fo(cos(kl s) 1)
1 4Fo sen2 km s
2
|eat | =
1
1 + 4Fo sen2 kl s
2
Matemtica Aplicada 268