miércoles, 9 de abril de 2014

SOLUCIÓN DE ECUACIONES DIFERENCIALES ORDINARIAS CON MAXIMA



SOLUCIÓN DE ECUACIONES DIFERENCIALES ORDINARIAS CON MAXIMA

Ing. Luis Manfredo Reyes

Maxima es un sistema de cálculo simbólico, que fue desarrollado inicialmente   en el lenguaje de programación  Lisp.
Maxima es un software que se derivó del sistema original Macsyma, desarrollado en el MIT (Massachusetts Institute of Technology) entre los años 1968 y 1982 como parte de un proyecto de investigación en computación simbólica  llamado “MAC”.

En un gesto digno de agradecimiento, el MIT otorgó  una copia del código fuente original del software  al DOE (Department of Energy) en 1982, en una versión conocida como DOE-Macsyma.

Una de estas copias fue custodiada por el Profesor William F. Schelter de la Universidad de Texas desde el año 1982 hasta su fallecimiento en 2001.

En 1998 gracias a las gestiones y perseverancia de Schelter, se  logró obtener el permiso del Departamento de Energía para distribuir el programa bajo la llamada licencia GNU-GPL, iniciando en el año 2000 el proyecto Maxima en SourceForge con el fin de mantener y seguir desarrollando DOE-Macsyma, ahora con el nombre de Maxima.

El Software puede descargarse, instalarse, utilizarse en forma gratuita, siempre que no se use con fines comerciales, ni se cobre por su uso. El sitio es:
http://sourceforge.net/projects/maxima/files/latest/download?source=files

Maxima posee un  amplio conjunto de funciones para hacer manipulación simbólica de polinomios, matrices, funciones racionales, integración, derivación, manejo de gráficos en 2D y 3D, manejo de números de punto flotante y grandes, expansión en series de potencias y de Fourier, entre otras funcionalidades.
Se asume que el lector tiene conocimientos del uso básico del programa

Sintaxis:
En Maxima, una derivada  se representa usando la siguiente forma: ‘diff(y,x)

ejemplo:   y´+2xy=x, en Maxima se codifica ‘diff(y,x)+2*x*y=x
Si se trata de derivadas de orden superior, se indica así:
‘diff(y,x,n) 
donde n es el grado (2=segunda, 3=tercera, etc)


No se puede usar la forma polinomial: P(x,y)dx+Q(x,y)dy=0. En éste caso se debe hacer la manipulación algebráica para acomodarla a una de las dos formas que sí acepta el programa


Maxima dispone de dos comandos para resolver ecuaciones diferenciales:
Ode2: resuelve ecuaciones ordinadias de primero y segundo orden
Desolve: resuelve sistemas de ecuaciones diferenciales, por el método de transformada de LaPlace
Adicionalmente, Maxima permite la creación de extensiones, en una categoría llamada Contribuciones. Existe una contribución llamada CONTRIB_ODE, que provee métodos adicionales para resolver algunos casos donde ode2 tiende a fallar.

Maxima permite almacenar una ecuación en una variable para su uso posterior, o en la sintaxis del comando incluirla directamente.


SINTAXIS DEL COMANDO ODE2:
ODE2(ecuación, dependiente, independiente)
Usualmente la variable dependiente es y y la independiente es x, pero Maxima acepta cualquier nombre de variable



CASO1: ECUACIONES DE VARIABLES SEPARABLES
Ejemplo 1. Resuelva:

 Primero hay que acomodar la ecuación, sustituyendo la derivada por y' 
2*x*y+6*x+(x^2-4)*'diff(y,x)=0

MAXIMA NO PERMITE OPERACIONES IMPLÍCITAS!!!
SE DEBEN ESPECIFICAR LOS OPERADORES ARITMÉTICOS

