Método da bissecção
Publicado por Renan Birck Pinheiro (última atualização em 03/11/2017)
[ Hits: 50.196 ]
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; }
Validar CPF em C++ (esse funciona)
Cálculo de Fatorial usando Loop
Alocando espaço para uma matriz dinamicamente
Atenção a quem posta conteúdo de dicas, scripts e tal (1)
Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
Como Atualizar Fedora 39 para 40
Instalar Google Chrome no Debian e derivados
Consertando o erro do Sushi e Wayland no Opensuse Leap 15
Instalar a última versão do PostgreSQL no Lunix mantendo atualizado
Flathub na sua distribuição Linux e comandos básicos de gerenciamento
ASRock H310CM-HG4 vs Linux (4)
Dongle Bluetooth 5.0 não funciona no Pop Os 22.04 (2)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba