Você está na página 1de 13

Introducao aos Metodos Discretos (MAC026)

Trabalho III - Problema de Valor de Contorno


Camila Martins Saporetti, 200965366AB
Janeiro 2014
1 Problema de Valor de Contorno nao homogeneo
Encontrar a solucao do Problema de Valor de Contorno (PVC) abaixo utilizado Diferencas Finitas, Upwind
e Metodo da Coloca cao.
y

x
2
y

y = 0 (1)
onde = 10
2
, y(0) = y(1) = 1 e 0 x 1.
2 Problema de Valor de Contorno homogeneo
Encontrar a solucao do Problema de Valor de Contorno (PVC) abaixo utilizado Diferencas Finitas, Upwind
e Metodo da Coloca cao.
y

4y = 4x (2)
onde y(0) = y(1) = 0 e 0 x 1.
3 Diferencas Finitas
Suponha o seguinte PVC:
y

+ p(x)y

+ q(x)y = f(x) (3)


com y(0) = e y(l) = . Onde as funcoes p(x),q(x),f(x) e as constantes , sao conhecidas.
Para resolver este PVC usando Diferen cas Finitas deve-se primeiramente determinar uma sequencia de
pontos, onde a solucao sera encontrada. Esses pontos devem estar igualmente espacados.
x
i
= ih, parai = 0, ..., N + 1
Feito isso, avalia-se a equa cao no ponto x = x
i
y

+ p(x
i
)y

+ q(x
i
)y = f(x
i
) (4)
O proximo passo e substituir as aproximacoes de diferencas nos termos envolvendo as derivadas
y

(x
i
) =
y(x
i+1
) y(x
i1
)
2h
(5)
y

(x
i
) =
y(x
i+1
) 2y(x
i
) + y(x
i1
)
h
2
(6)
Apos a substitui cao das aproximacoes tem-se
y(x
i+1
) 2y(x
i
) + y(x
i1
)
h
2
+ p(x
i
)
y(x
i+1
) y(x
i1
)
2h
+ q(x
i
)y(x
i
) = f(x
i
) (7)
1
Simplicando
c
i
y(x
i+1
) + a
i
y(x
i
) + b
i
y(x
i1
) = h
2
f(x
i
) (8)
onde
a
i
= 2 + h
2
q(x
i
)
b
i
= 1
h
2
p(x
i
)
c
i
= 1 +
h
2
p(x
i
)
Considerando as condi coes de contorno, chega-se a y
0
= e y
N+1
= .
Com a equacao de diferen cas nitas, chega-se a um sistema com N equacoes e N incognitas. O sistema
pode ser escrito na forma matricial, da seguinte maneira
Ay = z
onde
A =
_

_
a
1
c
1
0 0 0 0 0
0 b
2
a
2
c
2
0 0 0
0 0 . . . 0 0 0
0 0 0 . . . 0 0
0 0 0 0 . . . 0
0 0 0 0 0 0 b
n
a
n
_

_
y =
_

_
y
1
.
.
.
y
n1
y
n
_

_
z =
_

_
h
2
f
1
b
1
y
2
.
.
.
h
2
f
n
c
n
_

_
4 Upwind
Uma outra forma de diferencas nitas e Upwind, que utiliza a abordagem de diferen cas progressivas e/ou
regressivas, dependendo de p
i
. Podem ser usadas as seguintes aproxima coes
y

(x
i
) =
_
_
_
y
i+1
y
i
h
, se p
i
> 0
y
i
y
i1
h
, se p
i
0
Para este metodo, os tres coecientes da linha i da matriz, seguem a seguinte formula
1 2 + h
2
q
i
p
i
h 1 + p
i
h, se p
i
> 0
1 + p
i
h 2 + h
2
q
i
+ p
i
h 1, se p
i
0
2
5 Metodo da Colocacao
5.1 Metodo dos Resduos Ponderados
Ao empregar o Metodo dos Resduos Ponderados, procura-se uma solu cao aproximada u(x) u(x) para a
Equacao 9 A solu cao aproximada u(x) e escolhido de tal forma que as condi coes de contorno essenciais do
problema sejam satisfeitas.
d
2
u
dx
2
+ p(x) = 0, 0 x 1 (9)
Sendo u(0) = 0 e u

(0) = 1.
Como u(x) e uma aproxima cao da solucao exata u(x), ela nao satisfara a Equacao 9 e portanto nao sera igual
zero. Resduo e o nome dado a funcao resultante que sera indicada por R(x).
O Metodo dos Resduos Pinderados tem o intuito de minimizar o resduo. Ao inves de fazer com que
R(x) seja zero para todos os valores de x, R(x) sera anulado num sentido medio. Seja a seguinte integral:
_
1
0
R(x)W(x) = 0 (10)
onde W(x) e a fun cao de ponderacao. A escolha das funcoes de pondera cao leva a diferentes metodos de
resduos ponderados, entre eles o Metodo da Colocacao, que sera descrito nesse trabalho.
5.2 Metodo da Colocacao
A ideia da colocacao e selecionar pontos no intervalo e, em seguida, exigir que o residuo seja zero nesses
locais. O n umero de pontos de colocacao selecionados corresponde ao n umero de parametros livres na fun cao
de ponderacao.
A funcao de pondera cao utilizada por este metodo e denominada Delta de Dirac, (x ), que e denida
com
_

