Baixe o app para aproveitar ainda mais
Prévia do material em texto
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 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 como UnitBissecao.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 componentes Label1, 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 e EditNmax, 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 Button1 para Calcula; 7- limpe a propriedade Lines do componente Memo1; 8- digite o código, visto ao lado, no evento OnClick do componente Button (basta dar um clique duplo à direita do evento Onclick). Algumas linhas foram modificadas e/ou acrescentadas; 9- acrescente a linha #include <math.h> logo após a linha #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 uma terceira 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,0 2 5,00 2 xx x bam 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 no primeiro 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 no primeiro 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 Resumo i Xa Xb Xm f(Xm) f(Xa)*f(Xm) 1 0 0,5 0,25 0,765625 2,296875 2 0,25 0,5 0,375 -0,322265625 -0,246734619140625 3 0,25 0,375 0,3125 0,218017578125 0,166919708251953 4 0,3125 0,375 0,34375 -0,053131103515625 -0,0115835145115852 5 0,3125 0,34375 0,328125 0,0822029113769531 0,0179216796532273 6 0,328125 0,34375 0,3359375 0,0144743919372559 0,00118983715765353 7 0,3359375 0,34375 0,33984375 -0,0193439126014709 -0,000279991372593713 8 0,3359375 0,33984375 0,337890625 -0,00243862718343735 -3,52976456419185E-5 9 0,3359375 0,337890625 0,3369140625 0,00601691845804453 8,70912360162457E-5 10 0,3369140625 0,337890625 0,33740234375 0,00178890430834144 1,0763691352535E-5 11 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 a saída de resultados se assemelhe à tabela resumo acima. 4
Compartilhar