Utilización del teorema de Bolzano para obtener una aproximación a una raíz de una función.

Este trabajo fue propuesto por los profesores de matemática Catherine Maldonado y Alejo Columbo para estudiantes de bachillerato del liceo 61 de Montevideo, en 2025. Alejo Columbo lo presentó en un taller para estudiantes de profesorado de matemática en febrero de 2026.

Read More

Figura que describe una función continua f que cumple la condición del teorema de Bolzano en el intervalo (a,b) y por lo tanto tiene una raíz (c) en el intevalo.

Enunciado del problema

Definir una función que dada una función continua y un intervalo cerrado (a,b), utilice el teorema de Bolzano para hallar una raíz racional. Si la raiz es irracional, se divide el intervalo hasta hallar uno menor o igual que un epsilon donde se encuentre la raíz. Tanto la raiz como el intervalo deben ser devueltos en una lista de modo que si no existen se devuelve la lista vacía.

Una solución: definición de la función raizEnIntervalo

La funcion raizEnIntervalo toma los extremos del intervalo cerrado (a,b) y un epsilon y devuelve una lista con el par con las coordenadas de la raiz en el intervalo, si esta es racional, o la lista vacía si no hay raiz en el intervalo (no se cumplen las condiciones de Bolzano), o con los extremos del intervalo menor que epsilon donde se encuentra la raíz si es irracional. Las funciones deben ser definidas globalmente y para probar se sustituye el nombre correspondiente en la funcion raizEnIntervalo.

Implementación en MateFun.


conj Rno0 = { x en R | x /= 0 }

{- Definimos la funcion valor absoluto para calcular la distancia entre los 
extremos del intervalo, que se usará para comparar con el epsilon -}
   
abs :: R -> R 
abs (x) = x si x >= 0
        { -x

{- En raizEnIntervalo se utiliza la funcion h definida abajo. Se puede definir la funcion que se 
desee y sustituir todas las apariciones de h por el nombre de la funcion definida -}

raizEnIntervalo :: R X R X R -> (R X R)*
raizEnIntervalo (a,b,e) = [(a,0)] si h(a) == 0
                { [(b,0)] si h(b) == 0
                { [(m,0)] si h(m) == 0
                { [] si h(a) * h(b) > 0
                { raizEnIntervalo(m, b,e) si (h(m) * h(b) < 0, d > e)
                { raizEnIntervalo(a,m,e) si (h(a) * h(m) < 0, d > e)
                { [(a,b)] 
             donde m = (a+b)/2 
                   d = abs(b-a)


{- Ejemplos de funciones para probar la funcion raizEnIntervalo  -} 

{- f1 y f2 no tienen raíces racionales, por lo tanto raizEnIntervalo devuelve 
intervalos menores que un epsilo donde se encuentran las raices -}

f1::R -> R
f1(x) = x^2 - 5
{-
raizEnIntervalo(2,3,0.01)
[(2.2344,2.2422)]
-}

f2 :: R -> R
f2 (x) = 3 * x^2 + 2 * x - 6
{-
raizEnIntervalo(-2,-1,0.01)
[(-1.7891,-1.7812)]
-}
{-
raizEnIntervalo(-1,0,0.01)
[]
No se cumple la condición de Bolzano
f2(-1)
-5
>f2(0)
-6-}

{- f3 tiene dos raices racionales, cada una de ellas es devuelta por raizEnIntervalo
al pasarle el intervalo correspondiente para cada una -}
f3 :: R -> R
f3(x) = x^2 + x -2

{- 
raizEnIntervalo (0.5,1.5,0.01)
[(1,0)]
>raizEnIntervalo (-3,-1,0.01)
[(-2,0)]
-}

{- funciones no polinomicas -}
g :: Rno0 -> R
g (x) = (x+1) / x
{-
raizEnIntervalo (-0.5,-1, 0.01)
[(-1,0)]
>raizEnIntervalo (-0.5,-1.5, 0.01)
[(-1,0)]
>raizEnIntervalo (-0.2,-0.5, 0.01)
[]
-}

h :: Rno0-> R
h (x) = log(x - 1)
{-
raizEnIntervalo (1.5,2.5,0.01)
[(2,0)]
-}