Método da bissecção
Publicado por Renan Birck Pinheiro (última atualização em 03/11/2017)
[ Hits: 51.461 ]
Homepage: http://renanbirck.rocks
Download programa 1.c (versão 2)
Implementação do método da bissecção para encontrar os zeros de uma função f(x). Novamente, não pretendo entrar em detalhes sobre o método, recomendo o uso de um livro de Cálculo Numérico para este fim.
f(x) é a função cujo zero queremos determinar.
Compilar usando o parâmetro -lm do GCC pois usamos funções matemáticas.
#include <stdio.h>
#include <math.h>
#define log10(x) log(x)/log(10);
float f(float x) {
return pow(x,2)-4; // Função cuja raiz deve ser determinada
}
// Implementação do Método da Bissecção para zeros de funções
// Autor: Renan Birck
// Disciplina: Métodos Numéricos e Computacionais
// Curso: Eng. Elétrica - Universidade Federal de Santa Maria
// Santa Maria, maio de 2010.
int main() {
// eps: erro
// a0 e b0: pontos iniciais
// tam: tamanho do intervlao
// pm: ponto médio
// it: número de iterações
float eps, a0, b0, tam, pm, it;
int bolzano_ok = 0; // flag do teorema de Bolzano
printf("Digite a precisão requerida: \n");
scanf("%f",&eps);
printf("Digite o intervalo onde deve se buscar a raiz (ex. [0;5] = digite 0 5): \n");
scanf("%f %f",&a0,&b0);
// O teorema de Bolzano (valor intermediário) foi satisfeito?
// f(a0) * f(b0) < 0 -> existe troca de sinal no intervalo dado e, portanto
// existe raiz nele.
bolzano_ok = (f(a0)*f(b0) > 0?0:1);
// Não, então pedir um novo intervalo inicial.
while(bolzano_ok == 0) {
printf("\nIntervalo [%f;%f] não satisfaz as condições do teorema de Bolzano. Tente outro.\n Intervalo: ",a0,b0);
scanf("%f %f", &a0, &b0);
bolzano_ok = (f(a0)*f(b0) > 0?0:1);
}
// Iteraçõs necessárias
it = log10(b0 - a0);
it -= log10(eps);
it /= log(2);
printf("Serão necessárias %.0f iterações.\n",ceil(it));
// Um dos extremos do intervalo é a raiz
if(f(a0) == 0 || f(b0) == 0) {
printf("O valor %f é zero da expressão. \n", f(a0)==0?a0:b0);
return 0;
}
// Implementação do método da bisecção
while(tam > eps) {
tam = b0-a0;
pm = (a0+b0)/2;
if(f(pm) == 0) {
printf("SOLUÇÃO EXATA ENCONTRADA!! x = %f\n",pm);
return 0;
}
if(f(a0)*f(pm) < 0) b0 = pm; // a solução está a esquerda
else a0 = pm; // a solução está a direita
}
printf("Intervalo final: [%f,%f]\n Solução aproximada: %f",a0,b0,(a0+b0)/2);
return 0;
}
Programa para cálculo vetorial
Simples gerador de números primos
Sequência fibonacci com 35 linhas e for
Desenhando uma curva de Bézier
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
ERRO: LAZARUS 4.2 64 no Linux MINT não entra mais apos ajustar desktop... (0)
Pergunta: Meu teclado não está respondendo direito como e consertar? (2)
Secure boot, artigo interessante, nada técnico. (6)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)









