4
Numérico Willian de Araujo Rosa www.profwillian.com Método da Bisseção O Método da Bisseção determina uma raiz x de uma função f(x) num intervalo [xa,xb] onde f(xa)*f(xb)<0. A idéia é diminuir o intervalo através de repetidas divisões ao meio do intervalo [xa,xb], de tal forma que o valor de xa tenda ao valor de xb, ou seja, que a raiz x xa xb e que a função f(x) seja aproximadamente nula dentro de uma certa tolerância. Fluxograma início Xa, Xb , Nmax Xm(Xa+Xb)/2 f(Xa)*f(Xm)<0 ? XbXm XaXm ii+1 sim não i0 |f(Xm)|> e i<Nmax ? sim Xm, i fim não Algoritmo início algoritmo declare i, Nmax numérico declare Xa, Xb, Xm, numérico i0 leia Xa, Xb, , Nmax faça Xm(Xa+Xb)/2 Se f(Xa)*f(Xm)<0 então XbXm senão XaXm fim Se ii+1 enquanto |f(Xm)|> e i<Nmax escreva Xm, i fim algoritmo Programa C++ { int i, Nmax; double Xa,Xb,Xm,Epsilon; i=0; Xa=StrToFloat(EditXa->Text); Xb=StrToFloat(EditXb->Text); Epsilon=StrToFloat(EditEpsilon->Text); Nmax=StrToInt(EditNmax->Text); do { Xm=(Xa+Xb)/2; if (f(Xa)*f(Xm)<0) {Xb=Xm;} else {Xa=Xm;} i++; } while ((fabs(f(Xm))>Epsilon)&&(i<Nmax)); Memo1->Lines->Append(FloatToStr(Xm) + " : " + IntToStr(i)); } Append()....... Método que adiciona um texto (string) ao objeto; StrToFloat().. Função que converte um texto (string) em número (float); StrToInt()..... Função que converte um texto (string) em número (int); IntToStr()..... Função que converte um número (int) em texto (string); FloatToStr().. Função que converte um número (float) em número (string); fabs ()............. Função que retorna o módulo do argumento; 1

Calculo Numerico Raizes Bisseção

Embed Size (px)

DESCRIPTION

Material sobre o método da bisseção

Citation preview

Page 1: Calculo Numerico Raizes Bisseção

NuméricoWillian de Araujo Rosa

www.profwillian.com

Método da BisseçãoO Método da Bisseção determina uma raiz x de uma função f(x) num intervalo [xa,xb] onde f(xa)*f(xb)<0. Aidéia é diminuir o intervalo através de repetidas divisões ao meio do intervalo [xa,xb], de tal forma que o valor de xa

tenda ao valor de xb, ou seja, que a raiz x xa xb e que a função f(x) seja aproximadamente nula dentro de umacerta tolerância.Fluxograma início

Xa, Xb , Nmax

Xm(Xa+Xb)/2

f(Xa)*f(Xm)<0 ?

XbXm

XaXm

ii+1

sim

não

i0

|f(Xm)|> e i<Nmax

? sim

Xm, i

fim

não

Algoritmoinício algoritmo declare i, Nmax numérico declare Xa, Xb, Xm, numérico

i0

leia Xa, Xb, , Nmax faça Xm(Xa+Xb)/2 Se f(Xa)*f(Xm)<0 então XbXm senão XaXm fim Se ii+1 enquanto |f(Xm)|> e i<Nmax escreva Xm, ifim algoritmo

Programa C++{ int i, Nmax; double Xa,Xb,Xm,Epsilon; i=0; Xa=StrToFloat(EditXa->Text); Xb=StrToFloat(EditXb->Text); Epsilon=StrToFloat(EditEpsilon->Text); Nmax=StrToInt(EditNmax->Text); do { Xm=(Xa+Xb)/2; if (f(Xa)*f(Xm)<0) {Xb=Xm;} else {Xa=Xm;} i++; } while ((fabs(f(Xm))>Epsilon)&&(i<Nmax)); Memo1->Lines->Append(FloatToStr(Xm) + " : " + IntToStr(i));}

Append()....... Método que adiciona um texto (string) ao objeto;StrToFloat()..Função que converte um texto (string) em número (float);StrToInt()..... Função que converte um texto (string) em número (int);IntToStr()..... Função que converte um número (int) em texto (string);FloatToStr()..Função que converte um número (float) em número (string);fabs ().............Função que retorna o módulo do argumento;

1

