Você está na página 1de 13

Introduo:

Ao contrrio da maioria dos polinmios de 1o e 2o graus, as razes de uma equao mais complexa (como por exemplo, x4 + ex, ln x, sen x + x2...) so geralmente calculadas como uma aproximao, e no como um nmero exato. Ou seja, leva-se em conta ainda uma margem de erro, que deve ser suficientemente pequena. Um dos vrios mtodos utilizados para o clculo da raiz de uma funo o Mtodo da Falsa Posio. O Mtodo da Falsa Posio um dos mtodos mais antigos conhecidos para este clculo. Porm vinha sendo surpreendentemente negligenciado at recentemente (dcada de 60) quando suas vantagens (especialmente quando utilizado em computadores) foram novamente compreendidas. O mtodo pode ser aplicado a qualquer funo e, assim como o Mtodo da Bisseo, a raiz ir sempre convergir (desde que considerado um intervalo contnuo). Alm disso, o mtodo utiliza apenas matemtica elementar, no exigindo conhecimentos de integrao ou derivao. Os algoritmos utilizados para ilustrar o mtodo foram escritos em C e testados em um computador Pentium III 800 MHz. A primeira linha de cada algoritmo a definio do nmero mximo de razes a serem calculadas. Porm dificilmente este limite ser alcanado, pois uma vez atingida a preciso mxima que um nmero em ponto flutuante admite (de acordo com a arquitetura do processador) os resultados passaro a se repetir. Este trabalho, assim como os algoritmos digitados e compilados, pode ser pode ser obtido em http://www.inf.ufsm.br/~abdu/mfp.html

O Mtodo da Falsa Posio

Idia: Queremos encontrar a raiz de uma funo f(x), ou seja, encontrar o xi na qual f(xi) mais se aproxime de zero. Precisamos, primeiro, localizar a raiz, ou seja, definir o intervalo onde ela se encontra: a raiz est entre x1 e x2 Uma vez definido o intervalo, traamos uma reta que passe por x1 e x2. Esta reta ir cortar o eixo X em um ponto, x3, que uma aproximao da raiz:

Para calcular a prxima aproximao, x4, iremos utilizar x3, e um dos outros pontos: x2 ou x1. Mas, afinal, qual deles escolher? Devemos escolher o ponto xi de modo que f(x3).f(xi) < 0 (ou seja, um est acima do eixo X e o outro, abaixo). Observando o grfico, fcil perceber que a interseo da reta que passa por f(x3) e f(x1) com o eixo X est bastante prxima da raiz que estamos procurando.

Relao de Recorrncia:

xi =

f(xi-1)xi-j + f(xi-j)xi-1 f(xi-1)-f(xi-j) f(xi-j)f(xi-1)


xi a aproximao da raiz deve ser escolhido de modo que f(xi-1).f(xi-j) < 0

onde i = 3, 4, 5 ... n e j = 2, 3, 4 ... n-1

Repete-se o processo at que | xi - xi-1 | < TOLERNCIA. Ou, em computadores, at que xi = xi-1. Neste caso, TOL ser o menor nmero (em valor absoluto) representvel pela mquina (lembre que um nmero menor que o menor nmero representvel por um computador considerado 0 regio de underflow). O Mtodo da Falsa Posio um excelente mtodo quando o intervalo escolhido para a raiz pouco preciso. Em ltimo caso podemos simplesmente escolher dois pontos x que tenham f(x) de sinais opostos e aplicar o mtodo. Em contra-partida, sua convergncia lenta. Exemplos: Ache a raiz de f(X) = sen X - X , com TOL = 10-2 : 2

Sabemos que existe uma raiz entre 0. 2 Ento x3 = f(x2)x1 + f(x2) -f(x1)

e que f( ) .f() < 2

f(x1)x2 = 1,75960... f(x1) -f(x2)