(x )f(x)dx =
_
f(), se
0, se /
Portanto
A
ij
=
_

(x
i
)L[
j
(x)]dx = L[
j
(
i
)]
e
b
i
=
_

(x
i
)f(x)dx = f(
i
)
onde L e o operador diferencial linear. E para o problema em questao, utilizado
j
= x
j
(1 x) possui a
seguinte formula
10
2
(j(j 1)x
j2
(j + 1)jx
j1
) x
2
i
(jx
j1
j + 1x
j
) x
j
i
x
j+1
i
Como as condi coes de contorno sao nao homogeneas, duas fun coes foram adicionadas para satisfazer-las,
phi
0
= 1 x e
1
= x.
6 Analise do Erro
Foi utilizado para o Problema nao homogeneo a estimativa para solucoes grosseiras (LeVeque,2007), tem-se

E(h) U(h) U(h/2) (11)

E(h/2) U(h/2) U(h/4) (12)


3
Em outras palavras, estima-se o erro em cada malha usando o proximo renamento de malha. Entao
pode-se dizer que

E(h) E(h) E
_
h
2
_
C
_
1
1
2
p
_
h
p
(13)

E(h/2) E
_
h
2
_
E
_
h
4
_
C
_
1
1
2
p
_
h
p
2
p
(14)
A convergencia dos metodos e dada pela seguinte relacao

E(h)/

E
_
h
2
_
2
p
(15)
Para o Metodo de Diferencas Finitas a razao encontrada entre os erros foi aproximadamente 3.7, de forma
que cou proximo da convergencia do metodo. Para Diferen cas Finitas a convergencia e da ordem 2
p
, onde
p = 2.
Para o Metodo Upwind nao foi possvel encontrar um valor para a razao entre os erros, uma vez que o
valor encontrado para

E(h) =