Page 2: Calculo Numerico Raizes Bisseção

Vamos implementar o programa. Siga os passos abaixo:

1- Comece gravando (Save All) . Crie uma pasta com o nome Bissecao e após abri-la, grave a unidade comoUnitBissecao.h e grave o projeto como ProjectBissecao. . Grave a cada alteração significativa do código do programa;

2- desenhe o formulário abaixo:

3- altere a propriedade Caption dos componentesLabel1, Label 2, Label 3 e Label 4 para Xa, Xb, e Nmax,respectivamente. Coloque mais um Label com Caption“Método da Bisseção”;

4- altere a propriedade Name dos componentes Edit1,Edit2, Edit3 e Edit4 para EditXa, EditXb, EditEpsilon eEditNmax, respectivamente;

5- altere a propriedade Text dos componentes EditXa,EditXb, EditEpsilon e EditNmax para 0; 0,5; 0,001 e 50,respectivamente;

6- altere a propriedade Caption do componente Button1para Calcula;

7- limpe a propriedade Lines do componente Memo1;

8- digite o código, visto ao lado, no evento OnClick docomponente Button (basta dar um clique duplo à direitado evento Onclick). Algumas linhas foram modificadase/ou acrescentadas;

9- acrescente a linha #include <math.h> logo após alinha #include <vcl.h>

int i, Nmax; double Xa,Xb,Xm,Epsilon; Memo1->Clear(); i=0; Xa=StrToFloat(EditXa->Text); Xb=StrToFloat(EditXb->Text); Epsilon=StrToFloat(EditEpsilon->Text); Nmax=StrToInt(EditNmax->Text); do { Xm=(Xa+Xb)/2; if (f(Xa)*f(Xm)<0) {Xb=Xm;} else {Xa=Xm;} i++; Memo1->Lines->Append(FloatToStr(Xm)); } while ((fabs(f(Xm))>Epsilon)&&(i<Nmax));

Memo1->Lines->Append("|f(Xm)|= " +FloatToStr(fabs(f(Xm)))); Memo1->Lines->Append("i= "+IntToStr(i));

10- acrescente o código da função f(x) logo após a linha#pragma resource "*.dfm"

11- grave e execute o programa .

double f(double x){ return x*x*x-9*x+3;}

2

Page 3: Calculo Numerico Raizes Bisseção

