Académique Documents
Professionnel Documents
Culture Documents
9. Diferenças Finitas.
Métodos para problemas de valor de
fronteira
9.1. Introdução
Alguns problemas comuns em engenharia consistem por exemplo da deflexão de
uma viga que está sujeita a uma carga uniforme. Esta situação pode ser modelada
finitas, consistem em restituir cada uma das derivadas na equação diferencial na equação
9.2. Motivação
Essa diferença-quociente é geralmente escolhida segundo a manutenção de uma
y''=p(x)y'+q(x)y+r(x)
196
para aproximar ambos y' e y''.Para realizar isto,selecionamos um inteiro N>0 e dividimos
o intervalo [a,b] em N+1 subintervalos, cujos pontos finais são os pontos xi =a+ih,para
(b − a )
i=0,1,2,...,N+1, onde h = . Escolhendo a constante h desta maneira, teremos um
( N + 1)
sistema de equações lineares que poderá ser colocado como uma matriz NxN, facilitando a
No interior dos pontos xi , i=1, 2,..., N, a equação diferencial que faz a aproximação
h2 h3 h 4 (4) +
y ( xi +1 ) = y ( xi + h ) = y ( xi ) + hy ' ( xi ) + y ' ' ( xi ) + y ' ' ' ( xi ) + y ( ξ i ) (ii),
2! 3! 4!
h2 h3 h 4 ( 4) −
y( xi −1 ) = y( xi − h) = y( xi ) − hy ' ( xi ) + y ' ' ( xi ) − y ' ' ' ( xi ) + y ( ξi ) (iii), para
2! 3! 4!
− −
algum ξi xi −1 < ξ i < xi , assumindo que y pertence ao intervalo [ xi −1 , xi +1 ].
1 h 2 (4) +
[ ]
y ' ' ( xi ) = 2 y( xi +1 ) − 2 y ( xi ) + y ( xi −1 ) − [ y (ξ i ) + y ( 4 ) (ξ i − )] (iv)
h 24
O teorema do valor médio pode ser usado para simplificar a expressão acima:
1 h 2 (4)
y ' ' ( xi ) = y ( xi +1 ) − 2 y ( xi ) + y ( xi −1 ) − y ( ξ i ) (v)
h2 12
para algum ponto ξi , xi −1 < ξi < xi +1 ,que é chamada fórmula da diferença centrada para
y ''( xi ) . A fórmula da diferença centrada para y '( xi ) pode ser obtida de maneira similar e
197
resulta em
1 h2
y ' ( xi ) = y ( xi +1 ) − y ( xi −1 ) − y ' ' ' ( ηi ) (vi)
2h 6
resulta na equação
y ( x i +1 ) − 2 y ( x i ) + y ( x i −1 ) y ( x i +1 ) − y ( x i −1 ) h2
h 2 = p( x i )
2h
+ q ( xi ) y( xi ) + r ( xi ) −
12
[ 2 p( x i ) y ' ' ' (η i ) − y ( 4 ) (ξ i )] .
(vii)
y ( a ) = α , y (b ) = β de w0 = α , wn +1 = β e
2 wi − wi +1 − wi −1 wi +1 − wi −1
2 + p( xi ) + q ( xi ) wi = − r ( xi ) para cada i=1,2,...,N.
h 2h
h h
− 1+ p( xi ) wi −1 + (2 + h 2 q ( xi )) wi − 1 − p( xi ) wi +1 = − h 2 r ( xi ) , o que resulta
2 2
O sistema triangular tem uma solução única que obedece às condições do seguinte
sistema linear tridiagonal tem uma única solução fornecida, que h<2/L, onde L
=maxa ≤ x ≤b p ( x ) .
Deve-se notar que a hipótese do teorema garante uma única solução para o
problema de valor de fronteira, mas ele não garante que y pertence ao intervalo[a,b]. É
198
truncamento tem ordem O ( h 2 ) .
2 2 sin (ln( x ))
y '' = − y' + 2 y + , 1 ≤ x ≤ 2 ,y(1)=1,y(2)=2.
x x x2
Kutta.
diferenças finitas:
Passo 1 h = (b-a)/(n+1)
Passo2 x=a+h;
a1=2+h^2.q(x);
b1=-1+h.p(x)/2;
d1==-h^2.r(x)+(1+h^2.p(x)/2).a;
199
x=a+ih;
ai=2+h^2.q(x);
bi=-1+h.p(x)/2;
ci=-1-h.p(x)/2;
di=-h^2.r(x);
Passo 4 x=b-h;
na=2+h^2.q(x);
cn=-1-h.p(x)/2;
dn=-h^2+(1-h.p(x)/2).ß;
l1=a1;
ul=bl/al;
Li=ai-ci*ui-1;
ui=bi/li;
Passo 6 ln=na-cn*un-1;
zl=d1/l1;
zi=(di-ci*zi-1)/li;
Passo 8 wn=zn;
wi=zi-ui*wi+1;
x=a+ih;
saida: x, wi;
200
Fim
# include <iostream.h>
# include <math.h>
# include <stdio.h>
const max=50;
double a,b,h,n,alfa,beta,wi,x;
double qx(double);
double px(double);
double rx(double);
double f(double);
int i;
void main()
double an,cn,dn,x,aux1,aux2,aux3,aux4;
double aaux[max],baux[max],caux[max],daux[max];
double l[max],u[max],z[max],w[max];
201
cout << "\n Digite o valor inicial de x: ";
cin >> a;
cin >> b;
cin >> n;
h=(b-a)/(n+1);
x=a+h;
aaux[1]= 2+pow(h,2)*qx(x);
baux[1]= -1+h*px(x)/2;
daux[1]=(-1)*pow(h,2)*rx(x)+(1+h*px(x)/2)*alfa;
for(i=2;i<n;i++)
x=a+i*h;
aux1=2+pow(h,2)*qx(x);
aux2=(-1)+h*px(x)/2;
aux3=(-1)-h*px(x)/2;
aux4=(-1)*pow(h,2)*rx(x);
aaux[i]=aux1;
202
baux[i]=aux2;
caux[i]=aux3;
daux[i]=aux4;
x=b-h;
an=2+pow(h,2)*qx(x);
cn=-1-h*px(x)/2;
dn=(-1)*pow(h,2)+(1-h*px(x)/2)*beta;
aaux[n]=an;
caux[n]=cn;
daux[n]=dn;
l[1]=aaux[1];
u[1]=baux[1]/aaux[1];
for(i=2;i<n;i++)
l[i]=aaux[i]-caux[i]*u[i-1];
u[i]=baux[i]/l[i];
l[n]=aaux[n]-caux[n]*u[n-1];
z[1]=daux[1]/l[1];
for(i=2;i<n+1;i++)
z[i]=(daux[i]-caux[i]*z[i-1])/l[i];
203
w[0]=alfa;
w[n+1]=beta;
w[n]=z[n];
for(i=n-1;i>0;i--)
w[i]=z[i]-u[i]*w[i+1];
for(i=0;i<=n+1;i++)
x=a+i*h;
cout << "\n x: " << x << "\t" << " w: " << w[i] << "\t";
double px(double x)
return(-4/x);
double qx(double x)
return (-2/pow(x,2));
double rx(double x)
204
return (2*log(x)/pow(x,2));
double f(double x)
return (px(x)+qx(x)+rx(x));
/* */
/* e numero de subintervalos n. */
/* i=0,1,...,N */
# include<stdio.h>
# include<iostream.h>
# include<math.h>
const max=50;
double a,b,h,n,alfa,beta,wi,x;
double qx(double);
double px(double);
double rx(double);
205
double f(double);
int i;
void main()
double u1[max],u2[max],v1[max],v2[max],k1[max],k2[max],k3[max],k4[max];
double dk1[max],dk2[max],dk3[max],dk4[max];
double w1,w2,w10,w20;
cin >> a;
cin >> b;
cin >> n;
h=(b-a)/n;
u1[0]=alfa;
u2[0]=0;
v1[0]=0;
v2[0]=1;
for(i=0;i<n;i++)
206
{ /* metodo de Runge Kutta */
x=a+i*h;
k1[1]=h*u2[i];
k1[2]=h*(px(x)*u2[i]+qx(x)*u1[i]+rx(x));
k2[1]=h*(u2[i]+k1[2]/2);
k2[2]=h*(px(x+h/2)*(u2[i]+k1[2]/2)+qx(x+h/2)*(u1[i]+k1[1]/2)+rx(x+h/2));
k3[1]=h*(u2[i]+k2[2]/2);
k3[2]=h*(px(x+h/2)*(u2[i]+k2[2]/2)+qx(x+h/2)*(u1[i]+k2[1]/2)+rx(x+h/2));
k4[1]=h*(u2[i]+k3[2]);
k4[2]=h*(px(x+h)*(u2[i]+k3[2])+qx(x+h)*(u1[i]+k3[1])+rx(x+h));
u1[i+1]=u1[i]+(k1[1]+2*k2[1]+2*k3[1]+k4[1])/6;
u2[i+1]=u2[i]+(k1[2]+2*k2[2]+2*k3[2]+k4[2])/6;
dk1[1]=h*v2[i];
dk1[2]=h*(px(x)*v2[i]+qx(x)*v1[i]);
dk2[1]=h*(v2[i]+dk1[2]/2);
dk2[2]=h*(px(x+h/2)*(v2[i]+dk1[2]/2)+qx(x+h/2)*(v1[i]+dk1[1]/2));
dk3[1]=h*(v2[i]+dk2[2]/2);
dk3[2]=h*(px(x+h/2)*(v2[i]+dk2[2]/2)+qx(x+h/2)*(v1[i]+dk2[1]/2));
dk4[1]=h*(v2[i]+dk3[2]/2);
dk4[2]=h*(px(x+h)*(v2[i]+dk3[2])+qx(x+h)*(v1[i]+dk3[1]));
v1[i+1]=v1[i]+(dk1[1]+2*dk2[1]+2*dk3[1]+dk4[1])/6;
v2[i+1]=v2[i]+(dk1[2]+2*dk2[2]+2*dk3[2]+dk4[2])/6;
w10=alfa;
207
w20=(beta-u1[n])/v1[n];
cout << "\nx0: " << a << "\t" << "u(1,i): "<< u1[0] << "\t"<< "v(1,i): "<< v1[0] << "\t"
for(i=1;i<=n;i++)
w1=u1[i]+w20*v1[i];
// w2=u2[i]+w20*v2[i];
x=a+i*h;
cout << "\nx: " << x << "\t" << "u(1,i): " << u1[i] << "\t" << "v(1,i): " << v1[i] << "\t"
double px(double x)
return(-4/x);
double qx(double x)
return (-2/pow(x,2));
double rx(double x)
return (2*log(x)/pow(x,2));
208
}
double f(double x)
return (px(x)+qx(x)+rx(x));
/*double px(double x)
return(-2/x);
double qx(double x)
return (2/pow(x,2));
double rx(double x)
return (sin(log(x))/pow(x,2));
double f(double x)
return (px(x)+qx(x)+rx(x));
}*/
9.3.2. Exemplo
209
Calcular o problema:
4 2 2
y' ' = − y '− 2 y + 2 ln x
x x x
0.80
0.40
0.00
-0.40
-0.80
210
valores usando dif. usando
Iniciais finitas R.K
1 -0.5 -0.5
1.05 -0.337845 -0.336338
1.1 -0.204267 -0.21845
1.15 -0.092227 -89165
1.2 0.003246 0.006726
1.25 0.085738 0.089485
1.3 0.157893 0.161801
1.35 0.221694 0.22569
1.4 0.278654 0.282686
1.45 0.329944 0.333974
1.5 0.376481 0.380485
1.55 0.418997 0.422955
1.6 0.458076 0.461976
1.65 0.494194 0.498028
1.7 0.527741 0.531503
1.75 0.55904 0.562725
1.8 0.588358 0.591965
1.85 0.615922 0.61945
1.9 0.641922 0.64537
1.95 0.6652 0.669899
2 0.693147 0.693147
9.4. Conclusão
211
Podemos notar pela comparação dos métodos que os resultados obtidos com a
aplicação do programa de diferenças finitas é menos acurado que aqueles obtidos pela
aplicação do método que utiliza Runge Kutta. Isso pode ser explicado pelo fato do
método que utiliza a técnica de Runge Kutta possuir um erro de truncamento da ordem
de O ( h 2 ) .
acurada,através do uso da série de Taylor de quinta ordem (o que resultaria num erro de
y '( xi ) ,o que dificultaria a implementação do loop i=0 até =N.Além do mais a resolução
212