Grupo: Marcelo Ricardo P. Pinto; Ricardo Rocha; Marcelo A. Carrasqueira; Felipe
Aguiar; Danilo C. Pereira; Juliana de Miranda; Mariana Garcia.
Capítulo 10. Equações Diferenciais
Parcias
10.1. Equações Diferenciais Parcias Elípticas
10.1.1. Introdução
As equações diferenciais se classificam em ordinárias e parciais.
No curso de análise numérica já foram tratados métodos numéricos para a resolução das ordinárias.
Este trabalho tratará de métodos, numéricos, para solucionar equações diferenciais parciais de dois tipos: elípticas e parabólicas.
Uma equação diferencial parcial (E.D.P.) é uma equação que contém uma função incógnita de duas ou mais variáveis e suas derivadas parciais em relação a essas variáveis.
A ordem de uma E.D.P. é a ordem da mais alta derivada presente.
Uma solução de uma E.D.P. é qualquer função que satisfaça à equação identicamente.
Os tipos de E.D.P. que trataremos aqui são de segunda ordem, assim resolvemos destacar também sua forma geral:
A u x x y B u x y x y C u y x y D u x x y E u y x y Fu x y G x y ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ ∂ 2 2 2 2 2 ( , )+ ( , )+ ( , )+ ( , )+ ( , )+ ( , )= ( , ) Definindo ∆=B2-4AC temos:
• Se ∆<0 a equação será chamada de elíptica; • Se ∆=0 a equação será chamada de parabólica; • Se ∆>0 a equação será chamada de hiperbólica.
Um tipo especial de E.D.P. elíptica é a Equação de Poisson:
∇2u x y( , ) = ∂ ∂ ∂ ∂ 2 2 2 2 u x x y u y x y f x y ( , )+ ( , )= ( , ) ,
e um tipo especial de E.D.P. parabólica é a Equação do Calor:
∂ ∂ α ∂ ∂ u t x t u x x t ( , ) = 2 2 ( , ) 2 .
Essas duas equações serão os nossos objetos de estudo.
10.1.2. Motivação
Em muitas aplicações de Física, Biologia, Química, Engenharia e outros, mais especificamente na formulações de modelos matemáticos, as equações diferencias são de grande importância, resolvendo a maioria dos problemas.
Ao contrário com que acontece com as equações diferenciais ordinárias, não existem métodos de resoluções para as equações diferenciais parciais (com exceção dos métodos numéricos), cada equação é um caso particular.
Os métodos numéricos são eficientes, de fácil entendimento e sendo de iteração são facilmente programáveis.
10.1.3. Modelo
Primeiramente trataremos com as equações parciais diferenciais elípticas, e como citado acima vamos considerar a Equação de Poisson.
10.1.4. Metodologia
Vamos considerar a equação de Poisson:
∇2u x y( , ) = ∂ ∂ ∂ ∂ 2 2 2 2 u x x y u y x y f x y ( , )+ ( , )= ( , ) (1) para (x,y) ∈ R e
u(x,y) = g(x,y) para (x,y) ∈ S
onde R = { (x,y) / a < x < b, c < y < d } e onde S denota o bordo de R.
Assumiremos que f e g são contínuas em seus domínios e que a solução a encontrar será única.
O método usado é uma adaptação do método da diferença finita para problemas de valores de borda. O primeiro passo é encontrar inteiros n e m de modo que h = (b-a)/n e k=(d-c)/m. Particionaremos o intervalo [a,b] em n partes iguais de largura h e o intervalo [c,d] em m partes iguais de largura k (ver figura 1) fornecendo uma grade no retângulo R e desenhando linhas verticais e horizontais através de pontos com coordenadas (xi,yj), onde:
xi = a + ih para i = 0,1,...,n yj = c + jk para j = 0,1,...,m
As linhas x = xi e y = yj são chamadas linhas da grade e suas interseções são os pontos malhas da grade. Para cada ponto malha do interior da grade usaremos a série de Taylor na variável x sobre xi para gerar a fórmula da diferença central : ∂ ∂ ∂ ∂ ε 2 2 1 1 2 2 4 4 2 12 u x x y u x y u x y u x y h h u x y i j i j i j i j i j ( , ) ( ) ( ) ( ) ( , ), , , , = + − + − − (2)
onde ε ∈ (xi-1,xi+1);
E a série de Taylor na variável y sobre yj para gerar a fórmula da diferença central : ∂ ∂ ∂ ∂ η 2 2 1 1 2 2 4 4 2 12 u y x y u x y u x y u x y h k u y x i j i j i j i j i j ( , ) ( ) ( ) ( ) ( , ), , , , = + − + − − (3) onde η ∈ (yj-1,yj+1).
Usando essas fórmulas na Eq. (1), podemos expressar a equação de Poisson nos pontos (xi,yj) como:
u x y u x y u x y h u x y u x y u x y k i j i j i j i j i j i j ( +1, )− ( , )+ ( −1, )+ ( , + )− ( , )+ ( , − ) = 2 1 1 2 2 2 =f x y +h u + x y k u x x y i j i j i j ( , ) ( , ) ( , ) 2 4 4 2 4 4 12 12 ∂ ∂ ε ∂ ∂
E as condições de bordo como: u(x0,yj) = g(x0,yj), para cada j = 0,1,...,m; u(xn,yj) = g(xn,yj), para cada j = 0,1,...,m; u(xi,y0) = g(xi,y0) , para cada i = 0,1,...,n-1; u(xi,ym)= g(xi,ym) , para cada i = 0,1,...,n-1;
Dessa forma, a equação diferencial, com o resultado do método da diferença central, com erro local de truncamento de ordem O(h2 + k2), pode ser
escrita como : 2 1 2 1 1 2 1 1 2 h k w w w h k w w h f x y i j i j i j i j i j i j + , −( +, + −,)− ( ,+ + ,− )= − ( , ) (4) para cada i = 1,2,...,n-1 e j = 1,2,...,m-1 e w0,j = g(x0,yj) para cada j = 0,1,...,m wn,j = g(xn,yj) para cada j = 0,1,...,m (5) wi,0 = g(xi,yj) para cada i = 1,2,...,n-1
wi,m = g(xi,ym) para cada i = 1,2,...,n-1 onde wi,j aproxima u(xi,yj).
A equação típica em (4) envolve aproximações para u(x,y) nos pontos (x i-1,yj), (xi,yj), (xi+1,yj), (xi,yj-1) e (xi,yj+1).
Reproduzindo uma porção de grades onde esses pontos estão situados (ver figura 1), mostraremos que cada equação envolve aproximações na estrela formada na região sobre (xi,yj).
Se usarmos as informações sobre as condições de bordo sempre que o sistema dado por (4) for apropriado, isto é, todos os pontos (xi,yj) são adjacentes aos pontos malhas do bordo, temos um sistema (n-1)(m-1) de equações lineares em (n-1)(m-1) incógnitas, onde as incógnitas são as aproximações wi,j para u(xi,yj) no interior dos pontos malhas.
O sistema linear envolvendo essas incógnitas é expresso por matriz calculando mais eficientemente se uma reelaboração dos pontos malhas interiores for feita. Uma recomendação de reelaboração desses pontos é dado por:
Pl = (xi,yj) e wl = wi,j,
onde l = i + (m-1-j)(n-1), para cada i = 1,2,...,n-1 e j = 1,2,...,m-1. Esta tabela de pontos malhas consecutivamente deixa certo e levanta o sistema mais baixo.
10.1.5. Algoritmo de Equação de Diferença-Finita de
Poisson
Para aproximar a solução da equação de Poisson
∂ ∂ ∂ ∂ 2 2 2 2 u+ u = ( , ) a x b c y df x y ≤ ≤ , ≤ ≤
Sejam as condições de fronteira:
u(x,y)=g(x,y) se x=a ou x=b e c y d≤ ≤
e
u(x,y)=g(x,y) se y=c ou y=d e a x b≤ ≤
As entradas são os extremos a,b,c,d ; os inteiros m,n ; a tolerância TOL ; e o número máximos de iterações Lfront.
As saídas aproximadas wi j, para u x y( , ) para cada i=1,...,n-1 e j=1,...,m-1 ou uma i i
mensagem que diz que o número de iterações foi excedido.
Passo 1) Faça h=(b-a)/n k=(d-c)/m
Passo 2) Para i=1,...,n-1 faça xi = + (os passos 2 e 3 constrõem a ih os pontos de malha)
Passo 3) Para j=1,...,m-1 faça yi = + c jk Passo 4) Para i=1,...,n-1
para j=1,...,m-1 faça wi j, = 0 Passo 5) Faça r h k q r l = = = = 2 2 2 1 1 / ( )
Passo 6) Enquanto I ≤ Lfront faça o passo 7 ao 20.
(Esses passos executam as iterações de Gauss-Seidel) Passo 7) Faça
(
) (
) ( )
(
)
z h f x y g a y rg x d rw w q norm z w w z m m m m m m = − + + + + = − = − − − − − − 2 1 1 1 1 1 2 2 1 1 1 1 1 , , , , , / , ,Passo 8) Para i = 2,...,n-2 Faça
(
) ( )
(
)
z h f x y rg x d w w rw q se w z norm i m i i m i m i m i m = − + + + + − > − − − + − − − 2 1 1 1 1 1 2 1 , , , , , / ,então faça norm= wi m, −1 −z faça wi m, −1 = z Passo 9) Faça
(
) (
) (
)
(
)
z h f x y g b y rg x d w rw q se w z norm n m m n n m n m n m = − + + + + − > − − − − − − − − − − 2 1 1 1 1 2 1 1 2 1 1 , , , , , / , então faça faça norm w= n−1,m−1−z wn−1,m−1 =zPasso 10) Para j = m-2,...,2 faça o passo 11 ao 13
Passo 11) Faça z= −
(
h f x y2(
j) ( )
+g a yj +rw j+ +rw j− +w j)
q1, , 1 1, 1 1, 2, /
se w1,j− >z norm então faça norm w= 1,j−z
Passo 12) Para i=2,...,n-2 faça
z= −( h f x y2 ( , )i j +wi−1,j +rwi j,+1 +wi+1,j +rwi j,−1) /q
se wi j, −z>norm então faça norm w= i j, −z
faça wi j, = z Passo 13) Faça
z=(−h f x2 ( n−1, )yj +g b y( , )j +wn−2,j+rwn− +1 1,j +rwn− −1 1,j ) /q
Passo 14) Faça z= −( h f x y2 ( , )1 1 +g a y( , )1 +rg x c( , )1 +rw1 2, +w2 1, ) /q se w1 1, − >z norm então faça norm w= 1 1, −z
faça w1 1, = z Passo 15) Para i=2,...,n-2 faça
z= −( h f x y2 ( , )i 1 +g x c( , )i +wi−1 1, +rw1 2, +wi+1 1, ) /q se wi,1− >z norm então faça norm= wi,1 −z
faça wi,1 = z
Passo 16) Faça
z= −( h f x2 ( n− , )y +g b y( , )+rg x( n− , )c +wn− , +rwn−, )q
1 1 1 1 2 1 1 2
se wn−1 1, − >z norm então faça norm w= n−1 1, −z
faça wn−1 1, =z
Passo 17) Se norm TOL então faça passos 18 e 19 Passo 18) Para i=1,...,n-1
Passo 19) Fim. (programa terminado com sucesso) Passo 20) Faça i=i+1
Passo 21) Imprima (“O número máximo de iterações foi atingido”) Fim.
10.1.6. Fluxograma
Início Dados Iniciais Cálculo de h e k i = 1 Cálculo de xi i = n-1 No i = i+1 j = 1 Yes Cálculo de yi j = m-1 No j = j+1 i = 1 Yes j = 1 wi,j = 0 j = m-1 No j = j+1 i = i+1i = n-1 No Cálculo de r,q e i=1 Yes Cálculo de z,norm e "w" norm é menor
ou igual TOL No i = i+1
Imprima os resultados Yes FIM i menor que LFront Número de iterações foi excedido No Yes
10.1.7. Exemplo
Considere a equação de Poisson
∂∂
( )
∂∂( )
2 2 2 2 u x x y u y x y xe y , + , = , 0<x<2, 0<y<1,com condições de contorno
( )
( )
u y u x x 0 0 0 , , , , = =( )
( )
u y e u x ex y 2 2 1 , , , , = = 0 1 0 2 ≤ ≤ ≤ ≤ y x , .usaremos o algoritmo para aproximar a solução exata u x y
( )
, =xey com n = 6 e m = 5.O critério de parada para o método Gauss-Seidel no passo 17 requer wi j( )l, −w(i j,l−1) ≤10−10,
para cada i = 1,...,5, e j = 1,...,4; então a solução para a equação diferencial foi obtida de modo preciso, e o procedimento de parada para l = 61. O resultado com os valores corretos são apresentados na tabela abaixo:
j xi yi wi,j(61) u(xi,yi) |u(xi,yj) - wi,j(61)|
1 0,33330 0,20000 0,40726 0,40713 1,3 x 10-4 2 0,33330 0,40000 0,49748 0,49727 2,08 x 10-4 3 0,33330 0,60000 0,60760 0,60737 2,23 x 10-4 4 0,33330 0,80000 0,74201 0,74185 1,6 x 10-4 1 0,66670 0,20000 0,81452 0,81427 2,55 x 10-4 2 0,66670 0,40000 0,99496 0,99455 4,08 x 10-4 3 0,66670 0,60000 1,21520 1,21470 4,37 x 10-4 4 0,66670 0,80000 1,48400 1,48370 3,15 x 10-4 1 1,00000 0,20000 1,22180 1,22140 3,64 x 10-4 2 1,00000 0,40000 1,49240 1,49180 5,8 x 10-4 3 1,00000 0,60000 1,82270 1,82210 6,24 x 10-4 4 1,00000 0,80000 2,22600 2,22550 4,51 x 10-4 1 1,33330 0,20000 1,62900 1,62850 4,27 x 10-4 2 1,33330 0,40000 1,98980 1,98910 6,79 x 10-4 3 1,33330 0,60000 2,43020 2,42950 7,35 x 10-4 4 1,33330 0,80000 2,96790 2,96740 5,4 x 10-4 1 1,66670 0,20000 2,03600 2,03570 3,71 x 10-4 2 1,66670 0,40000 2,48700 2,48640 5,84 x 10-4 3 1,66670 0,60000 3,03750 3,03690 6,41 x 10-4 4 1,66670 0,80000 3,70970 3,70920 4,89 x 10-4
10.1.8. Implementação
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<complex.h>float exemplo(float a1,int a2); void main(void)
float m,n,r,q,l,a,b,c,d,i,j,w[4][4],LFront,norm,TOL; float h,k,x[200],y[200],aux,aux1,aux2,aux3,aux4,aux5,z; m=5;
n=6;
printf("entre com o valor de a: "); scanf("%f",&a);
printf("entre com o valor de b: "); scanf("%f",&b);
printf("entre com o valor de c: "); scanf("%f",&c);
printf("entre com o valor de d: "); scanf("%f",&d);
printf("entre com o valor de tolerƒncia: "); scanf("%f",&TOL);
printf("entre com o m ximo de itera‡äes : "); scanf("%f",&LFront);
h=(b-a)/n; k=(d-c)/m;
for (i=1;i<=(n-1);i++) //passo 2 x[i]=a+(i*h);
for (j=1;j<=(m-1);j++) //passo 3 y[i]=c+(j*k);
for (i=1;i<=(n-1);i++) //passo 4 for (j=1;j<=(m-1);j++) w[i][j]=0; r=h*h/k*k; //passo 5 q=2*(1+r); l=1;
while (l<=LFront) //passo 6 { aux=exemplo(x[1],y[m-1]); // passo 7 aux1=exemplo(a,y[m-1]); aux2=exemplo(x[1],d); aux3=exemplo(x[1],y[m-2]); aux4=exemplo(x[2],y[m-1]); aux5=exemplo(x[1],y[m-1]);
z=(-(h*h)*aux + aux1 + r*aux2 + r*aux3 + aux4)/q; norm=fabs(z-aux5);
aux5=z;
for (i=2;i<=n-2;i++) //passo 8 {
aux=exemplo(x[i],y[m-1]); aux1=exemplo(x[i],d);
aux2=exemplo(x[i-1],y[m-1]); aux3=exemplo(x[i+1],y[m-1]);
aux4=exemplo(x[i],y[m-2]); aux5=exemplo(x[i],y[m-1]);
z=(-(h*h)*aux+ r*aux1 + aux2 + aux3 +r*aux4)/q; if( abs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z; } // fim de 8 { aux=exemplo(x[n-1],y[m-1]); aux1=exemplo(b,y[m-1]); aux2=exemplo(x[n-1],d); aux3=exemplo(x[n-2],y[m-1]); aux4=exemplo(x[n-1],y[m-2]); aux5=exemplo(x[n-1],y[m-1]); // passo 9 z=(-(h*h)*aux + aux1 +r*aux2 + aux3 + r*aux4)/q;
if( fabs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z; } { for(j=m-2;j<=2;j--) //passo 10 {
aux=exemplo(x[1],y[j]); // passo 11 aux1=exemplo(a,y[j]); aux2=exemplo(x[1],y[j+1]); aux3=exemplo(x[1],y[j-1]); aux4=exemplo(x[2],y[j]); aux5=exemplo(x[1],y[j]);
z=(-(h*h)*aux + aux1 +r*aux2 + r*aux3 + aux4)/q; if( fabs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z; } for(i=2;i<=n-2;i++) { aux=exemplo(x[i],y[j]); // passo 12 aux1=exemplo(x[i-1],y[j]); aux2=exemplo(x[i],y[j+1]); aux3=exemplo(x[i+1],y[j]); aux4=exemplo(x[i],y[j-1]); aux5=exemplo(x[i],y[j]);
z=(-(h*h)*aux + aux1 +r*aux2 + aux +r*aux4)/q; if( fabs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z;
} //fim do 12 { aux=exemplo(x[n-1],y[j]); // passo 13 aux1=exemplo(b,y[j]); aux2=exemplo(x[n-2],y[j]); aux3=exemplo(x[n-1],y[j+1]); aux4=exemplo(x[n-1],y[j-1]); aux5=exemplo(x[n-1],y[j]);
z=(-(h*h)*aux + aux1 + aux2 +r*aux3 +r*aux4)/q; if( fabs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z; } } //fim do 10 { aux=exemplo(x[1],y[1]); // passo 14 aux1=exemplo(a,y[1]); aux2=exemplo(x[1],c); aux3=exemplo(x[1],y[2]); aux4=exemplo(x[2],y[1]); aux5=exemplo(x[1],y[1]);
z=(-(h*h)*aux + aux1 + r*aux2 +r*aux3 + aux4)/q; if( fabs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z; } for(i=2;i<=n-2;i++) { aux=exemplo(x[i],y[1]); // passo 15 aux1=exemplo(x[i],c); aux2=exemplo(x[i-1],y[1]); aux3=exemplo(x[i],y[2]); aux4=exemplo(x[i+1],y[1]); aux5=exemplo(x[i],y[1]);
z=(-(h*h)*aux + aux1 +r*aux2 + aux3 +r*aux4)/q; if( fabs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z; } //fim do 15 { aux=exemplo(x[n-1],y[1]); // passo 16 aux1=exemplo(b,y[1]); aux2=exemplo(x[n-1],c);
aux3=exemplo(x[n-2],y[1]); aux4=exemplo(x[n-1],y[2]); aux5=exemplo(x[n-1],y[1]);
z=(-(h*h)*aux + aux1 +r*aux2 + aux3 +r*aux4)/q; if( fabs(aux5-z) > norm)
norm=fabs(aux5-z); aux5=z; } if(norm<=TOL) //passo 17 { for(i=1;i<=(n-1);i++) for(j=1;j<=(m-1);j++) //passos 18 e 19 {
printf("%f","os valores de x[i] y[j] e aux5[i][j]:",x[i],y[j],aux5);
getch(); }
printf("Procedimento completado com sucesso!"); }
//fim do if norm
l=l+1; //passo 20 }
}//fim do main
float exemplo(float a1,int a2) { float prod; /* definicao da funcao */ prod=a1*(exp(a2)); return(prod); }
10.2. Equações Diferenciais Parciais Parabólicas
10.2.1. Modelo
Cuidaremos, agora das equações parciais diferenciais parabólicas., considerando a Equação de propagação do Calor.
10.2.2. Metodologia
Consideremos a Equação de propagação do Calor:
∂ ∂ α ∂ ∂ u t x t u x x t ( , )= 2 2 ( , ) 2 (1) 0<x<1 , t>0
com condições iniciais u(t,0) = 0
Usaremos a aproximação da solução do problema de diferença finita e o método similar usado em equações diferenciais elípticas.
Primeiramente, selecionaremos duas malhas constantes, h e k, tal que m = 1/h seja um inteiro. Os pontos dessa grade serão da forma (xi,tj), onde xi = ih para i= 0,1,...,m e tj = jk, para j = 0,1,... .
Obteremos o método de diferença usando a série de Taylor em t para formar o quociente de diferença. ∂ ∂ ∂ ∂ µ u t x t u x t k u x t k k t u x i j i j i j i j ( , )= ( , + )− ( , )− ( , ) 2 2 2 (2)
para algum µj∈ (tj,tj+1) e a série de Taylor em x para formar o quociente de diferença:
∂ ∂ ∂ ∂ ε 2 2 2 2 4 4 2 12 u x x t u x h t u x t u x h t h h u x t i j i j i j i j i j ( , ) ( , ) ( ) ( , ) ( , ), , , , = + − + − − (3)
onde ε ∈ (xi-1,xi+1).
A equação diferencial parcial (1) implica que para todo ponto interior da grade (xi,tj), com i = 1,2,...,m-1 e j = 1,2,..., teremos: ∂ ∂ α ∂ ∂ u t x t u x x t i j i j ( , )− 2 2 ( , )= 2 0
então o método da diferença usando quocientes de diferença (2) e (3) é dado por:
w w k w w w h i j, +1− i j, − 2 i+1,j − i j, + i−1,j = 2 2 0
α
(4)onde wij aproxima u(xi,tj).
O erro local truncado da equação diferencial é:
τ ∂ ∂ µ α ∂ ∂ ε i j i j i j k u t x h u x t , = 2 ( , )− 12 ( , ) 2 2 2 2 4 4 (5)
w k h w k h w w i j,+1 = − i j, + ( i+,j+ i−,j) 2 2 2 2 1 1 1 2α α (6) para cada i= 1,2,...,(m-1) e j = 1,2,... .
Assim a condição inicial u(x,0) = f(x), para 0≤x≤1, implica que wi,0=f(xi), para i =
0,1,...,m, esse valor pode ser usado na eq. (6) para achar o valor de wi,j para i= 1,2,...,(m-1). A condição inicial u(0,t) = 0 e u(1,t)= 0 implica que w0,1 = wm,1 = 0, então todas as entradas da forma wi,1 pode ser determinada.
Se o procedimento é reaplicado uma vez em todas as aproximações wi,j1 os valores de wi,2, ...,wi,m-1 podem ser obtidos de maneira similar.
Uma explicitação natural do método da diferença na eq. (6) implica que a matriz (m-1) por (m-1) associada com seus sistemas pode ser escrita na forma tridiagonal :
(
)
(
)
(
)
A= − − − 1 2 0 0 1 2 0 0 0 0 1 2λ
λ
λ
λ
λ
λ
λ
onde λ = α2(k/h2). Se tivermos: w(0) = (f(x1), ... ,f(xm-1))t ew(j) = (wi,j, ... , wm-1,j)t para cada j = 1,2,...
então uma aproximação para a solução é dada por: w(j) = Aw(j-1), para cada j = 1,2,... .
Este método é conhecido como método Avançado de Diferença. Se a solução da equação diferencial parcial tem quatro derivadas parciais contínuas em x e duas em t, então a eq. (5) implica que o método é de ordem O(k + h2).
10.2.3. Algoritmo
Para aproximar solução de equações parciais parabólicas
∂∂
( )
α ∂( )
∂ u t x t u x x t , − 2 2 , = , 2 0 0< <x 1, 0< <t T,sujeito as condições de contorno
u
( ) ( )
0,t =u t1, =0, 0< <t T,e condições iniciais
u x
( )
,0 =f x( )
, 0≤ ≤x 1:Entrada ponto final l; tempo máximo T; constante
α
; inteiros m≥3,N≥1.Saída aproximações wi j, para u x t
( )
i, j para i = 1,...,m-1 e j = 1,...,N.Passo 1) Faça h l m= ; k T N= ; λ α= 2k h . 2
Passo 2) Para i = 1,...,m-1 faça wi = f ih
( )
. (valores iniciais) Passo 3) Faça l1 = + λ; 1 2u1 = −λ . l1
Passo 4) Para i = 2,...,m-2 faça l1 = +1 2λ λ+ ui−1; ui = −λ l1.
Passo 5) Faça lm−1 = +1 2λ λ+ um−2.
Passo 6) Para j = 1,...,N faça passos 7 - 11. Passo 7) Faça t = jk;
z1 = w l1 1.
Passo 8) Para i = 2,...,m - 1 faça zi =
(
wi +λzi−1)
li. Passo 9) Faça wm−1 = zm−1.Passo 10) Para i = m - 2,...,1 faça wi = zi −u wi i+1.
Passo 11) SAÍDA(t);
Para i = 1,...,m - 1 faça x = ih; SAÍDA
(
x w, i)
.Passo 12) FIM.
10.2.4. Fluxograma
Início Dados iniciais Cálculo de h,k e λ i = 1 wi = f(ih) Cálculo de l1 e u1 i = m - 1 No Yes i = 2 Cálculo de l1 e u1 i = m - 2 No i = i + 1 i = i + 1 Yes Cálculo de lm-1 j = 1 Cálculo de t e z1 i = 2Cálculo de zi i = m -1 No i = i + 1 Yes Cálculo de wm-1 i = m - 2 Cálculo de wi i = 1 No i = i - 1 Yes SAÍDA (t) i = 1 Cálculo de x SAÍDA (x,wi) i = m -1 No i = i + 1 Yes j = N Yes FIM No j = j + 1
10.2.5. Exemplo
Para h = 0.1 e k = 0.01, usado para aproximar a equação do calor
∂∂
( )
α ∂( )
∂ u t x t u x x t , − 2 2 , = , 2 0 0< <x 1, 0< t, u( ) ( )
0,t =u t1, =0, 0< t, e u x( )
,0 =senπ 0x, ≤ ≤x 1,Os resultados de wi,50 até u x
(
i, .0 5 onde i = 0,1,...,10 estão listados na tabela)
x i w i , 50 u(x i, 0.5) | w i , 50 - u(x i, 0.5) | 0 0 0 - 0,1 0,00289802 0,00222241 6,756 x 10-4 0,2 0,00551236 0,00422728 1,285 x 10-3 0,3 0,00758711 0,00581836 1,769 x 10-3 0,4 0,00891918 0,00683989 2,079 x 10-3 0,5 0,00937818 0,00719188 2,186 x 10-3 0,6 0,00891918 0,00683989 2,079 x 10-3 0,7 0,00758711 0,00581836 1,769 x 10-3 0,8 0,00551236 0,00422728 1,285 x 10-3 0,9 0,00289802 0,00222241 6,756 x 10-4 1 0 0 -
10.2.6. Implementação
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<complex.h> float f(float a1); void main(void) { //declaração de variáveis float l[4],lfinal,T; float i,j,t,u[4],w[4]; float lam,h,k,x,z[4]; //constantes const A = 5 ; const m=5; const N=6; //entrada de dadosscanf("%f",&lfinal);
printf("entre com o tempo m ximo T: "); scanf("%f",&T); // PASSO 1 h=lfinal/m; k=T/N; lam = A*A*(k/h*h); w[m]=0; //PASSO 2 for (i=1;i<=(m-1);i++) w[i]=f(i*h);
// passo 3-11 resolve um sistema linear tridimensional usando // o algoritmo 6.7.) //PASSO 3 l[1] = 1 + lam; u[1] = -lam/(2*l[1]); //PASSO 4 for (i=2;i<=(m-2);i++) { l[i] = 1+lam+((lam*u[i-1])/2); u[i] = -lam/(2*l[i]); } //PASSO 5 l[m-1] = 1+lam+((lam*u[m-2])/2); //PASSO 6
for (j=1;i<=N;j++) //passos 7-11 { //PASSO 7 t = j*k; z[1] = (((1-lam)*w[1])+((lam/2)*w[2]))/l[1]; //PASSO 8 for (i=2;i<=(m-1);i++) z[i] = (((1-lam)*w[i])+((lam/2)*w[i+1]+w[i-1]+z[i-1]))/l[i]; //PASSO 9 w[m-1] = z[m-1]; //PASSO 10 for (i=(m-2);i<=1;i++)
w[i] = z[i]-u[i]*w[i]+1; //PASSO 11 // OUTPUT for(i=1;i<=(m-1);i++) { x = i*h;
printf("%f","os valores de x w[i]:",x,w[i]); getch(); } } //PASSO 12 //STOP printf("Procedimento completado !"); }//fim do main
float f(float a1) { float exponencial; /* definição da função */ exponencial = exp(a1); return(exponencial); }