Sie sind auf Seite 1von 11

UNIVERSIDADE ESTADUAL DE CAMPINAS

FACULDADE DE ENGENHARIA MECNICA


DEPARTAMENTO DE ENERGIA
IM253 MTODOS NUMRICOS EM FENMENOS DE TRANSPORTE

Vincius Lopes Nogueira

Implementao do mtodo da bisseco atravs de programao


em linguagem C

Campinas
6 de setembro de 2017
2

1 INTRODUO

O problema de encontrar uma aproximao da raiz de uma equao data de pelo menos
1700 a.C. (BURDEN; FAIRES, 2008).
O mtodo da bisseco uma tcnica usada para encontrar razes que repetidamente
divide um intervalo e encontra um subintervalo no qual pelo menos raiz da funo analisada
existe. um mtodo robusto, mas bastante lento, por isso geralmente usado para encontrar
uma aproximao da soluo e esta posteriormente utilizada como palpite inicial em outros
mtodos de convergncia mais rpida.
De acordo com Burden e Faires (2008), inicialmente so definidos 1 = e 1 = e
considere p1 o ponto mdio de [, ], ou seja:
1 1 1 + 1
1 = 1 + =
2 2
Se (1 ) = 0, ento = 1 e problema foi resolvido. Se (1) 0, ento (1 ) tem
o mesmo sinal de (1 ) ou de (1 ). Quando (1 ) e (1 ) tm o mesmo sinal, (1 , 1 ),
define-se 2 = 1 e 2 = 1. Quando (1 ) e (1 ) tm sinais opostos, (1 , 1 ), define-
se 2 = 1 e 2 = 1. Depois, reaplicamos o processo ao intervalo [2 , 2 ]. Isso caracteriza o
mtodo da bisseco.
O mtodo aplicvel para encontrar solues numricas em funes () = 0, quando
a funo continua num intervalo [, ] e () e () tem sinais opostos.
Figura 1 - Representao grfica do mtodo da bisseco

Fonte: Burden e Faires (2008)


No presente trabalho o mtodo da bisseco implementado em linguagem de programao C
no software Code::blocks.
3

2 METODOLOGIA

A lgica bsica do cdigo usado na implementao do mtodo da bisseco partiu do


algoritmo 2.1 mostrado na 8 edio do livro Anlise Numrica por Burden e Faires (2008),
com algumas alteraes para que o desempenho do mesmo seja satisfatrio e o uso seja
relativamente simples, alm de mudanas que evitem erros simples e loopings infinitos.
Partindo do princpio, um lao de repetio permite que vrios intervalos sejam testados
para uma mesma funo sempre que o programa chega ao fim, para facilitar a resoluo de
alguns exerccios do livro que contm mais de um item. Um lao de repetio tambm usado
para checar se dentro do intervalo escolhido h de fato uma mudana de sinal na funo, e, caso
esta no exista, o programa pede um novo intervalo.
O programa montado de tal maneira que os clculos cessam caso o nmero de iteraes
feitas ultrapassa um valor inicialmente definido como 300, ou, se o erro encontrado na iterao
realizada for menor que o valor definido inicialmente pelo usurio. O clculo do erro feito
atravs da equao:
| 1 |
| |
Essa forma de calcular o erro a que mais se aproxima do erro relativo e por isso foi a
escolhida, entretanto, caso o valor de seja zero, a diviso por esse valor resultaria em um
erro, portanto, tambm foi criada uma condio que evita esse caso.
Por fim, aps realizar as iteraes o programa retorna o nmero de iteraes realizadas
e a raiz encontrada para a funo, ou, caso o nmero mximo de iteraes seja feito sem sucesso,
o programa alerta a falha.
4

3 RESULTADOS E DISCUSSES

Utilizando a funo () = cos no intervalo [0, 1] de acordo com o exerccio 1


da seo 2.1 do livro, o programa retornou os resultados mostrados na tabela 1.

Tabela 1 Resultados de 20 iteraes para a funo () =

( )
1 0 1 0,5 -0,170475781
2 0,5 1 0,75 0,134336535
3 0,5 0,75 0,625 -0,020393704
4 0,625 0,75 0,6875 0,056321251
5 0,625 0,6875 0,65625 0,017806728
6 0,625 0,65625 0,640625 -0,001331824
7 0,640625 0,65625 0,6484375 0,00822774
8 0,640625 0,648438 0,6445315 0,003445851
9 0,640625 0,644531 0,642578 0,001056106
10 0,640625 0,642578 0,6416015 -0,000138009
11 0,641602 0,642578 0,64209 0,000459317
12 0,641602 0,64209 0,641846 0,00016095
13 0,641602 0,641846 0,641724 0,000011
14 0,641602 0,641724 0,641663 -0,000063
15 0,641663 0,641724 0,6416935 0,000026
16 0,641693 0,641724 0,6417085 -0,000007
17 0,641708 0,641724 0,641716 0,000002
18 0,641708 0,641716 0,641712 -0,000003
19 0,641712 0,641716 0,641714 -0,0000001
20 0,641714 0,641716 0,641715 0,000001

