Método de Bisección en Scilab -código

[RECUERDA, EN ESTA PÁGINA EL CÓDIGO SE ENCUENTRA AL FINAL DEL ARTÍCULO PARA SU DESCARGA]

Hace un tiempo que implementamos y compartimos con todos ustedes en esta entrada, uno de los más famosos métodos numéricos para hallar las raíces de una función del tipo y=f(x). Pues ya era el tiempo de que lo implementásemos en este genial software.

scilabp

Para una explicación un poco más detallada del método los invitamos a leer nuestra entrada sobre el método de bisección, allí no encontrar una descripción tan pesada como suele suceder en algunos libros u otras páginas, como saben, en este Blog (ya que los autores también somos estudiantes) sabemos que los estudiantes buscamos soluciones rápidas y respuestas concisas, por lo que aquella explicación aclara bastante rápido nuestras idea sobre este método.

Un vistazo rápido al algoritmo.

para implementar el programa solo necesitamos saber cuales son los pasos que propone el método para hallar la raíz (o el cero) de la función. Los pasos a seguir en el método de bisección son muy básico y el algoritmo consta de lo siguiente:

  1. Escoger las estimaciones iniciales del intervalo, es decir el limite inferior XL y el respectivo límite superior XU de tal forma que se cumpla: biseccion
  2. Realizar una división del intervalo, lo cual va a corresponder a un estimado de la raíz, en otras palabras se hará la suposición de que la raíz que buscamos Xr se encuentra en la mitad del ambos intervalos XL y XUbiseccion
  3. Finalmente el último paso es realizar las siguientes evaluaciones para determinar el intervalo en el cual se encuentra la raíz que buscamos (la que nos puso en estos lios):
  • Si f(XL)*f(Xr) < 0 la raíz se encuentra en el intervalo inferior, entonces hacemos Xu=Xr, y se retorna al paso 2.
  • Si f(XL)*f(Xr) > 0 la raíz se encuentra en el intervalo superior, entonces XL=Xr, y se retorna al paso 2.
  • Si f(XL)*f(Xr) = 0 la raíz es igual a Xr (es poco probable que sea exacto pero es una paso que hay que tener en cuenta, para esto se tiene un criterio de tolerancia de error), de esta forma se terminan las iteraciones.

 

Código en Scilab.

En primer lugar debemos definir la función a la cual le queremos calcular la raíz, esto lo podemos hacer con la siguiente linea de código, donde el nombre de la función será f(x), y la función será (para nuestro ejemplo) x³-1.


deff('y=f(x)','y=x^3-1;'); //usamos deff para definir funciones en una linea en Scilab.

cap1

Después de tener definida nuestra función, al trabajar con estos métodos, en los cuales hay que elegir un intervalo, siempre es conveniente realizar una representación gráfica, en un rango suficientemente amplio que nos permita observar el comportamiento de nuestra función para elegir los valores superior e inferior correctamente y ganar más eficiencia, por esta razón definimos un vector que represente al eje ‘X‘ por ejemplo de -20 a 20 y graficamos nuestra función evaluando el vector X en la función f, como se muestra a continuación:

cap2

Después de haber realizada la visualización del comportamiento de la función, podemos pedir los límites inferior y superior del intervalo, obviamente la función se puede modificar para que estos limites sean recibidos directamente desde los argumentos de entrada de la función, nosotros lo hicimos de esta forma:

cap3

Y cuando ya tenemos todo listo, los límites del intervalo, y la función sobre la que vamos a trabajar, damos inicio al método, como se ve a continuación, antes que nada, aclarar dos cosas:

1. No tienes que copiar todo lo que ves en la imagen, ya que al final te dejamos el link para que descargues el script y lo puedas manipular.

2. cuando ingreses los límites inferior y superior, no ingrese una pareja que se anule a si misma, como 10 y -10 o 50 y -50, ya que como viste en el paso dos hay una división de la siguiente forma xr=(Xl+Xu)/2, por lo que si la división da 0 como resultado Scilab nos enviará un error al tratar de calcular el error relativo ya que ocurriría una división entre 0 (¿acaso alguien podría hacerla? xD ).

cap4

¡Un ejemplo!

A manera de ejemplo demostraremos el correcto funcionamiento de la función, como vimos la función que pusimos en el script por defecto fue y=x^3-1 entonces como ya te puedes imaginar la raíz debería estar en 1 es la única forma que y(x)=0

Tal vez como ya sepas, antes de intentar ejecutar una función en Scilab debemos cargarla en el espacio de trabajo, esto lo hacemos con la siguiente sentencia y a continuación realizamos el llamado a ‘biseccion‘:

   
  exec('biseccion.sci',-1); //con esto cargamos la función en nuestro workspace
  raiz=biseccion()  //llamamos el método biseccion y damos enter

 Cuando ejecutamos lo anterior, entonces lo primero que obtenemos es la representación gráfica, como observamos a continuación.

 cap5

Como se puede apreciar, resulta más claro todo a la hora de elegir los límites del intervalo, este caso tomaremos -10 y 8 por ejemplo, como límites inferior y superior respectivamente.

cap6Como se puede ver, el valor real de la raíz debería ser 1, por lo que esto es una muy buena aproximación, sin embargo, si queremos mejorar la precisión le podemos disminuir a la ‘tolerancia de error‘ que en la función es representada por la variable ‘tol‘, desupés de modificar esa variable obtenemos con el mismo ejemplo la siguiente raíz:

cap7Ahora si vemos como nos arroja el valor exacto 1, de esta forma x³-1 con X=1 la raíz es Y(1)=0, con solo agregar un cero ‘0’ más a la variable de tolerancia de error.

Cómo siempre, puedes descargar el código en este enlace, cualquier duda o sugerencia la puedes dejar en los comentarios, recuerda que comentar es agradecer.

Autor: Julio Marulanda.

4 comentarios en “Método de Bisección en Scilab -código

    • Hola Luis, gracias por comentar!
      Si no necesitas la gráfica, solo tienes que borrar esa parte del código y no se afectará para nada el resto del algoritmo.
      Por otro lado, por supuesto que podemos ayudarte, sin embargo ¿puedes aclararnos eso de imprimir las iteraciones?, eso quiere decir que necesitas imprimir el valor de las variables por cada iteración o el número de iteraciones (el contador) del algoritmo?

      Me gusta

      • Hola Julio! a mi también me parece excelente tu página, pero tengo la misma duda. No sé cómo imprimir las iteraciones aparte del gráfico. Quisiera imprimir el valor de las variables por cada iteración con error o algo así como obtenemos cuando hacemos el cálculo a mano, puedes ayudarme? en algunos códigos de matlab lo encuentro pero son complicados y no logro entenderlos bien, sale como una tabla con los valores.

        Me gusta

      • Hola Irene! gracias por comentar, espero que el contenido del blog te siga siendo útil, lamento la demora en la respuesta.

        Si lo que quieres es imprimir los valores de las variables, puedes utilizar la función ‘printf( cadena,variable )’ para que me comprendas, escribe esto en scilab:

        h = 12.43;
        k = 32.14;
        printf(‘Las variables son: %.3f y %.3f ‘,h,k);

        Como podrás ver, los valores de cada variable aparecerán luego del signo %.3f, así que puedes usar la función printf() dentro del bucle while y hacer que los valores de las variables se vayan imprimiendo, las variables las vas separando por comas. (recomiendo que imprimas los valores luego del calculo del error para que muestres el último valor de este).
        Saludos
        Julio.

        Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s