Upload
arnaldo-jr
View
755
Download
6
Embed Size (px)
DESCRIPTION
Material sobre o método da bisseção
Citation preview
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
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
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
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