A figura 2 mostra uma representao grfica do mtodo da bisseco para o mesmo


exerccio.
5

Figura 2 - Representao grfica do mtodo da bisseco

() = cos

y = ()

()
(2 ) = 1
1 2

(1 )
(1 )

= 1

O programa se comportou como esperado nos casos testados, como por exemplo o item
b) do exerccio 6 da seo 2.1 do livro, utilizando o mtodo da bisseco para determinar a
soluo com preciso de 105 da funo + 3 cos = 0 para 0 1. A figura 3
ilustra o output do programa.

Figura 3 - Output do programa para o item b) do exerccio 6 + 3 = 0 no


intervalo [0, 1]

Os itens c) e d) do exerccio 6 tambm foram usados para testar o desempenho do


programa, como mostrado nas figuras 4 e 5.
6

Figura 4 - Output do programa para o item c) do exerccio 6 + 1 2() = 0 nos


intervalos [0, 0,5] e [0, 1]

Figura 5 - Output do programa para o item d) do exerccio 6 2 4 + 4 () = 0


nos intervalos [1, 2] e [2, 4]

Todos os resultados encontrados atravs do computador so condizentes com os


resultados analticos dos exerccios. Os resultados foram satisfatrios, considerando as
limitaes do mtodo da bisseco que so notadas pela grande quantidade de iteraes feitas,
ilustrando assim a baixa taxa de convergncia caracterstica do mtodo.
7

4 CONCLUSO

Em geral a implementao do mtodo da bisseco foi bem-sucedida, o programa tem


aproximadamente 100 linhas e os resultados encontrados para as funes testadas foram os
esperados. As maiores desvantagens encontradas so as do prprio mtodo, como a baixa taxa
de convergncia, e a dificuldade em modificar a equao diretamente no cdigo e no atravs
de um input feito pelo usurio.
8

5 REFERNCIAS

BURDEN, Richard L.; FAIRES, J. Douglas. Anlise Numrica. 8. ed. So Paulo: Cengage
Learning, 2008. 721 p
9

APNDICE A Cdigo

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

int main()
{
float P,P0,a,b,fp,fa,fb,T,T1;
int N;
char R;

R = 'Y';

while(R == 'Y' || R == 'y'){ // Lao que permite teste de vrias variaveis

system("cls");

N=0;
P=0;
P0=0;
fp=1; // inicializao das variveis
fa=1;
fb=1;
T=1;

//input

while(fa*fb>0){
printf("Digite o primeiro valor do intervalo (a): ");
scanf("%f",&a);
printf("Digite o segundo valor do intervalo (b): ");
10

scanf("%f",&b);

fa = pow(a,2) - 4*a + 4 - log(a); // f(a)


fb = pow(b,2) - 4*b + 4 - log(b); // f(b)

if(fa*fb>0){ // Condicional que checa se existe uma mudana de


sinal no intervalo
system("cls");
printf("Intervalo invalido \ne necessaria uma mudanca de sinal entre a e b");
getch();
system("cls");}
}
printf("Digite a tolerancia para o erro: ");
scanf("%f",&T1);
system("cls");

//Main Solving
printf("Calculando a raiz da funcao continua no intervalo [%.3f,%.3f]\ncom
tolerancia de %.12f\n", a,b,T1);
getch();
while(N<300 && T>T1){

P = a + ((b-a)/2);

fp = pow(P,2) - 4*P + 4 - log(P); // f(p)


fa = pow(a,2) - 4*a + 4 - log(a); // f(a)

N=N+1; // Contador de Iteraes

if(fa*fp>0){
a=P;
}
else{
b=P;
11

}
if(P==0){ //Condicional que evita diviso por zero no calculo do erro
T = 1;
}
else{
T = fabsf(P-P0)/fabsf(P);
}
P0=P;
}
//Ouput
if (N==300){
printf("\nO metodo falhou apos 300 iteraes\n");
printf("Escolher novo intervalo? (Y para sim): ");
scanf("%s", &R);
getch();
}
else{

printf("\nNumero de iteracoes feitas: %d\n",N);


printf("Raiz de x^2 - 4x + 4 - ln(x) = %.8f",P);
getch();
printf("\n\nEscolher novo intervalo? (Y para sim): ");
scanf("%s", &R);
}

}
}

Das könnte Ihnen auch gefallen