Programa para el método de bisección – Part 1

Dada una función f(x) sobre el número flotante x y dos números ‘a’ y ‘b’ tales que f(a)*f(b) < 0 y f(x) es continua en [a, b]. Aquí f(x) representa una ecuación algebraica o trascendental. Encuentre la raíz de la función en el intervalo [a, b] (O encuentre un valor de x tal que f(x) sea 0). 
Ejemplo: 
 

Input: A function of x, for example x3 - x2 + 2.     
       And two values: a = -200 and b = 300 such that
       f(a)*f(b) < 0, i.e., f(a) and f(b) have
       opposite signs.
Output: The value of root is : -1.0025
        OR any other value with allowed
        deviation from root.

¿Qué son las funciones algebraicas y trascendentales?  
Las funciones algebraicas son aquellas que se pueden representar en forma de polinomios como f(x) = a 1 x 3 + a 2 x 2 + ….. + e donde aa 1 , a 2 , … son constantes y x es una variable . 
Las funciones trascendentales son funciones no algebraicas, por ejemplo f(x) = sin(x)*x – 3 o f(x) = e x + x 2 o f(x) = ln(x) + x …. 
¿Qué es el método de bisección?  
El método también se denomina método de reducción a la mitad del intervalo, método de búsqueda binaria o método de dicotomía. Este método se usa para encontrar la raíz de una ecuación en un intervalo dado que es el valor de ‘x’ para el cual f(x) = 0. 
El método se basa en el teorema del valor intermedio que establece que si f(x) es una función continua y hay dos números reales a y b tales que f(a)*f(b) 0 y f(b) < 0) , entonces se garantiza que tiene al menos una raíz entre ellos.
Suposiciones: 
 

  1. f(x) es una función continua en el intervalo [a, b]
  2. f(a) * f(b) < 0

Pasos: 
 

  1. Encuentre el punto medio c = (a + b)/2 .
  2. Si f(c) == 0, entonces c es la raíz de la solución.
  3. De lo contrario f(c) != 0
    1. Si el valor f(a)*f(c) < 0 entonces la raíz se encuentra entre a y c. Entonces recurrimos para a y c
    2. De lo contrario, si f(b)*f(c) < 0, entonces la raíz se encuentra entre b y c. Entonces recurrimos b y c.
    3. De lo contrario , la función dada no sigue una de las suposiciones.

Dado que la raíz puede ser un número de punto flotante, repetimos los pasos anteriores mientras que la diferencia entre a y b es menor que un valor. (Un valor muy pequeño). 
 

bisection

A continuación se muestra la implementación de los pasos anteriores. 
 

C++

// C++ program for implementation of Bisection Method for
// solving equations
#include<bits/stdc++.h>
using namespace std;
#define EPSILON 0.01
 
// An example function whose solution is determined using
// Bisection Method. The function is x^3 - x^2  + 2
double func(double x)
{
    return x*x*x - x*x + 2;
}
 
// Prints root of func(x) with error of EPSILON
void bisection(double a, double b)
{
    if (func(a) * func(b) >= 0)
    {
        cout << "You have not assumed right a and b\n";
        return;
    }
 
    double c = a;
    while ((b-a) >= EPSILON)
    {
        // Find middle point
        c = (a+b)/2;
 
        // Check if middle point is root
        if (func(c) == 0.0)
            break;
 
        // Decide the side to repeat the steps
        else if (func(c)*func(a) < 0)
            b = c;
        else
            a = c;
    }
    cout << "The value of root is : " << c;
}
 
// Driver program to test above function
int main()
{
    // Initial values assumed
    double a =-200, b = 300;
    bisection(a, b);
    return 0;
}

Java

// Java program for implementation of Bisection Method
// for solving equations
class GFG{
    static final float EPSILON = (float)0.01;
 
    // An example function whose solution is determined using
    // Bisection Method. The function is x^3 - x^2  + 2
    static double func(double x)
    {
        return x*x*x - x*x + 2;
    }
 
    // Prints root of func(x) with error of EPSILON
    static void bisection(double a, double b)
    {
        if (func(a) * func(b) >= 0)
        {
            System.out.println("You have not assumed"
                        + " right a and b");
            return;
        }
 
        double c = a;
        while ((b-a) >= EPSILON)
        {
            // Find middle point
            c = (a+b)/2;
 
            // Check if middle point is root
            if (func(c) == 0.0)
                break;
 
            // Decide the side to repeat the steps
            else if (func(c)*func(a) < 0)
                b = c;
            else
                a = c;
        }
                //prints value of c upto 4 decimal places
        System.out.printf("The value of root is : %.4f"
                        ,c);
    }
 
    // Driver program to test above function
    public static void main(String[] args)
    {
        // Initial values assumed
        double a =-200, b = 300;
        bisection(a, b);
    }
    // This code is contributed by Nirmal Patel
}

Python3

# Python program for implementation
# of Bisection Method for
# solving equations
 
  
# An example function whose
# solution is determined using
# Bisection Method.
# The function is x^3 - x^2  + 2
def func(x):
    return x*x*x - x*x + 2
  
