Primitivas e integrales
Maxima es capaz de hacer primitivas e integrales para funciones de una variable. También puede realizar integrales utilizando métodos numéricos.
- integrate(Función,Variable)
Siempre que puede obtiene la primitiva; en otro caso el resultado aparece expresado en forma simbólica - integrate(Función,Variable,Inicio,Fin)
Para calcular integrales definidas basta incluir los extremos de integración (que son parámetros optativos).
- integrate( x/(1+x^2), x );
- integrate( 1/(1+x^2), x, 0, 1 );
- integrate( 1/(1+x^2), x, 0, inf );
- integrate( 1/(1+x^3), x );
- integrate( sin(t*x), x );
- integrate( exp(-u^2), u, minf, inf );
- integrate( exp(-x^2), x);
- /* resultados en la consola */ 'integrate( exp(-x^2), x) = integrate( exp(-x^2), x); 'diff(erf(x),x)= diff(erf(x),x); 'integrate(exp(-u^2), u, minf, x) = integrate(exp(-u^2), u, minf, x);
La función erf, que ha aparecido en los ejemplos es conocida y utilizada por Maxima, se llama función de error de Gauss y aunque está demostrado que no puede ser escrita en términos de las funciones elementales (polinomios, fracciones, senos, cosenos...) es una función muy importante para la probabilidad y la estadística. Dibuje su gráfica con los comandos usando el comando draw2d o plot2d (véase la sección de gráficos)
Otro ejemplo de función cuya primitiva no puede ser expresada en términos de funciones elementales es sin(x)/x. Pero la primitiva existe para cualquier valor de x al ser una función continua. El único punto en el que la continuidad no es directa es para x=0.
limit( sin(x)/x, x, 0);
Pero el cálculo anterior despeja las dudas: definiendo la función en el punto x=0 como 1, la función sin(x)/x es continua. Pedimos a Maxima que calcule la primitiva, y el resultado lo expresa en términos de una nueva función que, como la precedente, posiblemente sea desconocida para usted, pero no para Maxima. Las cuentas siguientes justifican la afirmación.
- integrate( sin(x)/x, x );
- diff( %, x );
- /* si lo piensa, es exactamente el integrando */ /* pero le pedimos a Maxima que reescriba el resultado */ trigrat(%);
En ocasiones, como ocurre en ejemplo que viene a continuación, que contiene parámetros, puede suceder que Maxima requiera información adicional sobre los mismos para poder calcular la integral.
- integrate(%e^(-a*x)*cos(b*x),x,0,inf);
- kill(all)$ assume(a>0)$ integrate(%e^(-a*x)*cos(b*x),x,0,inf);
Existe un paquete abs_integrate que permite calcular la integral definida de ciertos integrandos que contienen valores absolutos. Lo ilustramos a continuación con un ejemplo trivial, pero la cuestión no es tan simple como el ejemplo sugiere. El lector interesado debe buscar en el manual de Maxima las posibilidades y limitaciones del paquete.
- integrate(abs(x^3),x,-1,1);
- load(abs_integrate)$ integrate(abs(x^3),x,-1,1);
Cambio de variable: ayudando a Maxima
- changevar(Expresión,f(x,y),y,x)
donde x es la variable original, siendo y la nueva variable que se expresa en función de x mediante ecuación implícita f(x,y)=0.
Empezamos con ejemplo sencillo
- 'integrate(sqrt(1-2*x^2),x);
- changevar('integrate(sqrt(1-2*x^2),x), sqrt(2)*x=sin(t),t,x);
- rootscontract(%); %,nouns; subst(t=asin(sqrt(2)*x),%);
- Maxima es capaz de calcular la primitiva de forma directa
'integrate(sqrt(1-2*x^2),x) = integrate(sqrt(1-2*x^2),x);
Pero Maxima no siempre es capaz de calcular la primitiva por sí sólo.
f(x):= x*%e^asin (x)/sqrt(1-x^2);
integrate( f(x), x );
devuelve una primitiva simbólica a pesar de que, en este caso, puede obtenerse, mediante integración por partes, una primitiva expresable a través de funciones elementales haciendo el cambio de variable y=asin(x) .
Vamos a "guiar" a Maxima para que sea capaz de calcular la primitiva: un ejemplo interesante de mútua y fructífera colaboración.
- changevar(integrate( f(x), x ), y=asin(x),y, x );
Maxima no simplifica, pero para un humano puede darse cuenta de que, una vez simplificado, se trata de una primitiva en la nueva variable que puede ser calculada y deshaciendo el cambio de variable se obtiene el resultado buscado. - Vamos a hacerlo paso a paso (salidas en la consola)
kill(all); f(x):= x*%e^asin (x)/sqrt(1-x^2); changevar(integrate( f(x), x ), y-asin(x),y, x ); rootscontract(%); I0 : trigsimp(%); assume( cos(y) > 0); fullratsimp(I0); assume( 0<y, y<%pi/2); I1 : fullratsimp(I0); I1,nouns; subst(y=asin(x),%);
El algoritmo de Risch
El algoritmo de Risch es un algoritmo utilizado para el cálculo de primitivas que transforma el problema original en un problema algebraico. Para usarlo en Maxima la sintaxis coincide con la del comando integrate
risch(función,variable)
- integrate(sqrt(9*x^4+4*x^2),x);
- risch(sqrt(9*x^4+4*x^2),x); /* Comprobamos el resultado derivando */ diff(%,x);
Ayudando a Maxima adecuadamente el comando integrate también puede obtener el mismo resultado
- print("primero reescribimos la raíz con ayuda de radcan")$ f:radcan(sqrt(9*x^4+4*x^2)); print("y ahora calculamos la primitiva")$ integrate(f,x);
- /* primero suponemos que x es positivo */
assume(x>0);
integrate(sqrt(9*x^4+4*x^2),x); - /* olvidamos ahora la suposición y suponemos x negativo */ forget(x>0); assume(x<0); integrate(sqrt(9*x^4+4*x^2),x); print("Reflexione sobre los resultados")$
De hecho, para tratar de calcular una primitiva, Maxima realiza una batería de pruebas heurísticas y si con ninguna de ellas consigue su propósito, entonces emplea el algoritmo de Risch. Utilizando el comando risch tales pruebas heurísticas se evitan. Dos formas diferentes para conseguir el mismo efecto aparecen a continuación (la segunda es más fácil de recordar).
- ev(integrate (Función,Variable), risch)
- integrate (Función,Variable), risch
integrate(sqrt(9*x^4+4*x^2),x),risch;
La respuesta obtenida mediante un comando integrate puede contener, además de las funciones elementales, otras funciones especiales, entre ellas erf y beta
- integrate(x^2*exp(-x^2),x);
- assume(a>-1)$
assume(b>-1)$
integrate(x^a*(1-x)^b,x,0,1);
En http://en.wikipedia.org/wiki/Error_function puede encontrar más información sobre la función de error erf y la función beta http://en.wikipedia.org/wiki/Beta_function.
Integración numérica
El cálculo de primitivas no siempre es posible y por ende hay ocasiones en que la imposibilidad de aplicar la fórmula de Barrow para calcular integrales definidas requiere la utilización de métodos numéricos para poder calcular de integrales.
Maxima implementa de forma nativa dos comandos con esa finalidad: romberg y quad_qags; tales comandos corresponden a métodos numéricos conocidos: el método de Romberg (véase http://en.wikipedia.org/wiki/Romberg%27s_method) y el método QUADPACK (http://en.wikipedia.org/wiki/QUADPACK).
- romberg(Función, Variable,Inicio,Fin);
- quad_qags(Función, Variable,Inicio,Fin)
- quad_qags(Función, Variable,Inicio,Fin, [ErrorRelativo, ErrorAbsoluto, NúmeroMaximoIntervalos])
El resultado de este comando es una lista con cuatro elementos:
[ValorAproximado,ErrorAbsolutoEstimado,NúmeroEvaluacionesRealizado,CódigoError].
Los posibles valores del CódigoError son:
0 si no ha habido problemas;
1 si se utilizaron demasiados intervalos;
2 si se encontró un número excesivo de errores de redondeo;
3 si el integrando ha tenido un comportamiento extraño frente a la integración;
4 si se ha producido un fallo de convergencia;
5 si la integral es probablemente divergente o de convergencia lenta;
6 si los argumentos de entrada no son válidos.Los argumentos opcionales (encerrados entre los corchetes []) que quad_qags, pueden especificarse en cualquier orden. Todos ellos toman la forma: argumento=valor. Los argumentos admisibles son:
- epsrel (valor por defecto es 1d-8)
Error relativo deseado de la aproximación. - epsabs (valor por defecto es 0)
Error absoluto deseado de la aproximación - limit (valor por defecto es 200)
Tamaño del array interno utilizado para realizar la cuadratura: número máximo de intervalos a utilizar
- epsrel (valor por defecto es 1d-8)
Se trata de aproximaciones y los decimales coinciden sólo en las primeras cifras.
- plot2d(sin(exp(x^2)),[x,0,1]);
- integrate(sin(exp(x^2)),x,0,1);
- romberg(sin(exp(x^2)),x,0,1);
- quad_qags(sin(exp(x^2)),x,0,1);
Puede ser necesario prestar atención a las funciones e intervalos en que se aplica: para la función sin(x)/x el punto 0 resulta problemático para el comando romberg, aunque se trate de una función continua en dicho punto.
- /* la función es continua */
plot2d(sin(x)/x,[x,-2,2]); - romberg(sin(x)/x,x,0,1);
- /* el comando quad_qags no tiene problemas en el origen */ quad_qags(sin(x)/x,x,0,1);
Comparemos en el caso de la integral de Gauss
- integrate(exp(-x^2),x,0,inf);
%,numer - romberg(exp(-x^2),x,0,100);
- quad_qags(exp(-x^2),x,0,100);
- quad_qags(exp(-x^2),x,0,1000);
En el caso de romberg el valor 100 no puede incrementarse de forma significativa, lo cual no ocurre con quad_qags
Algunas aplicaciones
áreas de figuras planas.
Para una función f(x)>0 integrable en [a,b] el valor de integrate(f(x),x,a,b) representa el "área bajo la curva" en el sentido que muestra el dibujo de la izquierda. Restando las correspondientes áreas (integrales) puede determinarse el área encerrada entre dos curvas g>f, que muestra la figura de la derecha.
Los códigos para crear los gráficos que aparecen más abajo forman parte de los ejemplos de la sección Gráficos con draw.

Volúmenes de sólidos de revolución.
Rotaciones en torno al eje 0Y, o al eje 0X, de regiones planas delimitadas por una función f como las que las imágenes muestran, generan sólidos de revolución cuyo volumen puede ser calculado usando las fórmulas integrales que aparecen.


áreas de sólidos de revolución.
También pueden ser calculada el área de superficie de revolución obtenida girando la curva definida por una función f(x)>0 en torno al eje 0X.

Integrales múltiples
El cálculo de integrales dobles (o triples) puede ser realizado, cuando el teorema de Fubini es aplicable, mediante integrales iteradas. Nos centraremos en el caso de integrales dobles para las que la intuición geométrica es más sencilla. Se trata de calcular integrales dobles
donde A y B son recintos planos similares a los que se muestran en las figuras siguientes, junto a las cuales se muestra el modelo de integral iterada a utilizar.