Um exemplo:Vamos encontrar uma raiz da função: 3x9x)x(f 3 utilizando o Método da Bisseção. Adotaremos uma

tolerância de =0,001 e um número máximo de iterações Nmax=50.

Solução: Podemos começar traçando o gráfico da função:

claramente vemos que existe uma raiz no intervalo [-3,5 ; -3,0], uma segunda raiz no intervalo [0 ; 0,5] e umaterceira raiz no intervalo [2,5 ; 3].

Vamos adotar o intervalo [0,0 ; 0,5], portanto, para a iteração i=1 temos:5,0x;0x ba

observem o algoritmo do método. O próximo passo é dividir o intervalo ao meio:

25,02

5,002

xxx ba

m

0,765625)25,0(f)x(f m >

Agora temos dois intervalos. O primeiro é [0 ; 0,25] e o segundo é [0,25 ; 0,5]. Vamos verificar se a raiz se encontra noprimeiro intervalo fazendo:

02,296875325,0.925,0.30.90)25,0(f).0(f)x(f).x(f 33ma

Como o produto foi positivo, o intervalo onde se encontra a raiz não é [0 ; 0,25] e sim [0,25 ; 0,5].

Devemos continuar já que )x(f m e que não ultrapassamos o número máximo de iterações Nmax.

Vamos trabalhar, agora, com o intervalo [0,25 ; 0,5], portanto, para a iteração i=2 temos:5,0x;25,0x ba

O próximo passo é dividir o intervalo ao meio:

375,0x m 50,32226562)375,0(f)x(f m >Agora temos dois intervalos. O primeiro é [0,25 ; 0,375] e o segundo é [0,375 ; 0,5]. Vamos verificar se a raiz se encontra noprimeiro intervalo fazendo:

019140625-0,2467346)x(f).x(f ma Como o produto foi negativo, o intervalo onde se encontra a raiz é [0,25 ; 0,375] e não [0,375 ; 0,5].

Devemos continuar já que )x(f m e que não ultrapassamos o número máximo de iterações Nmax.

Vamos trabalhar, agora, com o intervalo [0,25 ; 0,375] portanto, para a iteração i=3 temos:

3125,0x m 81250,21801757)3125,0(f)x(f m >

082519530,16691970)x(f).x(f ma Como o produto foi positivo, o intervalo onde se encontra a raiz não é [0,25 ; 0,3125] e sim [0,3125 ; 0,375].

Devemos continuar já que )x(f m e que não ultrapassamos o número máximo de iterações Nmax.

3

Page 4: Calculo Numerico Raizes Bisseção

Vamos trabalhar, agora, com o intervalo [0,3125 ; 0,375], portanto, para a iteração i=4 temos:

0,34375x m 35156250,05313110)34375,0(f)x(f m >

0145115852-0,0115835)x(f).x(f ma Como o produto foi negativo, o intervalo onde se encontra a raiz é [0, 3125; 0,34375]

Devemos continuar já que )x(f m e que não ultrapassamos o número máximo de iterações Nmax.

Vamos trabalhar, agora, com o intervalo [0, 3125; 0,34375], portanto, para a iteração i=5 temos:

0,328125x m 137695310,08220291)0,328125(f)x(f m >

0965322730,01792167)x(f).x(f ma Como o produto foi positivo, o intervalo onde se encontra a raiz é [0,328125; 0,34375].

Devemos continuar já que )x(f m e que não ultrapassamos o número máximo de iterações Nmax.

O intervalo é [0,328125; 0,34375] para a iteração i=6 < Nmax, temos:

0,3359375xm 193725590,01447439)0,3359375(f)x(f m >

07157653530,00118983)x(f).x(f ma Como o produto foi positivo, o intervalo onde se encontra a raiz é [0,3359375; 0,34375].

O intervalo é [0,3359375; 0,34375] para a iteração i=7 < Nmax, temos:

0,33984375x m 260147090,01934391) 0,33984375(f)x(f m >

039137259371-0,0002799)x(f).x(f ma Como o produto foi negativo, o intervalo onde se encontra a raiz é [0,3359375; 0,33984375].

O intervalo é [0,3359375; 0,33984375] para a iteração i=8 < Nmax, temos:

50,33789062x m 7183437350,00243862 ) 50,33789062(f)x(f m >

010x6419185-3,5297645)x(f).x(f -5ma

Como o produto foi negativo, o intervalo onde se encontra a raiz é [0,3359375; 0,337890625].

O intervalo é [0,3359375; 0,337890625] para a iteração i=9 < Nmax, temos:

250,33691406x m 8458044530,00601691 )250,33691406(f)x(f m >

0x101624578,70912360)x(f).x(f -5ma

Como o produto foi positivo, o intervalo onde se encontra a raiz é [0,3369140625; 0,337890625].

O intervalo é [0,3369140625; 0,337890625] para a iteração i=10 < Nmax, temos:

3750,33740234x m 4308341440,00178890 )3750,33740234(f)x(f m >

0x10525351,07636913)x(f).x(f -5ma

Como o produto foi positivo, o intervalo onde se encontra a raiz é [0,33740234375; 0,337890625].

O intervalo é [0,33740234375; 0,337890625] para a iteração i=11 < Nmax, temos:

43750,33764648x m 18134442340,00032492 )43750,33764648(f)x(f m <

Como )x(f m , a raiz é 43750,33764648xx m

Tabela Resumoi Xa Xb Xm f(Xm) f(Xa)*f(Xm)1 0 0,5 0,25 0,765625 2,2968752 0,25 0,5 0,375 -0,322265625 -0,2467346191406253 0,25 0,375 0,3125 0,218017578125 0,1669197082519534 0,3125 0,375 0,34375 -0,053131103515625 -0,01158351451158525 0,3125 0,34375 0,328125 0,0822029113769531 0,01792167965322736 0,328125 0,34375 0,3359375 0,0144743919372559 0,001189837157653537 0,3359375 0,34375 0,33984375 -0,0193439126014709 -0,0002799913725937138 0,3359375 0,33984375 0,337890625 -0,00243862718343735 -3,52976456419185E-59 0,3359375 0,337890625 0,3369140625 0,00601691845804453 8,70912360162457E-510 0,3369140625 0,337890625 0,33740234375 0,00178890430834144 1,0763691352535E-511 0,33740234375 0,337890625 0,337646484375 -0,000324921813444234 -5,81254031944506E-7

Exercício: Siga o roteiro acima e encontre a raiz no intervalo [2,5 ; 3]. Sugestão: altere o programa para que asaída de resultados se assemelhe à tabela resumo acima.

4