Biseccion

Hola a todos! Espero que alguien me responda lo antes posible: Tengo un intervalo muy grande y la raíz que busco está muy cerca de uno de los extremos del intervalo. Introduzco los datos en el algoritmo (extremo a, extremo b y tolerancia) y el resultado que me da es que no hay cambio de signo en los extremos del intervalo dado. A la vista de la gráfica observo que sí que hay cambio de signo, entonces, ¿por qué funciona mal el algoritmo? Muchas gracias por adelantado.

1 respuesta

Respuesta
1
A falta de un programa más adecuado he hecho algunos cálculos en MATLAB.
El problema que encuentro en esta función es que en el paso por cero la función tiene una pendiente MUY pequeña. Esto hace que la función tome valores del orden de 10e-6 o incluso menores. Al multiplicar entre sí los valores de la función en los extremos fíjate lo que pasa:
10e-6 * 10e-6 = 10e-12
Si los valores toman valores suficientemente pequeños, se producirá "underflow": el resultado será tan pequeño que no con la precisión finita que usa el ordenador no es posible distinguirlo del cero. Por ello, si f(a)*f(b)==0, el algoritmo fallará.
La solución que propongo es que en lugar de comprobar el signo de f(a)*f(b), compruebes el de f(a) y el de f(b) por separado. Así obtendrás mucha más resolución (y si obtuvieras que f(a) o f(b) es aparentemente nulo, ¡Ahí tienes la raíz!).
Comprueba esto haciendo que el algoritmo imprima a cada paso los valores de a, b, f(a), f(b), y f(a)*f(b). Tanto si he acertado como si no, observarás qué ocurre de verdad.
Muchas gracias por tu respuesta! Efectivamente el problema es la limitación que tiene el ordenador en cuanto a la precisión. Confunde la raíz cuya imagen es 0 con una aproximación a dicha raíz cuya imagen es muy muy próxima a 0. Esto de los redondeos me vuelve loca! Un saludo.
Ante todo, muchas gracias por atender mi pregunta, lowpass.
Los cálculos los realizo en el PC mediante un programa que se llama Derive 5, en el cual se puede programar. La gráfica la dibujo con el mismo programa. El valor de la tolerancia indica la distancia mínima que tiene que haber entre la aproximación encontrada y la raíz buscada.La función es la siguiente: f(x)= ln(x+6)-4/(x+6).
El algoritmo introducido en Derive 5 consiste en lo siguiente: se introducen la función, los 2 extremos del intervalo el número de iteraciones que desees y la tolerancia; si f(a)*f(b)>0, te pide que introduzcas otros datos, y si ese producto es <0 pueden ocurrir dos cosas:
1.Se realizan las iteraciones indicadas, pero no se ha encontrado una aproximación cuya distancia a la raíz sea menor que la tolerancia.
2.Se encuentra una buena aproximación y aparece en la pantalla una tabla que indica cuáles son los valores de a, b, c=(a+b)/2 y f(c)en cada iteración.
Espero haberme explicado bien, si quiere le puedo mandar el programa, pero debería ser como dato adjunto, y creo que por este medio no se puede.
De antemano sé que el algoritmo no va a funcionar, porque nos lo dice el ejercicio, la pregunta concreta de dicho ejercicio es por qué funciona malel algoritmo con los siguientes datos: a = -2.673, b=100, 40 iteraciones, tolerancia=10^(-5).
Muchas gracias.
Lo más probable es que falle la gráfica y que realmente la raíz esté fuera del intervalo. Eso ocurre a veces, dado que los algoritmos de representación son menos precisos que los de cálculo de raíces.
Podré darte una respuesta más precisa si me das datos adicionales:
- ¿En qué clase de máquina (PC, calculadora programable...) haces los cálculos?
- ¿Qué algoritmo usas para buscar la raíz? ¿En qué se basa? ¿Qué significa en ese algoritmo concreto el valor de la tolerancia?
- ¿Qué algoritmo usas para dibujar la gráfica?
- ¿Qué función estás representando, y en qué intervalo? Es importante al menos saber si es una función explícita (la variable dependiente está despejada) o implícita (no lo está).
De todas maneras, empieza por comprobar si realmente falla la gráfica, porque esa es la solución más probable.

Añade tu respuesta

Haz clic para o