ChemEng stuff followers

Implementando el método de bisección en MAPLE

  El método de bisección es uno de los métodos más simples para buscar raíces. En esta página mostraré como usar este método con la rutina ya incluida en MAPLE y como implementar este método desde cero.

Bisection en MAPLE

En MAPLE el comando que se usa para utilizar el método de bisección se llama BISECTION y para poder usarlo debemos cargar primero una paquetería que se llama STUDENT. En la ayuda de MAPLE aparece así:


Ya en la práctica, este método lo podríamos usar escribiendo lo siguiente:

>with(Student[NumericalAnalysis]):

>fp:= x**2+8*x-3:

en donde fp es la función problema. Como ya sabrán, fp es una parábola abierta hacia arriba que cruza el eje horizontal dos veces. Gráficamente podemos ver esto con mayor facilidad:

Entonces, el comando BISECTION debería ser capaz de darnos las raíces (los puntos de cruce cuando fp=0) de fp. Esto es más o menos como sigue:

>Bisection(fp, x=[0,2], tolerance=10^(-2));

0.3574218750

y si queremos obtener la otra raíz, simplemente cambiamos a:

>Bisection(fp, x=[-10,-6], tolerance=10^(-2));

-8.312500000

Los valores  entre corchetes [0,2] y [-10,-6] son en realidad los límites que definen el intervalo de búsqueda de la raíz. Resulta obvio, que el usuario debe proporcionar dos números del eje horizontal entre los cuales está una raíz. Y tolerance es el error con el que se desea obtener la raíz. Es decir que si deseas mayor exactitud debes proporcionar un tolerance más pequeño.

Nota: MAPLE no puede calcular dos raíces al mismo tiempo usando BISECTION. Esto se debe a que el algoritmo del método se basa en cambios de signo de la función. Para probar esto, puedes cambiar el intervalo de busqueda entre -10 y 2 (el programa arrojará un mensaje de error).

Implementando un algoritmo de bisección en MAPLE

Aquí mostraré como programaríamos el método de bisección en MAPLE usando comandos similares a los de Fortran. Pero antes necesitamos saber como funciona el método de bisección. Como este blog no es para enseñar las bases de los métodos numéricos, les recomiendo que revisen el libro de Chapra y Canale:

En ese libro de texto encontrarán una explicación bastante sencilla y lo mas importante: un algoritmo. Este algoritmo es una especie de guía para implementar el método de bisección en cualquier lenguaje de programación que quieras. Si puedes seguir los pasos del algoritmo, no te costará trabajo entender la idea seguida en MAPLE.

La implementación en MAPLE puede variar. En este caso he empleado un comando que permite, digamos, crear mini-programas que puedes ejecutar dentro de la misma hoja de trabajo. Este comando es el de PROC o procedure. El programa es como sigue:

> BISmet:= proc(FUNC::algebraic, X1::float, X2::float, XACC::float)
    local JMAX, FMID, F, xd, DX, J, XMID:
  #Este es el número máximo de iteraciones
    JMAX:=40: 
  #Evaluar la función problema en los extremos proporcionados
    FMID:= eval(FUNC,x=X2):
    F:= eval(FUNC,x=X1):
  #Revisar el tamaño del intervalo y por donde iniciar la búsqueda
    if F*FMID>=0 then print(BracketingNeeded);
    elif F<0 then
      xd:= X1:
      DX:= X2-X1:
    elif F>0 then
      xd:= X2:
      DX:= X1-X2:
    end if:
  #Cálculo de la raíz
    for J from 1 to JMAX do
  #Partir el intervalo en 2 (bisección)
      DX:= DX*0.5:
      XMID:= xd+DX:
      FMID:= eval(FUNC,x=XMID):
      if FMID<=0 then 
        xd:= XMID:
      elif abs(DX)<XACC or FMID=0 then break;
      end if:
    end do:
    return xd;
  end proc:

Para echar a andar el programa solo necesitas copiar el text de arriba y pegarlo en tu hoja de trabajo de MAPLE. Como puede verse, BISmet es en realidad un mini-programa (como decía anteriormente). Es decir, que se dentro de la estructura se definen variables locales que ayudan a calcular todo; pero lo importante es que todo inicia con los valores/expresiones/datos iniciales que se ponen entre paréntesis al inicio del comando.

Para usar BISmet debemos proporcionarle lo siguiente:
  • FUNC es la función problema cuya raíz deseamos conocer
  • X1 es el extremo inicial del intervalo de búsqueda
  • X2 es el extremo final del intervalo de búsqueda
  • XACC es la tolerancia o el nivel de exactitud deseada
Aquí mostraré como usar BISmet con la función problema anterior. Es como sigue:

> BISmet(ftest,-9.,-7.,1.5e-4);
-8.358886719

> BISmet(ftest,0.,2.,1.5e-4);
0.3588867188

Debo mencionar que el usuario debe conocer previamente el intervalo en donde BISmet buscará la raíz. Como una actividad al lector interesado sugiero que piense en la siguiente pregunta: ¿Puede BISmet calcular las dos raíces de fp al mismo tiempo?

Si tienes alguna duda escríbela en los comentarios y trataré de ayudarte.

Ildebrando

No comments:

Post a Comment

Most popular posts