x1 = /2 x2 = x3 = 1,75960 f(x3) .f(x2) < 0 (Verdadeiro) x4 = 1,84420 + f(x2)x3 -f(x2) f(x2) -f(x3) f(x4) .f(x3) < 0 (Falso) f(x4) .f(x2) < 0 (Verdadeiro) x5 = 1.87701 f(x4)x2 + f(x2)x4 ) -f(x2) f(x2) -f(x4) f(x5) .f(x4) < 0 (Falso)

x4 =

f(x3)x2 f(x 3)

x5 = f(x
4

f(x5) .f(x3) < 0 (Falso) f(x5) .f(x2) < 0 (Verdadeiro) x6 = 1.88895 + f(x2)x5 -f(x5) f(x6) .f(x5) < 0 (Falso) f(x6) .f(x4) < 0 (Falso) f(x6) .f(x3) < 0 (Falso) f(x6) .f(x2) < 0 (Verdadeiro) x7 = 1.89319 f(x6)x2 + f(x2)x6 -f(x2) f(x2) -f(x6) | x7 - x6| = 0,00424
Algoritmo:

x 6 = f(x5)x2 f(x 5) -f(x2) f(x2)

x7 = f(x 6)

< TOL

No algoritmo deste exemplo, voc deve informar o intervalo onde se encontra a raiz. Ver: ANEXO 1 - mfp1.c Resultado: Mtodo da Falsa Posio para a funo f(x) = sen x - x/2 Digite o intervalo. A raiz est entre 1.57 e 3.14 x1 = 1.570000052452087400 x2 = 3.140000104904174800 x3 = 1.759272336959838870 x4 = 1.844091534614562990 x5 = 1.876980304718017580 x6 = 1.888945698738098140 x7 = 1.893193244934082030 x8 = 1.894687652587890620 x9 = 1.895211696624755860 x10 = 1.895395278930664060 x11 = 1.895459651947021480 x12 = 1.895482182502746580 x13 = 1.895490050315856930 x14 = 1.895492792129516600 x15 = 1.895493745803833010 x16 = 1.895494103431701660 x17 = 1.895494222640991210 x18 = 1.895494222640991210

Soluo: x18 = 1.895494222640991210

Note que voc no precisa especificar uma tolerncia como critrio de parada. O resultado ser calculado com a menor tolerncia possvel de ser representada pela mquina e com uma preciso de 18 algarismos significativos. Ache a raiz de f(x) = x - 3, com TOL = 10-2 :

Sabemos que existe uma raiz entre 1 e 2, e que f(1) .f(2) < 0. Ento x2 = n 0 1 2 3 4 5 6 7 xn f(x1)x0 + f(x1) -f(x0) f(x0)x1 f(x0) -f(x1) f(xn) = 1.6666666...

1 -2 2 1 1.666666666 -0.22 1.7272727272 -0.0165 1.7317 -0.001189 1.732026 -0.000085 1.732048 -0.0000 ... 1.732050
De fato, a soluo para f(x) = x - 3 3 .

Algoritmo: Novamente, voc deve informar o intervalo onde se encontra a raiz. Ver: ANEXO 2 mfp2.c

Ache uma raiz positiva de f(x) = x3 2x2 + 4x - 1, com TOL = 10-3 :

Sabemos que existe uma raiz entre 1 e 0, e que f(1) .f(0) < 0. Ento x2 = n 0 xn 0 f(x1)x0 + f(x1) -f(x0) f(x0)x1 f(x0) -f(x1) = 0.333333333333 ...

sinal de f(xn)

1 2 3 4 5

1 + 0.333333333 0.290322 0.285417 0.284849

+ + +

x3 =

f(x1)x2 + f(x2)x1 f(x1) -f(x2) f(x2) -f(x1)

Soluo: x = 0.284849

Referncias Bibliogrficas:

1 RALSTON, Anthony. A First Cours in Numerical Analysis International Student Edition. Editora McGraw-Hill Kogakusha, 1965, Tokio, Japo. 2 BARROSO, Lenidas Conceio; BARROSO, Magali Maria de Arajo; CAMPOS, Frederico Ferreira, filho; CARVALHO, Mrcio Luiz Bunte de; MAIA, Miriam Loureno. Clculo Numrico (Com Aplicaes). Segunda Edio. Editora HARBRA Ltda, 1987, So Paulo, SP.

ANEXOS

ANEXO 1 mfp1.c
#define MAX 30 /* nmero mximo de razes que podem ser calculadas */ #include <math.h> float f(float); void main() { float x[MAX];

int j; int i; /* indica quantas razes foram calculadas */ int n; /* para imprimir na tela as razes calculadas */ char intervalo[18]; clrscr();

/* Vetor que armazena as razes. A posio x[0] desprezada. * A primeira aproximao est em x[1], a segunda em x[2] ... */

printf("Mtodo da Falsa Posio para a funo f(x) = sen x - x/2\n\n"); printf("Digite o intervalo.\nA raiz est entre "); gets(intervalo); x[1] = atof(intervalo); printf("e "); gets(intervalo); x[2] = atof(intervalo); if ( f(x[1]) * f(x[2]) > 0 ) { printf("\nERRO - Nao h raiz no intervalo informado !!!"); return; } for ( i = 3 ; i < MAX ; i++ ) // i < MAX um critrio pessimista de { // parada j = 2; while(1) { if( f(x[i-1])*f(x[i-j]) < 0 ) break; j++; if ( j == i ) break; // outro critrio pessimista de parada } // , na realidade, um erro que jamais ocorrer x[i] = f(x[i-1])*x[i-j]/(f(x[i-1])-f(x[i-j])) + f(x[i-j])*x[i-1]/(f(x[i-j])-f(x[i-1]));

if( x[i] == x[i-1] ) // a raiz ser calculada at que { // se atinja a maior preciso possvel i++; break; } } for ( n = 1 ; n < i ; n++ ) printf("x%d = %.18f\n", n, x[n]); printf("\nSoluo: x%d = %.18f", n-1, x[n-1]);

float f(float x) // funo f(x) { return ( sin(x) - x/2.0 ); }

ANEXO 2 mfp2.c
#define MAX 30 /* numero mximo de razes que podero ser calculadas */ #include <math.h> float f(float); void main() { float x[MAX];

/* Vetor que armazena as razes. A posio x[0] e' desprezada.

* A primeira aproximao esta' em x[1], a segunda em x[2]...*/

int j; int i; /* indica quantas razes foram calculadas */ int n; /* para imprimir na tela as razes calculadas */ char intervalo[18]; clrscr(); printf("Mtodo da Falsa Posio para a funo f(x) = x - 3\n\n"); printf("Digite o intervalo.\nA raiz esta' entre "); gets(intervalo); x[1] = atof(intervalo); printf("e "); gets(intervalo); x[2] = atof(intervalo); if ( f(x[1]) * f(x[2]) > 0 ) { printf("\nERRO - No ha'raiz no intervalo informado !!!"); return; } for ( i = 3 ; i < MAX ; i++ )//i < MAX e' um critrio pessimista de parada { j = 2; while(1) { if( f(x[i-1])*f(x[i-j]) < 0 ) break; j++; if ( j == i ) break; // outro critrio pessimista de parada } // e', na realidade, um erro que jamais ocorrera' x[i] = f(x[i-1])*x[i-j]/(f(x[i-1])-f(x[i-j])) + f(x[i-j])*x[i-1]/(f(x[i-j])-f(x[i-1]));

if( x[i] == x[i-1] ) // a raiz sera' calculada ate' que { // se atinja a maior preciso possvel i++; break; }

for ( n = 1 ; n < i ; n++ ) printf("x%d = %.18f\n", n, x[n]); printf("\nSolucao: x%d = %.18f", n-1, x[n-1]); getch(); } float f(float x) { return ( x*x - 3 ); }

UNIVERSIDADE FEDERAL DE SANTA MARIA

Curso de Cincia da Computao

Trabalho de Mtodos Numricos Computacionais O Mtodo da Falsa Posio

Professor: Marcos Copetti Aluno: Cristiano Silva Neves Data: 22/12/2000

Você também pode gostar