en la consola de Maxima  se escribe: ode2(2*x*y+6*x+(x^2-4)*'diff(y,x)=0,x,y);
TODOS LOS COMANDOS DE MAXIMA DEBEN TERMINAR CON PUNTO Y COMA!!
el resultado es:




resuelva:
Se sustituye la derivada por 'diff(y,x)  y queda: 'diff(y,x)=x-1+x*y-y
Se ingresa a la consula de Maxima: ode2(y'=x-1+x*y-y,x,y)
la respuesta es:



Un ejemplo con condición inicial:
Resuelva:
se acomoda la ecuación: 'diff(y,x)=2*x^2/3*y^3

se ingresa  ode2('diff(y,x)=(2*x^2)/(3*y^3),y,x);
es muy importante delimitar el numerador y el denominador con paréntesis para no cometer errores y obtener una respuesta distinta
cuando Maxima presenta la solución general, se puede llamar a la función  ic1 para valuar las condiciones iniciales: ic1(%solución,x=valor,y=valor);

Maxima almacena la solución en una variable llamada %o y las va numerando para diferenciar. Se debe usar el último resultado donde presenta la solución general



CASO 2: ECUACIONES DIFERENCIALES EXACTAS
Resuelva: 2xydx+(x^2-1)dy=0

Se divide todo entre dx y se sustituye la derivada
2*x*y+(x^2-1)*'diff(y,x)=0

Se ingresa  ode2(2*x*y+(x^2-1)*'diff(y,x)=0,y,x);

la respuesta es:




CASO 3: ECUACIONES DIFERENCIALES HOMOGÉNEAS
Resuelva: (x^2+y^2) dx +(x^2-xy) dy=0

primero se acomoda la ecuación: (x^2+y^2) +(x^2-x*y)*'diff(y,x)=0
se ingresa a la consola ode2( x^2+y^2 +(x^2-x*y)*'diff(y,x)=0,y,x);
la respuesta es:



CASO 4: ECUACIONES LINEALES
resuelva: x^2 y'+5xy+3x^5=0
se ingresa a la consola ode2(x^2*’diff(y,x)+5*x*y+3*x^5=0,y,x);
la respuesta es:


CASO 5: ECUACIONES DE LA FORMA BERNOULLI
Resuelva:
y'=5y-5xy^3

se ingresa ode2('diff(y,x)=5*y-5*x*y^3,y,x);
la respuesta es:


CASO 6: ECUACIONES DE LA FORMA RICATTI:
Resuelva: y'=y+y^2+1
Ingresar ode2 ( 'diff(y,x)=y+y^2+1,y,x);
La respuesta es:

CASO 7: ECUACIONES DE SEGUNDO ORDEN DE LA FORMA CAUCHY-EULER
  Resuelva: x^2y''-5x*y'+13=0
Ingresar ode2(x^2*'diff(y,x,2)-5*x*'diff(y,x)+13=0,y,x);
La respuesta es: 



CASO 8:
 ECUACIONES DE SEGUNDO ORDEN CON COEFICIENTES CONSTANTES

Resuelva:
(x-1)y''-y'=0
Acomodar la ecuación e ingresar
 ode2(((x-1)*’diff(y,x,2)-‘diff(y,x)=0,y,x);

La respuesta es:






CASO 9: ECUACIONES DE SEGUNDO ORDEN CON COEFICIENTES VARIABLES
Resuelva:
 Ingresar ode2('diff(y,x,2)-3*t/(t-1)*'diff(y,x)+4/(t-1)*y=y,y,t);
La respuesta es:
En éste caso, Maxima no encontró la solución usando el comando edo2
Se debe intentar resolver utilizando al paquete contribuído contrib_ode
Introducción a contrib_ode (fuente: Manual de Maxima)
La función ode2 de Maxima intenta resolver  ecuaciones diferenciales ordinarias (EDO) simples de primer y segundo orden. La contribución añadida:  contrib_ode extiende las posibilidades de ode2 con métodos adicionales para ODEs lineales y no lineales de primer orden y homogéneas lineales de segundo orden. El módulo está aún  en estado de desarrollo y la sintaxis puede cambiar en futuras versiones. Tanm pronto como la codificación pase las pruebas necesarias,  ya se  podrá  integrar dentro de Maxima.
El paquete debe cargarse con la instrucción load('contrib_ode) antes de utilizarlo.
La sintaxis de contrib_ode es similar a la de ode2. Se necesitarán  tres argumentos: una EDO (sólo se necesita el miembro izquierdo si el derecho es igual cero), la variable dependiente y la independiente. Si encuentra la solución, devolverá una lista de resultados.
La forma de los resultados devueltos es diferente de la utilizada por ode2. Puesto que las ecuaciones no lineales pueden tener múltiples soluciones, contrib_ode devuelve una lista de soluciones. Las soluciones pueden tener diferentes formatos:
  • una función explícita para la variable dependiente,
  • una función implícita para la variable dependiente,
  • una solución paramétrica en términos de la variable %t o
  • una transformación en otra EDO de variable %u.
%c hace referencia a la constante de integración en las ecuaciones de primer orden. %k1 y %k2 son las constantes para las ecuaciones de segundo orden. Si por cualquier razón contrib_ode no pudiese encontrar una solución, devolverá false, quizás después de mostrar un mensaje de error.
Ejemplos:
En ocasiones es necesario devolver una lista de soluciones, pues algunas EDOs pueden tener múltiples soluciones:
(%i1) load('contrib_ode)$

(%i2) eqn:x*'diff(y,x)^2-(1+x*y)*'diff(y,x)+y=0;

                    dy 2             dy
(%o2)            x (--)  - (x y + 1) -- + y = 0
                    dx               dx
(%i3) contrib_ode(eqn,y,x);

                                             x
(%o3)             [y = log(x) + %c, y = %c %e ]
(%i4) method;

(%o4)                        factor

Las EDOs no lineales pueden tener soluciones singulares sin constantes de integración, como en la segunda solución del ejemplo siguiente:
(%i1) load('contrib_ode)$

(%i2) eqn:'diff(y,x)^2+x*'diff(y,x)-y=0;

                       dy 2     dy
(%o2)                 (--)  + x -- - y = 0
                       dx       dx
(%i3) contrib_ode(eqn,y,x);

                                           2
                                 2        x
(%o3)              [y = %c x + %c , y = - --]
                                          4
(%i4) method;

(%o4)                       clairault
La siguiente ODE tiene dos soluciones paramétricas en términos de la variable %t. En este caso, las soluciones paramétricas se pueden manipular para dar soluciones explícitas.
(%i1) load('contrib_ode)$

(%i2) eqn:'diff(y,x)=(x+y)^2;

                          dy          2
(%o2)                     -- = (y + x)
                          dx
(%i3) contrib_ode(eqn,y,x);

(%o3) [[x = %c - atan(sqrt(%t)), y = - x - sqrt(%t)],
                     [x = atan(sqrt(%t)) + %c, y = sqrt(%t) - x]]
(%i4) method;

(%o4)                       lagrange
En el siguiente ejemplo (Kamke 1.112) se obtiene una solución implícita.
(%i1) load('contrib_ode)$

(%i2) assume(x>0,y>0);

(%o2)                    [x > 0, y > 0]
(%i3) eqn:x*'diff(y,x)-x*sqrt(y^2+x^2)-y;

                     dy           2    2
(%o3)              x -- - x sqrt(y  + x ) - y
                     dx
(%i4) contrib_ode(eqn,y,x);

                                  y
(%o4)                  [x - asinh(-) = %c]
                                  x
(%i5) method;

(%o5)                          lie
La siguiente ecuación de Riccati se transforma en una EDO lineal de segundo orden de variable %u. Maxima es incapaz de resolver la nueva EDO, por lo que la devuelve si resolver:
(%i1) load('contrib_ode)$

(%i2) eqn:x^2*'diff(y,x)=a+b*x^n+c*x^2*y^2;

                    2 dy      2  2      n
(%o2)              x  -- = c x  y  + b x  + a
                      dx
(%i3) contrib_ode(eqn,y,x);

               d%u
               ---                            2
               dx        2     n - 2   a     d %u
(%o3)  [[y = - ----, %u c  (b x      + --) + ---- c = 0]]
               %u c                     2      2
                                       x     dx
(%i4) method;

(%o4)                        riccati

Para EDOs de primer orden, contrib_ode llama a ode2. Entonces trata de aplicar los siguientes métodos: factorización, Clairault, Lagrange, Riccati, Abel y Lie. El método de Lie no se intenta aplicar a las ecuaciones de Abel si el propio método de Abel no obtiene solución, pero sí se utiliza si el método de Riccati devuelve una EDO de segundo orden sin resolver.

Para EDOs de segundo orden, contrib_ode llama a ode2 y luego a odelin.
Se mostrarán mensajes de depurado si se ejecuta la sentencia put('contrib_ode,true,'verbose).



Funciones y variables para contrib_ode(fuente: Manual del Maxima)

Función: contrib_ode (eqn, y, x)
Devuelve la lista de soluciones de la ecuación diferencia ordinaria (EDO) eqn de variable independiente x y variable dependiente y.
Función: odelin (eqn, y, x)
La función odelin resulve EDOs homogéneas lineales de primer y segundo orden con variable independiente x y variable dependiente y. Devuelve un conjunto fundamental de soluciones de la EDO.
Para EDOs de segundo orden, odelin utiliza un método desarrollado por Bronstein y Lafaille, que busca las soluciones en términos de funciones especiales dadas.
(%i1) load('contrib_ode);

(%i2) odelin(x*(x+1)*'diff(y,x,2)+(x+5)*'diff(y,x,1)+(-4)*y,y,x);
...trying factor method
...solving 7 equations in 4 variables
...trying the Bessel solver
...solving 1 equations in 2 variables
...trying the F01 solver
...solving 1 equations in 3 variables
...trying the spherodial wave solver
...solving 1 equations in 4 variables
...trying the square root Bessel solver
...solving 1 equations in 2 variables
...trying the 2F1 solver
...solving 9 equations in 5 variables
       gauss_a(- 6, - 2, - 3, - x)  gauss_b(- 6, - 2, - 3, - x)
(%o2) {---------------------------, ---------------------------}
                    4                            4
                   x                            x

Función: ode_check (eqn, soln)
Devuelve el valor de la ecuación diferencia ordinaria (EDO) eqn después de sustituir una posible solución soln. El valor es cero si soln es una solución de eqn.
(%i1) load('contrib_ode)$

(%i2) eqn:'diff(y,x,2)+(a*x+b)*y;

                         2
                        d y
(%o2)                   --- + (a x + b) y
                          2
                        dx
(%i3) ans:[y = bessel_y(1/3,2*(a*x+b)^(3/2)/(3*a))*%k2*sqrt(a*x+b)
         +bessel_j(1/3,2*(a*x+b)^(3/2)/(3*a))*%k1*sqrt(a*x+b)];

                                  3/2
                    1  2 (a x + b)
(%o3) [y = bessel_y(-, --------------) %k2 sqrt(a x + b)
                    3       3 a
                                          3/2
                            1  2 (a x + b)
                 + bessel_j(-, --------------) %k1 sqrt(a x + b)]
                            3       3 a
(%i4) ode_check(eqn,ans[1]);

(%o4)                           0
Variable opcional: method
A la variable method se le asigna el método aplicado.
Variable: %c
%c es la constante de integración para EDOs de primer orden.
Variable: %k1
%k1 es la primera constante de integración para EDOs de segundo orden.
Variable: %k2
%k2 es la segunda constante de integración para EDOs de segundo orden.
Función: gauss_a (a, b, c, x)
gauss_a(a,b,c,x) y gauss_b(a,b,c,x) son funciones geométricas 2F1 . Representan dos soluciones independientes cualesquiera de la ecuación diferencial hipergeométrica x(1-x) diff(y,x,2) + [c-(a+b+1)x diff(y,x) - aby = 0 (A&S 15.5.1).
El único uso que se hace de estas funciones es en las soluciones de EDOs que devuelven odelin y contrib_ode. La definición y utilización de estas funciones puede cambiar en futuras distribuciones de Maxima.
Véanse también gauss_b, dgauss_a y gauss_b.
Función: gauss_b (a, b, c, x)
Véase también gauss_a.
Función: dgauss_a (a, b, c, x)
The derivative with respect to x of gauss_a(a,b,c,x).
Función: dgauss_b (a, b, c, x)
Derivada de gauss_b(a,b,c,x) respecto de x.
Función: kummer_m (a, b, x)
Función M de Kummer, tal como la definen Abramowitz y Stegun, Handbook of Mathematical Functions, Sección 13.1.2.
El único uso que se hace de esta función es en las soluciones de EDOs que devuelven odelin y contrib_ode. La definición y utilización de estas funciones puede cambiar en futuras distribuciones de Maxima.
Véanse también kummer_u, dkummer_m y dkummer_u.
Función: kummer_u (a, b, x)
Función U de Kummer, tal como la definen Abramowitz y Stegun, Handbook of Mathematical Functions, Sección 13.1.3.
Véase también kummer_m.
Función: dkummer_m (a, b, x)
Derivada de kummer_m(a,b,x) respecto de x.
Función: dkummer_u (a, b, x)
Derivada de kummer_u(a,b,x) respecto de x.


No hay comentarios:

Publicar un comentario