Você está na página 1de 5

#Funo bisseccao.

m que faz o clculo da raiz aproximada de uma funo f(x)


##Entradas:
#func: funo f(x) criada como um string
#a: limite esquerdo do intervalo que contm a raiz
#b: limite direito do intervalo que contm a raiz
#toler: preciso da raiz
#k_max: mximo de iteraes executadas pelo mtodo
##Sadas:
#raiz: raiz aproximada da funo dentro do intervalo [a,b]
#a: limite esquerdo do intervalo aps k iteraes
#b: limite direito do intervalo aps k iteraes
#k: nmero de iteraes concludas pelo mtodo

function [raiz,a,b,k] = bisseccao (func,a,b,toler,k_max)

#Atribui a x o valor de a para avaliar quanto vale f(a)


x=a;
fa=eval(func);
#atribui a x o valor de b para avaliar quanto vale f(b)
x=b;
fb=eval(func);

#caso em que no se pode afirmar que h raiz entre [a,b]


if fa*fb > 0
#exibe mensagem ao usurio informando o erro.
disp 'Funcao com mesmo sinal nos extremos.'

#caso em que o intervalo de entrada j satisfaz a tolerncia


elseif (b-a)<toler
#escolhe para valor de raiz o ponto mdio do intervalo [a,b]
raiz=(a+b)/2;

#caso em que o mtodo executado


else
#cria o contador que dir quantas iteraes foram feitas

k=1;

#enquanto o valor de k for menor do que o de k_max ele executa o mtodo


while (k<=k_max)

#calcula o valor de x da iterao e em seguida calcula f(x)


x=(a+b)/2;
fx=eval(func);

#teste que escolhe qual o novo intervalo que contm a raiz


if(fa*fx>0)
a=x;
#se o valor de x substitui o valor de a, o valor de f(a) mudar
#guarda esse valor em fa
fa=eval(func);
else
b=x;
endif

#caso em que o critrio de parada atingido.


if ((b-a)<toler)
#escolhe para valor de raiz o ponto mdio do intervalo [a,b]
raiz=(a+b)/2;
#uma vez que j temos a raiz, podemos parar o while
break;
endif

#incrementa o contador e inicia-se uma nova iterao


k=k+1;

endwhile

#caso em que o nmero mximo de iteraes foi atingido e ainda assim no


#houve uma raiz dentro da preciso estipulada. Informa isso ao usurio
if(k>k_max)

printf("Nao foi possivel encontrar raiz com a tolerancia especificada\n Tente


aumentar o numero de iteracoes \n");
endif

endif

endfunction

#Script usaBisseccao.m que usa bissecao.m para calcular a raiz aproximada


#da funo 'x^3-9*x+3' no intervalo [0,1]

#funo em forma de string que usada como entrada para a funo bisseccao.m
tx='x^3-9*x+3';
#valor do limite do intervalo esquerda. usado como entrada para a funo bisseccao.m
a_ini=0;
#valor do limite do intervalo direita. usado como entrada para a funo bisseccao.m
b_ini=1;
#preciso da minha raiz
toler=0.001;
#nmero mximo de iteraes que o mtodo deve executar
iteracoes=20;

#chama a funo que executa o mtodo da bisseco.


#Gera as seguintes variveis de sada:
#raiz_aproximada: contm a raiz da minha funo x^3-9*x+3
#a_fin: limite esquerdo do intervalo aps k iteraes
#b_fin: limite direito do intervalo aps k iteraes
#num_it: nmero de iteraes realizadas pelo mtodo
[raiz_aproximada,a_fin,b_fin,num_it]=bisseccao(tx,a_ini,b_ini,toler,iteracoes);

#mostra o valor da raiz na linha de comandos do Octave


raiz_aproximada

##Escrevendo os valores no arquivo de texto raiz_exer1.txt


#abre o arquivo para escrita
f1 = fopen("raiz_exer1.txt",'w');

#Escreve a equao na primeira linha e salta para linha de baixo.


fprintf(f1,"Equao: %s \n",tx);
#Escreve a raiz aproximada na segunda linha e salta para linha de baixo.
fprintf(f1,"Raiz aproximada: %.9f \n",raiz_aproximada);
#Escreve a preciso usada no mtodo na terceira linha e salta para linha de baixo.
fprintf(f1,"Preciso: %g \n",toler);
#Escreve o intervalo final na forma [a,b] na quarta linha e salta para linha de baixo.

fprintf(f1,"Intervalo final: [%.9f , %.9f] \n",a_fin,b_fin);


#Escreve o nmero de iteraes executadas na quinta linha.
fprintf(f1,"Nmero de iteraes: %d \n",num_it);

#fecha o arquivo de texto raiz_exer1.txt


fclose(f1)

Você também pode gostar