1 @c English version 2013-08-03
3 * Introducción a simplification::
13 @node Introducción a simplification, Paquete absimp, simplification, simplification
14 @section Introducción a simplification
16 El directorio @code{maxima/share/simplification} contiene programas que
17 implementan algunas reglas y funciones para simplificar expresiones,
18 así como ciertas funciones no relacionadas con la simplificación.
25 @node Paquete absimp, Paquete facexp, Introducción a simplification, simplification
26 @section Paquete absimp
28 El paquete @code{absimp} contiene reglas para aplicar patrones que extienden
29 el sistema de reglas nativo de Maxima para las funciones @code{abs} y
30 @code{signum}, respetando las relaciones establecidas con la función
31 @code{assume} o con declaraciones tales como @code{modedeclare (m, even, n, odd)}
32 para enteros pares o impares.
34 En el paquete @code{absimp} se definen las funciones @code{unitramp} y
35 @code{unitstep} en términos de @code{abs} y @code{signum}.
37 La instrucción @code{load ("absimp")} carga este paquete y @code{demo (absimp)}
38 desarrolla una demostración sobre el uso del mismo.
49 (%i1) load ("absimp")$
53 (%i3) diff (abs (x), x);
67 @node Paquete facexp, Paquete functs, Paquete absimp, simplification
68 @section Paquete facexp
70 @c THIS IS VERY VAGUE. JUST WHAT DOES THIS DO?
71 El paquete @code{facexp} contiene varias funciones que le aportan al
72 usuario la posibilidad de estructurar expresiones controlando su
73 expansión. Esta capacidad es especialmente útil cuando la
74 expresión contiene variables con significado físico,
75 ya que se suele dar el caso de que la forma más sencilla para estas
76 expresiones se obtiene cuando se expanden respecto de estas variables
77 y luego se factoriza respecto de sus coeficientes. Si bien es cierto que
78 este procedimiento no es difícil de llevar a cabo con las
79 funciones estándar de Maxima, pueden ser necesarios algunos retoques
80 adicionales que sí pueden ser más difíciles
83 La función @code{facsum} y sus formas relacionadas proporcionan un
84 método para controlar la estructura de expresiones. La función
85 @code{collectterms} puede usarse para añadir dos o más
86 expresiones que ya hayan sido simplificadas de la forma indicada,
87 sin necesidad de volver a simplificar la expresión completa.
88 Esta función puede ser útil cuando las expresiones sean
91 @c CAN'T FIND ANY SUCH FILE "DIAGEVAL".
92 @c THERE ARE COMMENTED-OUT DEFNS OF FACTENEXPAND, FACEXPTEN, AND FACTORFACEXPTEN
93 @c IN FACEXP (AND NOWHERE ELSE).
94 @c COMMENTING OUT THIS TEXT FOR NOW.
95 @c Note: @code{factenexpand}, @code{facexpten}, and @code{factorfacexpten} are available only
96 @c after loading @code{diageval}. They are special functions used for tensor
99 La instrucción @code{load ("facexp")} carga este paquete y @code{demo (facexp)}
100 hace una demostración sobre su uso.
102 @c THIS IS VERY VAGUE. JUST WHAT DOES THIS DO?
103 @c SOME EXAMPLES WOULD HELP HERE
106 @deffn {Función} facsum (@var{expr}, @var{arg_1}, ..., @var{arg_n})
108 Devuelve una expresión equivalente a @var{expr}, la cual
109 depende de los argumentos @var{arg_1}, ..., @var{arg_n}, y
110 éstos pueden ser de cualquiera de las formas aceptables
111 para @code{ratvars}, o listas de estas formas. Si los
112 argumentos no son listas, la forma devuelta se expande
113 completamente con respecto de los argumentos, siendo los
114 coeficientes de tales argumentos factorizados. Estos
115 coeficientes no contienen a ninguno de los argumentos,
116 excepto quizás de una forma no racional.
118 En caso de que cualquiera de los argumentos sea una lista, entonces
119 todos ellos se combinan en una única lista, y en lugar de llamar
120 a @code{factor} para los coeficientes de los argumentos, @code{facsum}
121 se llama a sí misma utilizando esta nueva lista única
122 como lista de argumentos.
124 Es posible que se quiera utilizar @code{facsum} con respecto a
125 expresiones más complicadas, tales como @code{log (x + y)}. Estos
126 argumentos son también admisibles.
128 En ocasiones puede ser necesario obtener cualquiera de las formas
129 anteriores especificadas por sus operadores principales. Por ejemplo,
130 se puede querer aplicar @code{facsum} con respecto a todos los
131 @code{log}; en este caso, se puede incluir entre los argumentos bien
132 los @code{log} específicos que se quieran tratar de esta
133 manera, bien la expresión @code{operator (log)} o @code{'operator (log)}.
134 Si se quiere aplicar @code{facsum} a @var{expr} con respecto a los
135 operadores @var{op_1}, ..., @var{op_n}, se debe evaluar
136 @code{facsum (@var{expr}, operator (@var{op_1}, ..., @var{op_n}))}.
137 La forma @code{operator} puede aparecer también dentro de las
138 listas de argumentos.
140 Además, dándole valores a las variables opcionales @code{facsum_combine}
141 y @code{nextlayerfactor} se puede controlar el resultado de @code{facsum}.
144 @defvr {Variable global} nextlayerfactor
145 Valor por defecto: @code{false}
147 Si @code{nextlayerfactor} vale @code{true}, las llamadas recursivas de
148 @code{facsum} se aplican a los factores de la forma factorizada de los
149 coeficientes de los argumentos.
151 Si vale @code{false}, @code{facsum} se aplica a cada coeficiente como
152 un todo cada vez que se efectúen llamadas recursivas a @code{facsum}.
154 La inclusión del átomo @code{nextlayerfactor} en la lista de
155 argumentos de @code{facsum} tiene el mismo efecto que
156 @code{nextlayerfactor: true}, pero @i{solamente} para el siguiente
157 nivel de la expresión. Puesto que @code{nextlayerfactor} toma
158 siempre uno de los valores @code{true} o @code{false}, debe aparecer
159 comentado (comilla simple) cada vez que aparezca en la lista de
160 argumentos de @code{facsum}.
163 @defvr {Variable global} facsum_combine
164 Valor por defecto: @code{true}
166 La variable @code{facsum_combine} controla la forma del resultado final
167 devuelto por @code{facsum} si su argumento es un cociente de polinomios.
168 Si @code{facsum_combine} vale @code{false}, el resultado será una suma
169 completamente expandida, pero si vale @code{true}, la expresión devuelta
170 es un cociente de polinomios.
172 @c aqu'i falta un p'arrafo.
176 @deffn {Función} factorfacsum (@var{expr}, @var{arg_1}, ... @var{arg_n})
177 Devuelve una expresión equivalente a @var{expr} obtenida aplicando
178 @code{facsum} a los factores de @var{expr}, de argumentos
179 @var{arg_1}, ... @var{arg_n}. Si alguno de los factores de @var{expr} se
180 eleva a una potencia, tanto el factor como el exponente se procesarán de
184 @deffn {Función} collectterms (@var{expr}, @var{arg_1}, @dots{}, @var{arg_n})
185 Si algunas expresiones fueron ya simplificadas con @code{facsum}, @code{factorfacsum},
186 @code{factenexpand}, @code{facexpten} o @code{factorfacexpten}, debiendo ser
187 luego sumadas, puede ser conveniente combinarlas utilizando la función
188 @code{collecterms}, la cual admite como argumentos todos aquéllos que se
189 puedan pasar a las anteriormente citadas funciones, con la excepción de
190 @code{nextlayerfactor}, que no tiene efecto alguno sobre @code{collectterms}.
191 La ventaja de @code{collectterms} es que devuelve una forma similar a la de
192 @code{facsum}, pero debido a que suma expresiones que ya han sido previamente
193 procesadas, no necesita repetir esta operación, lo cual
194 resulta ser especialmente útil cuando las expresiones a sumar son muy
206 @node Paquete functs, Paquete ineq, Paquete facexp, simplification
207 @section Paquete functs
209 @deffn {Función} rempart (@var{expr}, @var{n})
210 Elimina la parte @var{n} de la expresión @var{expr}.
212 Si @var{n} es una lista de la forma @code{[@var{l}, @var{m}]}, entonces
213 las partes desde @var{l} a @var{m} serán eliminadas.
215 Para hacer uso de esta función ejecutar @code{load("functs")}.
218 @deffn {Función} wronskian ([@var{f_1}, ..., @var{f_n}], @var{x})
219 Devuelve la matriz wronskiana de las expresiones @var{f_1}, ..., @var{f_n}
220 dependeientes de la variable @var{x}.
221 El determinante de la matriz wronskiana es el determinante wronskiano de
222 la lista de expresiones.
224 Para hacer uso de esta función ejecutar @code{load("functs")}.
230 @c wronskian([f(x), g(x)],x);
233 (%i1) load("functs")$
234 (%i2) wronskian([f(x), g(x)],x);
235 (%o2) matrix([f(x),g(x)],['diff(f(x),x,1),'diff(g(x),x,1)])
239 @c adjoint already described in doc/info/Matrices.texi
241 @deffn {Función} tracematrix (@var{M})
242 Devuelve la traza (suma de los elementos de la diagonal) de la matriz @var{M}.
244 Para hacer uso de esta función ejecutar @code{load("functs")}.
247 @deffn {Función} rational (@var{z})
248 Multiplica el numerador y denominador de @var{z} por el complejo conjugado
249 del denominador, racionalizando así el denominador.
250 Devuelve la expresión canónica racional (canonical rational expression,
251 CRE) si el argumento @var{z} es de esta forma, en caso contrario devuelve una
252 expresión en formato común.
254 Para hacer uso de esta función ejecutar @code{load("functs")}.
257 @c uprobe calls ?uprobe and assumes file is a list => obsolete, not common lisp
259 @c kronecker superseded by kron_delta in src/nset.lisp
261 @deffn {Función} nonzeroandfreeof (@var{x}, @var{expr})
262 Devuelve @code{true} si @var{expr} es diferente de cero y
263 @code{freeof (@var{x}, @var{expr})} devuelve @code{true}.
264 En caso contrario devuelve @code{false}.
266 Para hacer uso de esta función ejecutar @code{load("functs")}.
269 @deffn {Función} linear (@var{expr}, @var{x})
270 Si @var{expr} es una expresión de la forma @code{@var{a}*@var{x} + @var{b}},
271 siendo @var{a} no nulo y los argumentos @var{a} y @var{b} no contienen a @var{x},
272 @code{linear} devuelve una lista con tres ecuaciones, una por cada variable
273 @var{b}, @var{a} y @var{x}. Si no se cumple la condición anterior,
274 @code{linear} devuelve @code{false}.
276 Para hacer uso de esta función ejecutar @code{load("functs")}.
282 @c linear ((1 - w)*(1 - x)*z, z);
283 @c linear (cos(u - v) + cos(u + v), u);
286 (%i1) load ("antid");
287 (%o1) /usr/share/maxima/5.29.1/share/integration/antid.mac
288 (%i2) linear ((1 - w)*(1 - x)*z, z);
289 (%o2) [bargumentb = 0, aargumenta = (w - 1) x - w + 1, xargumentx = z]
290 (%i3) linear (cos(u - v) + cos(u + v), u);
295 @deffn {Función} gcdivide (@var{p}, @var{q})
296 Si la variable opcional @code{takegcd} vale @code{true}, que es su valor por defecto,
297 @code{gcdivide} divide los polinomios @var{p} y @var{q} por su
298 máximo común divisor y devuelve el cociente de los resultados.
299 @code{gcdivide} hace una llamada a la función @code{ezgcd} para
300 dividir los polinomios por su máximo común divisor.
302 Si @code{takegcd} vale @code{false}, @code{gcdivide} devuelve
303 el cociente @code{@var{p}/@var{q}}.
305 Para hacer uso de esta función ejecutar @code{load("functs")}.
307 Véanse también @code{ezgcd}, @code{gcd}, @code{gcdex} y
313 (%i1) load("functs")$
315 (%i2) p1:6*x^3+19*x^2+19*x+6;
317 (%o2) 6 x + 19 x + 19 x + 6
318 (%i3) p2:6*x^5+13*x^4+12*x^3+13*x^2+6*x;
320 (%o3) 6 x + 13 x + 12 x + 13 x + 6 x
321 (%i4) gcdivide(p1, p2);
328 (%i6) gcdivide(p1, p2);
330 6 x + 19 x + 19 x + 6
331 (%o6) ----------------------------------
333 6 x + 13 x + 12 x + 13 x + 6 x
343 @deffn {Función} arithmetic (@var{a}, @var{d}, @var{n})
344 Devuelve el @var{n}-ésimo término de la progresión aritmética
345 @code{@var{a}, @var{a} + @var{d}, @var{a} + 2*@var{d}, ..., @var{a} + (@var{n} - 1)*@var{d}}.
347 Para hacer uso de esta función ejecutar @code{load("functs")}.
350 @deffn {Función} geometric (@var{a}, @var{r}, @var{n})
351 Devuelve el @var{n}-ésimo término de la progresión geométrica
352 @code{@var{a}, @var{a}*@var{r}, @var{a}*@var{r}^2, ..., @var{a}*@var{r}^(@var{n} - 1)}.
354 Para hacer uso de esta función ejecutar @code{load("functs")}.
357 @deffn {Función} harmonic (@var{a}, @var{b}, @var{c}, @var{n})
358 Devuelve el @var{n}-ésimo término de la progresión armónica
359 @code{@var{a}/@var{b}, @var{a}/(@var{b} + @var{c}), @var{a}/(@var{b} + 2*@var{c}), ..., @var{a}/(@var{b} + (@var{n} - 1)*@var{c})}.
361 Para hacer uso de esta función ejecutar @code{load("functs")}.
364 @deffn {Función} arithsum (@var{a}, @var{d}, @var{n})
365 Devuelve la suma de la progresión aritmética desde hasta el @var{n}-ésimo término.
367 Para hacer uso de esta función ejecutar @code{load("functs")}.
370 @deffn {Función} geosum (@var{a}, @var{r}, @var{n})
371 Devuelve la suma de la sucesión geométrica hasta el @var{n}-ésimo término.
372 Si @var{n} es infinito (@code{inf}) la suma será finita sólo si el valor absoluto de
373 @var{r} es menor que 1.
375 Para hacer uso de esta función ejecutar @code{load("functs")}.
378 @deffn {Función} gaussprob (@var{x})
379 Devuelve la función de densidad de probabilidad,
380 normal @code{%e^(-@var{x}^2/2) / sqrt(2*%pi)}.
382 Para hacer uso de esta función ejecutar @code{load("functs")}.
385 @deffn {Función} gd (@var{x})
386 Devuelve la función de Gudermann,
387 @code{2*atan(%e^x)-%pi/2}.
389 Para hacer uso de esta función ejecutar @code{load("functs")}.
392 @deffn {Función} agd (@var{x})
393 Devuelve la inversa de la función de Gudermann,
394 @code{log (tan (%pi/4 + x/2))}.
396 Para hacer uso de esta función ejecutar @code{load("functs")}.
399 @deffn {Función} vers (@var{x})
400 Devuelve @code{1 - cos (x)}.
402 Para hacer uso de esta función ejecutar @code{load("functs")}.
405 @deffn {Función} covers (@var{x})
406 Devuelve @code{1 - sin (@var{x})}.
408 Para hacer uso de esta función ejecutar @code{load("functs")}.
411 @deffn {Función} exsec (@var{x})
412 Devuelve @code{sec (@var{x}) - 1}.
414 Para hacer uso de esta función ejecutar @code{load("functs")}.
417 @deffn {Función} hav (@var{x})
418 Devuelve @code{(1 - cos(x))/2}.
420 Para hacer uso de esta función ejecutar @code{load("functs")}.
423 @c REDUNDANT WITH BINOMIAL COEFFICIENT; CUT IT ??
424 @deffn {Función} combination (@var{n}, @var{r})
425 Calcula el número de combinaciones de @var{n} objetos
426 tomados de @var{r} en @var{r}.
428 Para hacer uso de esta función ejecutar @code{load("functs")}.
431 @c REDUNDANT WITH PERMUTATIONS FUNCTION IN NSET; CUT IT ??
432 @deffn {Función} permutation (@var{n}, @var{r})
433 Calcula el número de permutaciones de @var{r}, seleccionados
434 de un conjunto de @var{n}.
436 Para hacer uso de esta función ejecutar @code{load("functs")}.
447 @node Paquete ineq, Paquete rducon, Paquete functs, simplification
448 @section Paquete ineq
450 El paquete @code{ineq} contiene reglas de simplificación para desigualdades
452 Una sesión de ejemplo:
456 @c a>=4; /* a sample inequality */
457 @c (b>c)+%; /* add a second, strict inequality */
458 @c 7*(x<y); /* multiply by a positive number */
459 @c -2*(x>=3*z); /* multiply by a negative number */
460 @c (1+a^2)*(1/(1+a^2)<=1); /* Maxima knows that 1+a^2 > 0 */
461 @c assume(x>0)$ x*(2<3); /* assuming x>0 */
462 @c a>=b; /* another inequality */
463 @c 3+%; /* add something */
464 @c %-3; /* subtract it out */
465 @c a>=c-b; /* yet another inequality */
466 @c b+%; /* add b to both sides */
467 @c %-c; /* subtract c from both sides */
468 @c -%; /* multiply by -1 */
469 @c (z-1)^2>-2*z; /* determining truth of assertion */
470 @c expand(%)+2*z; /* expand this and add 2*z to both sides */
475 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
476 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
477 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
478 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
479 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
480 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
481 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
482 Warning: Putting rules on '+' or '*' is inefficient, and may not work.
483 (%i2) a>=4; /* a sample inequality */
485 (%i3) (b>c)+%; /* add a second, strict inequality */
487 (%i4) 7*(x<y); /* multiply by a positive number */
489 (%i5) -2*(x>=3*z); /* multiply by a negative number */
491 (%i6) (1+a^2)*(1/(1+a^2)<=1); /* Maxima knows that 1+a^2 > 0 */
494 (%i7) assume(x>0)$ x*(2<3); /* assuming x>0 */
496 (%i8) a>=b; /* another inequality */
498 (%i9) 3+%; /* add something */
500 (%i10) %-3; /* subtract it out */
502 (%i11) a>=c-b; /* yet another inequality */
504 (%i12) b+%; /* add b to both sides */
506 (%i13) %-c; /* subtract c from both sides */
507 (%o13) - c + b + a >= 0
508 (%i14) -%; /* multiply by -1 */
509 (%o14) c - b - a <= 0
510 (%i15) (z-1)^2>-2*z; /* determining truth of assertion */
512 (%o15) (z - 1) > - 2 z
513 (%i16) expand(%)+2*z; /* expand this and add 2*z to both sides */
520 Debe tenerse cuidado con el uso de paréntesis que incluyan desigualdades;
521 si se escribe @code{(A > B) + (C = 5)} el resultado es @code{A + C > B + 5},
522 pero @code{A > B + C = 5} es un error sintáctico y @code{(A > B + C) = 5}
523 es una cosa completamente diferente.
525 Ejecútese @code{disprule (all)} para ver la lista completa de las
528 Maxima preguntará al usuario cuando desconozca el signo de una cantidad que
529 multiplica a una desigualdad.
531 Los fallos más comunes son:
539 Otro problema es el producto de una desigualdad por cero.
540 Si se escribe @code{x*@var{some_inequality}} y Maxima pregunta por
541 el signo de @code{x} y se responde que vale @code{zero} (o @code{z}),
542 el programa devuelve @code{x*@var{some_inequality}} sin hacer uso de la
543 información de que @code{x} es 0. En tal caso se debería
544 escribir @code{ev (%, x: 0)}, ya que la base de datos sólo será utilizada
545 para fines comparativos y no para evaluar @code{x}.
547 El usuario puede apreciar que las respuestas son más lentas al cargarse este paquete,
548 ya que el simplificador deberá examinar más reglas que cuando no se hace uso del
549 paquete, por lo que puede ser conveniente borrar estas reglas cuando ya no se haga
550 uso de ellas. Ejecútese @code{kill (rules)} para eliminar todas las reglas
551 (incluidas las definidas por el usuario); también es posible eliminar
552 parte de ellas o utilizar @code{remrule} sobre una reglas específica.
554 Nótese que si se carga este paquete después de haber definido otras reglas
555 de igual nombre,se borrarán las antiguas. Las reglas de este paquete son:
556 @code{*rule1}, ..., @code{*rule8},
557 @code{+rule1}, ..., @code{+rule18},
558 debiéndose encerrar entre comillas el nombre de la reglas para referenciarse a ellas,
559 como en @code{remrule ("+", "+rule1")} para eliminar la primera regla sobre @code{"+"},
560 o @code{disprule ("*rule2")} para mostrar la definición de la segunda regla
571 @node Paquete rducon, Paquete scifac, Paquete ineq, simplification
572 @section Paquete rducon
576 @deffn {Función} reduce_consts (@var{expr})
577 Sustituye subexpresiones constantes de @var{expr} por átomos,
578 guardando la definición de todos ellos en la lista de ecuaciones
579 @code{const_eqns} y devolviendo el expresión @var{expr} ya
580 modificada. Se consideran partes constantes de @var{expr} aquellas
581 que devuelven @code{true} cuando se les aplica la función @code{constantp},
582 por lo que antes de llamar a @code{reduce_consts} se debe ejecutar
585 declare ([@var{objetos a los que se quiera dar la propiedad de ser constantes}], constant)$
588 para crear la base de datos de las cantidades constantes presentes en
591 Si se pretende generar código Fortran después de estos cálculos
592 simbólicos, una de las primeras secciones del código debe ser el
593 cálculo de las constantes. Para generar este segmento de código hacer
596 map ('fortran, const_eqns)$
599 Junto a @code{const_eqns}, otras variables que afectan a @code{reduce_consts} son:
601 @code{const_prefix} (Valor por defecto: @code{xx}) es la cadena de caracteres utilizada como
602 prefijo para todos los símbolos generados por @code{reduce_consts} para
603 representar subexpresiones constantes.
605 @code{const_counter} (Valor por defecto: 1) es el índice entero utilizado
606 para generar los símbolos que representen a las subexpresiones
607 constantes encontradas por @code{reduce_consts}.
609 La instrucción @code{load ("rducon")} carga esta función y @code{demo (rducon)}
610 hace una demostración sobre su uso.
619 @node Paquete scifac, Paquete sqdnst, Paquete rducon, simplification
620 @section Paquete scifac
623 @deffn {Función} gcfac (@var{expr})
624 Es una función de factorización que intenta aplicar la misma heurística
625 que los humanos cuando tratan de hacer las expresiones más simples, limitándose
626 a la factorización de monomios. En caso de sumas, @code{gcfac} hace lo siguiente:
630 Factoriza los enteros.
632 Factoriza las potencias mayores de los términos que aparecen como
633 coeficientes, independientemente de su complejidad.
635 Utiliza (1) y (2) en la factorización de pares de términos adyacentes.
637 Aplica estas técnicas repetida y recursivamente hasta que la
638 expresión deje de sufrir cambios.
641 En general, el apartado (3) no hace una factorización óptima debido a la
642 naturaleza combinatoria y compleja de encontrar cuál de todas las ordenaciones
643 posibles de los pares da lugar a la expresión más compacta.
645 La instrucción @code{load ("scifac")} carga esta función y @code{demo (scifac)}
646 hace una demostración sobre su uso.
654 @node Paquete sqdnst, , Paquete scifac, simplification
655 @section Paquete sqdnst
657 @deffn {Función} sqrtdenest (@var{expr})
658 Reduce expresiones en las que se encuentren raíces cuadradas anidadas,
659 siempre que sea posible
665 @c sqrt(sqrt(3)/2+1)/sqrt(11*sqrt(2)-12);
669 (%i1) load ("sqdnst")$
670 (%i2) sqrt(sqrt(3)/2+1)/sqrt(11*sqrt(2)-12);
674 (%o2) ---------------------
675 sqrt(11 sqrt(2) - 12)
685 A veces conviene aplicar @code{sqrtdenest} más de una vez, como en el caso
686 @code{(19601-13860 sqrt(2))^(7/4)}.
688 La sentencia @code{load ("sqdnst")} carga esta función.