Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Palombo
8.1. Introdução
Nos problemas de aproximação por diferenças finitas, para aproximar a solução
funções que minimizam uma certa integral. Então, o conjunto de funções viáveis fica
8.2. Motivação
Um importante problema linear com valor limite de dois pontos na análise
d dy
(1.32) − p(x ) + q (x ) y = f (x ) para 0 ≤ x ≤ 1 ,
dx dx
com as condições limites
(1.33) y ( 0 ) = y (1) = 0 .
170
Esta equação diferencial descreve o desvio y ( x ) em um raio de extensão com
uma secção de cruzamento representada por q (x) . Este desvio é devido às tensões
p(x ) e f (x ) .
e que q (x ) ≥ 0 para 0 ≤ x ≤ 1.
Essas suposições são suficientes para garantir que o problema com o valor limite
fenômeno físico, a solução para equação raio satisfaz uma propriedade variante. O
Rayleigh-Ritz e caracteriza a solução para a equação de raio como a função que minimiza
uma certa integral em todas as funções em C02 [ 0,1] , o conjunto destas funções u em
caracterização. A prova deste teorema, por enquanto não difícil, é extensa; pode ser
encontrada em Schultz[77].
8.3. Método
171
(1.34) p(x ) ≥ δ > 0 , q (x ) ≥ 0 para 0 ≤ x ≤ 1.
d dy
(1.35) − p(x ) + q (x ) y = f (x ) , 0≤ x≤1
dx dx
n
I[ c φ ].
i =1 i i
Da Eq.(1.36),
172
n
(1.37) I [φ ] = I [ ciφ i ] =
i =1
1 n
n
{ p( x )[ c φ , ( x )]2
i =1 i i
+ q ( x )[ ciφ i ( x )]}
0 i =1
c1 , c2 ,..., cn , ter
∂I
(1.38) =0 para cada j = 1,2,..., n .
∂c j
Diferenciando (1.37) dá
∂I 1 n
, ,
n
= 2 p( x ) ciφ i ( x )φ j ( x ) + 2q ( x ) ciφ i ( x )φ j ( x ) − 2 f ( x )φ j ( x ) dx
∂c j 0 i =1 i =1
(1.39)
n 1 1
, ,
0= { p( x )φ i ( x )φ j ( x ) + q ( x )φ i ( x )φ j ( x )}dx c1 − f ( x )φ j ( x )dx
i =1 0 0
173
0 = x0 < x1 <... < xn < xn +1 = 1 .
0, 0 ≤ x ≤ xi −1 ,
( x − xi −1 )
xi −1 ≤ x ≤ xi ,
hi −1
(1.40) φi ( x) =
( xi +1 − x )
xi ≤ x ≤ xi +1 ,
hi
0, xi +1 ≤ x ≤ 1,
para cada i = 1,2,..., n .
A partir do momento que as funções φi são intervalos lineares convenientes, as
0, 0 < x < xi −1 ,
1
xi −1 < x < xi ,
hi −1
(1.41) φi , ( x) =
1
− xi < x < xi +1 ,
hi
0, xi +1 < x < 1,
para cada i = 1,2,..., n .
174
Porque φi e φ i , são não nulo somente em ( xi −1 , xi +1 ) , o sistema linear (1.39)
reduz para um n × n o sistema linear tridiagonal:
(1.42) Ac = b .
As entradas não nulas em são dadas por
1
aii = { p( x )[φ i , ( x )]2 + q ( x )[φ i , ( x )]2 }dx
0
xi 2 xi +1 2
1 −1
= p( x )dx + p( x )dx +
xi −1 hi −1 xi hi
xi 2 xi +1 2
1 2 1
+ ( x − xi −1 ) q ( x )dx + ( xi +1 − x ) 2 q ( x )dx
xi −1 hi −1 xi hi
xi +1 2 xi +1 2
1 1
= − p( x )dx + ( xi +1 − x )( x − xi )q ( x )dx
xi hi xi hi
xi 2 xi 2
1 1
= − p( x )dx + ( xi − x )( x − xi −1 )q ( x )dx
x i −1 hi −1 xi −1 hi −1
175
para cada i = 2,..., n . As entradas em b são dadas por
1
bi = f ( x )φ i ( x )dx
0
xi xi +1
1 1
= ( x − xi −1 ) f ( x )dx + ( x − x ) f ( x )dx
xi −1 hi −1 xi hi i +1
n
φ ( x) = ci φ i ( x )
i =1
é construída.
devem ser executadas, então uma fórmula quadratura deve ser incluída. É recomenda que
convenientes φ i ,..., φ n , a menos que estes valores possam ser avaliados facilmente.
8.4. Algorítmo
Para aproximar a solução ao problema de valor limite
d dy
− p(x ) + q (x ) y = f (x ) para 0 ≤ x ≤ 1, y (0) = y (1) = 0
dx dx
176
com a função linear
n
φ ( x) = ci φ i ( x ):
i =1
0, 0 ≤ x ≤ xi −1 ,
( x − xi −1 )
xi −1 ≤ x ≤ xi ,
hi −1
φi ( x) =
( xi +1 − x )
xi ≤ x ≤ xi +1 ,
hi
0, xi +1 ≤ x ≤ 1,
Passo 3: Para cada i = 1, 2,..., n-1 computar
2 xi +1
1
Q1, i = ( xi + 1 − x )( x − xi ) q ( x ) dx
h1 xi
2 xi
1
Q2, i = ( x − xi − 1) 2 q ( x ) dx
hi −1 xi −1
2 xi +1
1
Q 3, i = ( xi + 1 − x ) 2 q ( x ) dx
hi xi
177
2 xi
1
Q4 , i = p( x )dx
hi −1 xi −1
xi
1
Q 5, i = ( x − xi − 1) f ( x ) dx
hi − 1 xi −1
x i +1
1
Q 6, i = ( x i + 1 − x ) f ( x ) dx
hi xi
βi = Q 1, i − Q 4, i + 1
bi = Q 5, i +Q 6, i
Passo 5: Estabeleça
α n = Q 4 , n + Q 4 , n + 1 + Q 2 , n + Q 3, n
bn = Q 5 , n + Q 6 , n
Passo 6: Estabeleça
a1 = α 1
β1
ζ1 =
α1
Passo 7: Para i = 2,...., n-1 estabeleça
ai = α i − β i −1ζ i −1
178
βi
ζi =
ai
Passo 8: Estabeleça an = α n − β n − 1ζ n − 1
b1
Passo 9: Estabeleça z1 =
a1
Passo 10: Para i = 2,..., n estabeleça
(bi − β i −1zi −1 )
zi =
ai
Passo 11: estabeleça
cn = zn
Saída( cn )
ci = zi − ζ i ci +1
Saída( ci )
8.5. Fluxograma
179
Início
Para i = 0
até n
Yes hi = xi+1 - xi
No
Definição do
Para i = 1 intervalo
Yes
até n conveniente
base linear
No
Para cada i
Yes
Q1,i Q2,i Q3,1 Q4,i
= 1,2...,n-1 Q5,i Q6,i
No
Ai = Q 4,i+Q4,i+1 +Q2,i+Q3,i
Para cada i
= 1,2...,n-1
Yes Bi = Q 1,i - Q 4,i+1
bi = Q 5,i + Q 6,i
No
a1 = A 1
C1 = B 1 / A1
Para cada i
Yes
a1 = A 1 - B i-1 *Ci-1
= 2...,n-1 Ci = B i / A i
No
an = A n- Bn-1*Cn-1
180
z 1 = b1 / a 1
Para cada i
= 2...,n
Yes zi = (bi - Bi-1*zi-1) / ai
No
c n = zn
Display
(cn)
No
Pare
8.6. Implementação
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <trigon.h>
#include <math.h>
#include <graphics.h>
#include <stdlib.h>
#define n 9
double sqr(double);
181
double func(double x);
double simpson();
double inter;
double intsimp;
double qx,fx;
double tipofuncaos;
char tipofuncao[15],teste[10];
void Plota_Tabela(void);
void Passo1(void);
void Passo2(void);
void Passo3(void);
void Passo4(void);
void Passo5(void);
void grafico(void);
vetor h,Fii,alfa,beta,gama,b,a,z,c;
float x[]={.0,.1,.2,.3,.4,.5,.6,.7,.8,.9};
double X,IOLD1,IOLD2,INEW1,INEW2,INEW3,INEW4,INEW5,INEW6;
int i;
void main(void) {
182
clrscr();
Passo1();
Passo2();
Passo3();
Passo4();
Passo5();
if (tipofuncaos==1) {
a[1]=alfa[1];
gama[1]=beta[1]/alfa[1];
a[i]=alfa[i]-(beta[i-1]*gama[i-1]);
gama[i]=beta[i]/a[i];
a[n]=alfa[n]-(beta[n-1]*gama[n-1]);
z[1]=b[1]/a[1];
z[i]=(b[i]-(beta[i-1]*z[i-1]))/a[i];
c[n]=z[n];
printf("%f",c[n]);
c[i]=z[i]-(gama[i]*c[i+1]);
printf("%f",c[i]);
getch();
183
Plota_Tabela();
double simpson() {
int m=50;
double result;
double valor;
qx=(sqr(3.141597));
fx=2*qx*(sin(3.141597*X));
int i;
intsimp=0;
if ((strcmp(tipofuncao,"IOLD1")==0) || (strcmp(tipofuncao,"IOLD2")==0)) {
inter=(x[1]-x[0])/m;
valor=x[0];
else if (strcmp(tipofuncao,"INEW5")==0) {
inter=(x[i]-x[i-1])/m;
valor=x[i-1];
else if (strcmp(tipofuncao,"INEW51")==0) {
inter=(x[n]-x[n-1])/m;
valor=x[n-1];
184
else if ((strcmp(tipofuncao,"INEW11")==0) ||
(strcmp(tipofuncao,"INEW31")==0) ||
(strcmp(tipofuncao,"INEW61")==0)) {
inter=(x[n+1]-x[n])/m;
valor=x[n];
else {
inter=(x[i+1]-x[i])/m;
valor=x[i];
func(valor+inter)) + intsimp;
valor=valor+inter;
return(intsimp);
double func(double X) {
double y;
if (strcmp(tipofuncao, "IOLD1")==0)
y=1;
185
if (strcmp(tipofuncao, "IOLD2")==0)
y=(sqr(X-x[0]))*qx;
if (strcmp(tipofuncao, "INEW1")==0)
y=1;
if (strcmp(tipofuncao, "INEW11")==0)
y=1;
if (strcmp(tipofuncao, "INEW2")==0)
y=(sqr(X-x[i]))*qx;
if (strcmp(tipofuncao, "INEW3")==0)
y=(sqr(x[i+1]-X))*qx;
if (strcmp(tipofuncao, "INEW31")==0)
y=(sqr(x[n+1]-X))*qx;
if (strcmp(tipofuncao, "INEW4")==0)
y=(x[i+1]-X)*(X-x[i])*qx;
if (strcmp(tipofuncao, "INEW5")==0)
y=(X-x[i-1])*fx;
186
if (strcmp(tipofuncao, "INEW51")==0)
y=(X-x[n-1])*fx;
if (strcmp(tipofuncao, "INEW6")==0)
y=(x[i+1]-X)*fx;
if (strcmp(tipofuncao, "INEW61")==0)
y=(x[n+1]-X)*fx;
return (y);
double sqr(double T) {
T=T*T;
return(T);
void Passo1(void) {
h[i]=x[i+1]-x[i];
void Passo2(void) {
tipofuncaos=0;
187
for (i=1; i<=n-1; i++) {
Fii[i] = 0.0;
Fii[i] = (X-x[i-1])/h[i-1];
Fii[i]=(x[i+1]-X)/h[i];
Fii[i]=0.0;
void Passo3(void) {
strcpy(tipofuncao,"IOLD1");
IOLD1=(sqr(1/h[0]))*simpson();
strcpy(tipofuncao,"IOLD2");
IOLD2=(sqr(1/h[0]))*simpson();
void Passo4(void) {
if (tipofuncaos==1) {
strcpy(tipofuncao,"INEW1" );
188
INEW1=(sqr(1/h[i]))*simpson();
strcpy(tipofuncao,"INEW2" );
INEW2=(sqr(1/h[i]))*simpson();
strcpy(tipofuncao,"INEW3" );
INEW3=(sqr(1/h[i]))*simpson();
strcpy(tipofuncao,"INEW4" );
INEW4=(sqr(1/h[i]))*simpson();
strcpy(tipofuncao,"INEW5" );
INEW5=(1/h[i-1])*simpson();
strcpy(tipofuncao,"INEW6" );
INEW6=(1/h[i])*simpson();
alfa[i]=IOLD1+INEW1+IOLD2+INEW3;
beta[i]=-INEW1+INEW4;
b[i]=INEW5+INEW6;
IOLD1=INEW1;
IOLD2=INEW2;
void Passo5(void) {
strcpy(tipofuncao,"INEW11" );
INEW1=(sqr(1/h[n]))*simpson();
strcpy(tipofuncao,"INEW31" );
189
INEW3=(sqr(1/h[n]))*simpson();
strcpy(tipofuncao,"INEW51" );
INEW5=(1/h[n-1])*simpson();
strcpy(tipofuncao,"INEW61" );
INEW6=(1/h[n])*simpson();
alfa[n]=IOLD1+INEW1+IOLD2+INEW3;
beta[n]=INEW5+INEW6;
result();
void Plota_Tabela(void) {
int i;
char s[20];
if (tipofuncaos==1) {
settextstyle(0,0,0);
line(460,90,460,450);
line(540,90,540,450);
line(620,90,620,450);
for (i=0;i<=30;i++)
line(460,90+12*i,620,90+12*i);
outtextxy(510,43,"Tabela");
outtextxy(210,65,"i");
190
outtextxy(465,77,"(Ton/cm2)");
outtextxy(300,65,"xi");
outtextxy(560,77,"x1000");
for (i=0;i<=29;i++) {
sprintf(s,"%2.4f",i);
outtextxy(210,93+12*i,s);
if (i<7)
sprintf(s,"%2.4f",x[i]);
else if (i<14)
sprintf(s,"%2.3f",Fii[i]);
else if (i<21)
sprintf(s,"%2.2f",fx);
else sprintf(s,"%2.1f",Fii[i]-fx);
outtextxy(300,93+12*i,s);
8.7. Exemplo
O exemplo seguinte usa o algoritmo acima.
191
− y′′+π 2 y = 2π 2 sin(πx ) 0 ≤ x ≤ 1, y (0) = y (1) = 0
. tal que xi = 0.1i para cada i = 0 ,1, ....9 . As integrais são
Façamos hi = h = 01
. i +01
01 .
π2
Q1, i = 100 . i + 01
(01 . i)π dx =
. − x)(x − 01 2
01
.i
60
01
.i
π2
Q2, i = 100 (x − 01 . ) π dx =
. i + 012 2
. i −01
01 .
30
. i +01
01 .
π2
Q3, i = 100 (01 . − x) π dx =
. i + 01 2 2
01
.i
30
01
.i
Q4, i = 100 dx = 10
. i −01
01 .
0.1i
192
π2
a i , i = 20 + para cada i = 1,2 ,...9
15
π2
a i , i + 1 = − 10 + para cada i = 1,2 ,...8
60
π2
a i , i − 1 = − 10 + para cada i = 2 ,3,...9
60
c 9 = 0.3102866742 c 4 = 0.9549641893
c 8 = 0 .5902003271 c 3 = 0.8123410598
c 7 = 0.8123410598 c 2 = 0.5902003271
c 6 = 0.9549641893 c 1 = 0.3102866742
c 5 = 1.004108771
O intervalo da aproximação linear é
9
φ ( x) = c iφ i ( x )
i =1
y ( x ) = sin π x
193