E
_
h
2
_
= 0.
Para o Problema homogeneo foi realizado o Calculo da Norma Um, Norma Dois e Norma Innita com-
parando a solu cao encontrada pelo Metodo das Diferencas Finitas.
4
7 Resultados
7.1 Problema homogeneo
Os tres metodos descritos acima foram testados para N = 10, N = 20 e N = 100, sendo N o n umero de
subsivisoes da malha. Segue os resultados encontrados.
Figura 1: Solu coes encontradas para N = 10, N = 20 e N = 100, respectivamente.
5
Figura 2: Solucoes encontradas usando os Metodos Diferencas Finitas, Upwind e Colocacao para N = 120
pontos
6
7.2 Problema nao homogeneo
Os tres metodos descritos acima foram testados para N = 10, N = 20 e N = 100, sendo N o n umero de
subsivisoes da malha. Segue os resultados encontrados.
Figura 3: Solu coes encontradas para N = 10, N = 20 e N = 100, respectivamente.
7
Referencias
[1] BARRA, Luis Paulo S. Introducao aos Metodos Discretos. Programa de Pos-Graduacao em Modelagem
Computacional, UFJF.
[2] HOLMES, Mark H. Introduction to Numerical Methods in Dierential Equations. Springe. Rensselaer
Polytechnic Institute - Troy, NY 12180. 2007.
[3] LEVEQUE, Randall J. Finite Dierence Methods for Ordinary and Partial Dierential Equations.
Society for Industrial and Applied Mathematics. University of Washington - Seattle, Washington.
2007.
8
A Apendice
1 # -*- coding: utf -8 -*-
2
3 # Programa que resolve o Problema Nao Homogeneo com Diferencas Finitas , Upwind e
Colocacao
4
5 import numpy as np
6 import matplotlib.pyplot as pl
7
8 def DiferencaFinita(eps ,x0 ,x1 ,y0 ,y1 ,n,h):
9
10 mat = np.zeros((n,n))
11
12 z = np.zeros(n)
13 z[0] = -y0*(1.0 + h*(x0+h)**2/(2* eps))
14 z[n-1] = -y1*(1.0 - h*(x0+n*h)**2/(2* eps))
15
16 for i in range(0,n):
17 if i == 0:
18 mat[i][i] = -2.0 - h**2/ eps
19 mat[i][i+1] = 1.0 - h**2*(x0+(i+1)*h)/(2* eps)
20
21 else:
22 if i == n-1:
23 mat[i][i-1] = 1.0 + h*(x0+(i+1)*h)**2/(2* eps)
24 mat[i][i] = -2.0 - h**2/ eps
25 else:
26 mat[i][i-1] = 1.0 + h*(x0+(i+1)*h)**2/(2* eps)
27 mat[i][i] = -2.0 - h**2/ eps
28 mat[i][i+1] = 1.0 - h*(x0+(i+1)*h)**2/(2* eps)
29
30 y = np.linalg.solve(mat ,z)
31 x = np.zeros(n+2)
32 x[0] = 0.0
33 x[n+1] = 1.0
34 h1 = (x[n+1] - x[0])/(n+2)
35 for i in range(0,n):
36 x[i+1] = x[i] + h1
37 ys = np.zeros(n+2)
38 ys[0] = 1.0
39 ys[n+1] = 1.0
40 for i in range(0,n):
41 ys[i+1] = y[i]
42
43 return x,ys
44
45 def Upwind(eps ,x0 ,x1 ,y0 ,y1 ,n,h):
46
47 mat = np.zeros((n,n))
48 z = np.zeros(n)
49 z[0] = -y0 *(1.0 + h*(x0+h)**2/ eps)
50 z[n-1] = -y1 *(1.0)
51
52 for i in range(0,n):
53 if i == 0:
54 mat[i][i] = -2.0 - h**2/ eps - h*(x0+(i+1)*h)**2/ eps
55 mat[i][i+1] = 1.0
56
9
57 else:
58 if i == n-1:
59 mat[i][i-1] = 1.0 + h*(x0+(i+1)*h)**2/ eps
60 mat[i][i] = -2.0 - h**2/ eps - h*(x0+(i+1)*h)**2/ eps
61 else:
62 mat[i][i-1] = 1.0 + h*(x0+(i+1)*h)**2/ eps
63 mat[i][i] = -2.0 - h**2/ eps - h*(x0+(i+1)*h)**2/ eps
64 mat[i][i+1] = 1.0
65
66 y = np.linalg.solve(mat ,z)
67
68 x = np.zeros(n+2)
69 x[0] = x0
70 x[n+1] = x1
71 h1 = (x[n+1] - x[0])/(n+2)
72 for i in range(0,n):
73 x[i+1] = x[i] + h1
74
75 ys = np.zeros(n+2)
76 ys[0] = y0
77 ys[n+1] = y1
78 for i in range(0,n):
79 ys[i+1] = y[i]
80
81 return x,ys
82
83 def Colocacao(eps ,x0 ,x1 ,y0 ,y1 ,n,h,n_p):
84
85 mat = np.zeros((n+2,n+2))
86 z = np.zeros(n+2)
87 z[0] = z[n+1] = 1.0
88 mat [0][0] = mat[n+1][n+1] = 1.0
89
90 for i in range(1,n+1):
91 for j in range(0,n+2):
92 #phi = 1-x
93 if j == 0:
94 mat[i][j] = -(x0 + (i+1)*h)**2*( -1.0) - (1.0 - (x0 + (i+1)*h))
95 #phi = x
96 elif j == n+1:
97 mat[i][j] = -(x0 + (i+1)*h)**2*(1.0) - (x0 + (i+1)*h)
98 else:
99 #para phi = x^j - x^{j+1}
100 mat[i][j] = eps*(j*(j-1)*(x0 + (i+1)*h)**(j-2) - (j+1)*j*(x0 + (i+1)*
h)**(j-1)) - (x0 + (i+1)*h)**2*(j*(x0 + (i+1)*h)**(j-1) - (j+1)*(
x0 + (i+1)*h)**j) - ((x0 + (i+1)*h)**j - (x0 + (i+1)*h)**(j+1))
101
102 alpha = np.linalg.solve(mat ,z)
103
104 x= np. linspace(0, 1,n_p)
105 u= x + (1-x)
106
107 #print u
108 for i in range(1,n+1):
109 u = u + alpha[i]*(x**i-x**(i+1))
110
111 return x,u
112
113
10
114 def erro_max(u2 ,u1 ,n,razao):
115
116 e_max = 1.0
117 for i in range(0,n):
118 e = u1[i] - u2[i*razao]
119 if(e < e_max):
120 e_max = e
121 return e_max
1 # -*- coding: utf -8 -*-
2
3 # Programa que resolve o Problema Homogeneo com Diferencas Finitas , Upwind e
Colocacao
4
5 import numpy as np
6 import matplotlib.pyplot as pl
7 from pylab import*
8
9 def DiferencaFinita(x0 ,x1 ,y0 ,y1 ,n,h):
10
11 mat = np.zeros((n,n))
12 z = np.zeros(n)
13
14 for i in range(0,n):
15 if i == 0:
16 mat[i][i] = -2.0 - 4*h**2
17 mat[i][i+1] = 1.0
18 z[i] = 4*h**2*(x0 + (i+1)*h) - y0 *(1.0)
19
20 else:
21 if i == n-1:
22 mat[i][i-1] = 1.0
23 mat[i][i] = -2.0 - 4*h**2
24 z[i] = 4*h**2*( x0 + (i+1)*h) - y1 *(1.0)
25 else:
26 mat[i][i-1] = 1.0
27 mat[i][i] = -2.0 - 4*h**2
28 mat[i][i+1] = 1.0
29 z[i] = 4*h**2*( x0 + (i+1)*h)
30
31
32 y = np.linalg.solve(mat ,z)
33 x = np.zeros(n+2)
34 x[0] = x0
35 x[n+1] = x1
36 h1 = (x[n+1] - x[0])/(n+2)
37 for i in range(0,n):
38 x[i+1] = x[i] + h1
39 ys = np.zeros(n+2)
40 ys[0] = y0
41 ys[n+1] = y1
42 for i in range(0,n):
43 ys[i+1] = y[i]
44
45 return x,ys
46
47 def Upwind(x0 ,x1 ,y0 ,y1 ,n,h):
48
49 mat = np.zeros((n,n))
11
50 z = np.zeros(n)
51
52 for i in range(0,n):
53 if i == 0:
54 mat[i][i] = -2.0 - 4*h**2
55 mat[i][i+1] = 1.0
56 z[i] = 4*h**2*(x0 + (i+1)*h) - y0 *(1.0)
57
58 else:
59 if i == n-1:
60 mat[i][i-1] = 1.0
61 mat[i][i] = -2.0 - 4*h**2
62 z[i] = 4*h**2*( x0 + (i+1)*h) - y1 *(1.0)
63 else:
64 mat[i][i-1] = 1.0
65 mat[i][i] = -2.0 - 4*h**2
66 mat[i][i+1] = 1.0
67 z[i] = 4*h**2*(x0 + (i+1)*h)
68
69 y = np.linalg.solve(mat ,z)
70
71 x = np.zeros(n+2)
72 x[0] = x0
73 x[n+1] = x1
74 h1 = (x[n+1] - x[0])/(n+3)
75 for i in range(0,n):
76 x[i+1] = x[i] + h1
77
78 ys = np.zeros(n+2)
79 ys[0] = y0
80 ys[n+1] = y1
81 for i in range(0,n):
82 ys[i+1] = y[i]
83
84 return x,ys
85
86 def Colocacao(x0 ,x1 ,y0 ,y1 ,n,h,n_p):
87
88 mat = np.zeros((n,n))
89 z = np.zeros(n)
90
91 #z[0] = z[n+1] = 0.0
92 #mat [0][0] = mat[n+1][n+1] = 1.0
93 #h=(x1-x0)/(n+3)
94 for i in range(1,n+1):
95 z[i-1] = 4*(x0 + (i+1)*h)
96 for j in range(1,n+1):
97 #para phi = x^j - x^{j+1}
98 mat[i-1][j-1] = (j*(j-1)*(x0 + (i+1)*h)**(j-2) - (j+1)*j*(x0 + (i+1)*h)
**(j-1)) - 4.0*(( x0 + (i+1)*h)**j - (x0 + (i+1)*h)**(j+1))
99
100
101
102 alpha = np.linalg.solve(mat ,z)
103 print alpha
104 x = np.linspace (0,1,n_p)
105 u = 0.0
106
107 #print u
12
108 for i in range(0,n):
109 u = u + alpha[i]*(x**(i+1)-x**(i+2))
110
111 return x,u
112
113 def SolucaoExata(x0 ,x1 ,n):
114 y = np.zeros(n+2)
115 x = np.zeros(n+2)
116
117 y[0] = y[n+1] = 0.0
118 h1 = (x1 - x0)/(n+3)
119
120 x[0] = x0
121 x[n+1] = x1
122 for i in range(1, n+1):
123 y[i] = e**2/(1.0 - e**4)*(e**( -2*(x0 + (i+1)*h1)) - e**(2*( x0 + (i+1)*h1)))
- (x0 + (i+1)*h1)
124 x[i] = (x0 + (i+1)*h1)
125 return x,y
126
127 def NormaUm(solucao ,Exata ,n):
128
129
130 erro = 0.0
131
132 for i in range(0,n):
133 erro = erro + abs((Exata[i] - solucao[i]))
134
135 return erro
136
137 def NormaDois(solucao ,Exata ,n):
138
139 erro = 0.0
140
141 for i in range(0,n):
142 erro = erro + abs((Exata[i] - solucao[i]))**2
143
144 return np.sqrt(erro)
145
146 def NormaInfinito(solucao ,Exata):
147
148 return max(abs(Exata - solucao))
13

Você também pode gostar