# Prints root of func(x)
# with error of EPSILON
def bisection(a,b):
 
    if (func(a) * func(b) >= 0):
        print("You have not assumed right a and b\n")
        return
  
    c = a
    while ((b-a) >= 0.01):
 
        # Find middle point
        c = (a+b)/2
  
        # Check if middle point is root
        if (func(c) == 0.0):
            break
  
        # Decide the side to repeat the steps
        if (func(c)*func(a) < 0):
            b = c
        else:
            a = c
             
    print("The value of root is : ","%.4f"%c)
     
# Driver code
# Initial values assumed
a =-200
b = 300
bisection(a, b)
 
# This code is contributed
# by Anant Agarwal.

C#

// C# program for implementation
// of Bisection Method for
// solving equations
using System;
 
class GFG
{
static float EPSILON = (float)0.01;
 
// An example function whose
// solution is determined using
// Bisection Method. The function
// is x^3 - x^2 + 2
static double func(double x)
{
    return x * x * x -
           x * x + 2;
}
 
// Prints root of func(x)
// with error of EPSILON
static void bisection(double a,
                      double b)
{
    if (func(a) * func(b) >= 0)
    {
        Console.WriteLine("You have not assumed" +
                                " right a and b");
        return;
    }
 
    double c = a;
    while ((b - a) >= EPSILON)
    {
        // Find middle point
        c = (a + b) / 2;
 
        // Check if middle
        // point is root
        if (func(c) == 0.0)
            break;
 
        // Decide the side
        // to repeat the steps
        else if (func(c) * func(a) < 0)
            b = c;
        else
            a = c;
    }
     
    // prints value of c
    // upto 4 decimal places
    Console.WriteLine("The value of " +
                      "root is : "+ c);
}
 
// Driver Code
static public void Main ()
{
    // Initial values assumed
    double a = -200, b = 300;
    bisection(a, b);
}
}
 
// This code is contributed by ajit

PHP

<?php
// PHP program for implementation
// of Bisection Method for solving
// equations
$EPSILON = 0.01;
 
// An example function whose
// solution is determined
// using Bisection Method.
// The function is x^3 - x^2 + 2
function func($x)
{
    return $x * $x * $x -
           $x * $x + 2;
}
 
// Prints root of func(x)
// with error of EPSILON
function bisection($a, $b)
{
    global $EPSILON;
    if (func($a) *
        func($b) >= 0)
    {
        echo "You have not assumed " .
                 "right a and b","\n";
        return;
    }
 
    $c = $a;
    while (($b - $a) >= $EPSILON)
    {
        // Find middle point
        $c = ($a + $b) / 2;
 
        // Check if middle
        // point is root
        if (func($c) == 0.0)
            break;
 
        // Decide the side to
        // repeat the steps
        else if (func($c) * func($a) < 0)
            $b = $c;
        else
            $a = $c;
    }
    echo "The value of root is : " , $c;
}
 
// Driver Code
 
// Initial values assumed
$a =-200;
$b = 300;
bisection($a, $b);
 
// This code is contributed by ajit
?>

Javascript

<script>
 
// JavaScript program for implementation
// of Bisection Method for
// solving equations
 
let EPSILON = 0.01;
 
    // An example function whose solution is determined using
    // Bisection Method. The function is x^3 - x^2  + 2
    function func(x)
    {
        return x*x*x - x*x + 2;
    }
   
    // Prints root of func(x) with error of EPSILON
    function bisection(a, b)
    {
        if (func(a) * func(b) >= 0)
        {
            document.write("You have not assumed"
                        + " right a and b");
            return;
        }
   
        let c = a;
        while ((b-a) >= EPSILON)
        {
            // Find middle point
            c = (a+b)/2;
   
            // Check if middle point is root
            if (func(c) == 0.0)
                break;
   
            // Decide the side to repeat the steps
            else if (func(c)*func(a) < 0)
                b = c;
            else
                a = c;
        }
                //prints value of c upto 4 decimal places
        document.write("The value of " +
                      "root is : "+ c.toFixed(4));
    }
 
 
// Driver program
 
        // Initial values assumed
        let a =-200, b = 300;
        bisection(a, b);
         
        // This code is contributed by susmitakundugoaldanga.
</script>

Producción: 

The value of root is : -1.0025

Complejidad del tiempo: la complejidad del tiempo de este método depende de los valores asumidos y la función. 
¿Cuáles son los pros y los contras?  
La ventaja del método de bisección es que se garantiza la convergencia. La desventaja del método de bisección es que no puede detectar raíces múltiples.
En general, el método de bisección se usa para obtener una aproximación aproximada inicial de la solución. Luego se utilizan métodos convergentes más rápidos para encontrar la solución. 
Pronto discutiremos otros métodos para resolver ecuaciones algebraicas y trascendentales
Referencias:  
Métodos introductorios de análisis numérico por SS Sastry  
https://en.wikipedia.org/wiki/Bisection_method
Este artículo es una contribución de Abhiraj Smit. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *