1 @c English version 2013-06-15
3 * Funciones y variables para to_poly_solve::
6 @node Funciones y variables para to_poly_solve, , to_poly_solve, to_poly_solve
7 @section Funciones y variables para to_poly_solve
9 Los paquetes @code{to_poly} y @code{to_poly_solve} son experimentales,
10 siendo posible que las especificaciones de sus funciones puedan
11 cambiar en el futuro, o que algunas de estas funciones puedan ser
12 incorporadas a otras partes de Maxima.
14 Los paquetes @code{to_poly} y @code{to_poly_solve}, junto con su documentación,
15 fue escrito por Barton Willis de la Universidad de Nebraska en Kearney.
22 @deffn {Operador} %and
24 @fnindex Conjunción lógica
27 El operador @code{%and} es una conjunción lógica. Maxima simplifica
28 una expresión @code{%and} a @code{true}, @code{false} o a una expresión
29 lógicamente equivalente, pero simplificada. El operador @code{%and}
30 es asociativo, conmutativo e idempotente. Así, cuando @code{%and}
31 devuelva una forma nominal, sus argumentos no serán redundantes; por ejemplo,
34 (%i1) a %and (a %and b);
38 Si uno de los argumentos de la conjunción es la negación de otro argumento,
39 @code{%and} devuelve @code{false}:
46 Si cualquiera de los argumentos vale @code{false}, la conjunción devuelve
47 @code{false}, incluso cuando haya algún otro argumento que sea una
48 expresión no booleana; por ejemplo,
55 Los argumentos de la expresión @code{%and} que sean inecuaciones se
56 reducen con la simplificación de Fourier; el método que se
57 aplica dispone de un pre-procesador que convierte algunas, pero no
58 todas, las inecuaciones no lineales a lineales. Por ejemplo, el
59 método de simplificación de Fourier simplifica @code{abs(x) + 1 > 0}
63 (%i4) (x < 1) %and (abs(x) + 1 > 0);
69 @item La variable opcional @code{prederror} no altera la
70 simplificación de las expresiones @code{%and}.
72 @item Para evitar errores en la precedencia de las operaciones,
73 se recomienda utilizar paréntesis en las expresiones combinadas
74 en las que aparezcan los operadores @code{%and}, @code{%or} y @code{not} .
76 @item Los operadores @code{and} y @code{or}, tal como están
77 programados en Maxima, no conocen las propiedades asociativa
82 @b{Limitaciones} La conjunción @code{%and} simplifica inecuaciones
83 @i{locamente}, no @i{globalmente}, lo que significa que conjunciones tales como
86 (%i5) (x < 1) %and (x > 1);
87 (%o5) (x > 1) %and (x < 1)
90 @i{no} simplifican a @code{false}. Además, las rutinas de eliminación de Fourier
91 ignoran los hechos almacenados en la base de datos.
96 (%i7) (x > 1) %and (x > 2);
97 (%o7) (x > 1) %and (x > 2)
100 Por último, las inecuaciones no lineales que no se puedan reducir de
101 manera sencilla a formas lineales, no se simplifican.
103 No está soportada la distributividad de @code{%and} respecto de @code{%or},
104 ni la negación respecto de @code{%and}.
106 Para hacer uso de este operador, ejecútese @code{load("to_poly_solve")}.
108 Véanse también @code{%or}, @code{%if}, @code{and}, @code{or} y @code{not}.
117 @deffn {Operador} %if ( @var{bool}, @var{a}, @var{b})
119 @fnindex Evaluación condicionada
122 El operador @code{%if} es un condicional. La condición @var{bool}
123 debe tomar un valor lógico; cuando sea @code{true}, se devolverá
124 el segundo argumento, y cuando valga @code{false}, el segundo. En
125 cualquier otro caso, se obtiene una forma nominal.
127 En Maxima, las expresiones con desigualdades o igualdades no adquieren
128 valores lógicos; por ejemplo, @math{5 < 6} no se simplifica a @code{true},
129 ni @math{5 = 6} @code{false}. Sin embargo, en la condición de una
130 sentencia @code{%if}, Maxima intenta determinar el valor lógico
131 de la expresión de forma automática. Véase un ejemplo:
134 (%i1) f : %if(x # 1, 2, 8);
135 (%o1) %if(x - 1 # 0, 2, 8)
136 (%i2) [subst(x = -1,f), subst(x=1,f)];
140 Si en la condición aparece una inecuación, Maxima la
141 reduce con una simplificación de Fourier.
145 @item Si la condición no se reduce a un valor lógico, Maxima devuelve
152 @item El operador @code{if} de Maxima es n-ario, pero el operador @code{%if} no lo es.
155 Por último, las inecuaciones no lineales que no se puedan reducir de
156 manera sencilla a formas lineales, no se simplifican.
158 Para hacer uso de este operador, ejecútese @code{load("to_poly_solve")}.
165 @deffn {Operador} %or
167 @fnindex Disyunción lógica
170 El operador @code{%or} es una disyunción lógica. Maxima simplifica
171 una expresión @code{%or} a @code{true}, @code{false} o a una expresión
172 lógicamente equivalente, pero simplificada. El operador @code{%or}
173 es asociativo, conmutativo e idempotente. Así, cuando @code{%or}
174 devuelva una forma nominal, sus argumentos no serán redundantes; por ejemplo,
177 (%i1) a %or (a %or b);
181 Si uno de los argumentos de la disyunción es la negación de otro argumento,
182 @code{%or} devuelve @code{true}:
189 Si cualquiera de los argumentos vale @code{true}, la disyunción devuelve
190 @code{true}, incluso cuando haya algún otro argumento que sea una
191 expresión no booleana; por ejemplo,
198 Los argumentos de la expresión @code{%or} que sean inecuaciones se
199 reducen con la simplificación de Fourier. Por ejemplo, el
200 método de simplificación de Fourier simplifica @code{abs(x) + 1 > 0}
204 (%i4) (x < 1) %or (abs(x) + 1 > 0);
210 @item La variable opcional @code{prederror} no altera la
211 simplificación de las expresiones @code{%or}.
213 @item Para evitar errores en la precedencia de las operaciones,
214 se recomienda utilizar paréntesis en las expresiones combinadas
215 en las que aparezcan los operadores @code{%and}, @code{%or} y @code{not} .
217 @item Los operadores @code{and} y @code{or}, tal como están
218 programados en Maxima, no conocen las propiedades asociativa
223 @b{Limitaciones} La conjunción @code{%or} simplifica inecuaciones
224 @i{locamente}, no @i{globalmente}, lo que significa que disyunciones tales como
227 (%i1) (x < 1) %or (x >= 1);
228 (%o1) (x > 1) %or (x >= 1)
231 @i{no} simplifican a @code{true}. Además, las rutinas de eliminación de Fourier
232 ignoran los hechos almacenados en la base de datos.
237 (%i3) (x > 1) %and (x > 2);
238 (%o3) (x > 1) %and (x > 2)
241 Por último, las inecuaciones no lineales que no se puedan reducir de
242 manera sencilla a formas lineales, no se simplifican.
244 No está soportada la distributividad de @code{%or} respecto de @code{%and},
245 ni la negación respecto de @code{%or}.
247 Para hacer uso de este operador, ejecútese @code{load("to_poly_solve")}.
249 Véanse también @code{%and}, @code{%if}, @code{and}, @code{or} y @code{not}.
257 @deffn {Función} complex_number_p (@var{x})
259 La función @code{complex_number_p} devuelve @code{true} si su
260 argumento es de cualquiera de las formas @code{a + %i * b}, @code{a}, @code{%i b} o
261 @code{%i}, donde @code{a} y @code{b} son racionales o decimales en coma flotante,
262 de precisión doble o arbitraria (@i{bigfloats}); para cualesquiera otros argumentos,
263 @code{complex_number_p} devuelve @code{false}.
268 (%i1) map('complex_number_p,[2/3, 2 + 1.5 * %i, %i]);
269 (%o1) [true, true, true]
270 (%i2) complex_number_p((2+%i)/(5-%i));
272 (%i3) complex_number_p(cos(5 - 2 * %i));
276 Véase también @code{isreal_p}.
278 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
286 @deffn {Función} compose_functions (@var{l})
288 La función @code{compose_functions(l)} devuelve una expresión lambda
289 que es la composición de las funciones presentes en la lista @var{l}.
290 Las funciones se aplican de derecha a izquierda.
295 (%i1) compose_functions([cos, exp]);
297 (%o1) lambda([%g151], cos(%e ))
303 Si la lista está vacía devuelve la función identidad:
306 (%i3) compose_functions([]);
307 (%o3) lambda([%g152], %g152)
314 @item Cuando Maxima detecta que un miembro de la lista no es un
315 símbolo o expresión lambda, la función
316 @code{funmake} (no @code{compose_functions}) muestra un mensaje de
319 (%i5) compose_functions([a < b]);
321 funmake: first argument must be a symbol, subscripted symbol,
322 string, or lambda expression; found: a < b
323 #0: compose_functions(l=[a < b])(to_poly_solve.mac line 40)
324 -- an error. To debug this try: debugmode(true);
327 @item Para evitar conflictos de nombres, la variable independiente se determina
328 con la función @code{new_variable}:
330 (%i6) compose_functions([%g0]);
331 (%o6) lambda([%g154], %g0(%g154))
332 (%i7) compose_functions([%g0]);
333 (%o7) lambda([%g155], %g0(%g155))
335 Aunque las variables dependientes sean diferentes, Maxima es capaz de
336 determinar que las expresiones lambda son semánticamente equivalentes:
338 (%i8) is(equal(%o6,%o7));
343 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
351 @deffn {Función} dfloat (@var{x})
353 La función @code{dfloat} es similar a @code{float}, pero @code{dfloat}
354 aplica @code{rectform} cuando @code{float} no puede evaluar a un número
355 decimal de coma flotante de doble precisión. Ejemplo:
358 (%i1) float(4.5^(1 + %i));
361 (%i2) dfloat(4.5^(1 + %i));
362 (%o2) 4.48998802962884 %i + .3000124893895671
368 @item La forma rectangular de una expresión puede no ser la
369 más adecuada para cálculos numéricos
371 @item El identificador @code{float} es al mismo tiempo una variable opcional,
372 cuyo valor por defecto es @code{false} y el nombre de una función.
375 Véanse también @code{float} y @code{bfloat}.
377 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
386 @deffn {Función} elim (@var{l}, @var{x})
388 La función @code{elim} elimina las variables que se indican en el conjunto
389 o lista @code{x} del conjunto o lista de ecuaciones en @code{l}. Cada
390 elemento de @code{x} debe ser un símbolo, mientras que los
391 elementos de @code{l} pueden ser ecuaciones o expresiones que se suponen
394 La función @code{elim} devuelve una lista formada por dos listas; la
395 primera está formada por las expresiones con las variables eliminadas y
396 la segunda es la lista de pivotes o, en otras palabras, es la lista de
397 expresiones que @code{elim} ha utilizado para proceder con la eliminación.
401 Eliminación entre ecuaciones lineales. Eliminando @code{x} e @code{y}
402 se obtiene una única ecuación @code{2 z - 7 = 0}; las ecuaciones
403 @code{y + 7 = 0} y @code{z - z + 1 = 1} se han utilizado como pivotes.
406 (%i1) elim(set(x + y + z = 1, x - y - z = 8, x - z = 1),
408 (%o1) [[2 z - 7], [y + 7, z - x + 1]]
411 Eliminando las tres variables de estas ecuaciones se triangulariza el sistema
415 (%i2) elim(set(x + y + z = 1, x - y - z = 8, x - z = 1),
417 (%o2) [[], [2 z - 7, y + 7, z - x + 1]]
420 Las ecuaciones no necesitan ser lineales:
423 (%i3) elim(set(x^2 - 2 * y^3 = 1, x - y = 5), [x,y]);
425 (%o3) [[], [2 y - y - 10 y - 24, y - x + 5]]
428 El usuario no puede controlar el orden en el que se eliminan las
429 variables. El algoritmo utiliza una heurística con
430 la que intenta escoger el mejor pivote y el mejor orden de eliminación.
436 @item Al contrario que la función relacionada @code{eliminate}, la
437 función @code{elim} no llama a la función @code{solve} cuando el
438 número de ecuaciones iguala al de variables.
440 @item La función @code{elim} trabaja aplicando resultantes; la variable
441 opcional @code{resultant} determina qué algoritmo va a utilizar Maxima.
442 Con @code{sqfr}, Maxima factoriza cada resultante y suprime ceros múltiples.
444 @item @code{elim} triangulariza un conjunto de ecuaciones polinómicas no
445 lineales; el conjunto solución del conjunto triangularizado puede ser mayor
446 que el conjunto de soluciones del conjunto no triangularizado, por lo que
447 las ecuaciones triangularizadas pueden tener soluciones falsas.
451 Véanse también @code{elim_allbut}, @code{eliminate_using}, @code{eliminate}
454 Para hacer uso de esta función, ejecútese @code{load("to_poly")}.
464 @deffn {Función} elim_allbut (@var{l}, @var{x})
466 Es similar a @code{elim}, excepto por el hecho de que elimina todas las variables
467 que aparecen en la lista de ecuaciones @code{l} que no están en @code{x}.
472 (%i1) elim_allbut([x+y = 1, x - 5*y = 1],[]);
473 (%o1) [[], [y, y + x - 1]]
474 (%i2) elim_allbut([x+y = 1, x - 5*y = 1],[x]);
475 (%o2) [[x - 1], [y + x - 1]]
478 Para hacer uso de esta función, ejecútese @code{load("to_poly")}.
480 Véanse también @code{elim}, @code{eliminate_using}, @code{eliminate}
489 @deffn {Función} eliminate_using (@var{l}, @var{e}, @var{x})
491 Elmina el símbolo @code{x} de la lista o conjunto de ecuaciones
492 @code{l} haciendo uso del pivote @code{e}.
497 (%i1) eq : [x^2 - y^2 - z^3 , x*y - z^2 - 5, x - y + z];
499 (%o1) [- z - y + x , - z + x y - 5, z - y + x]
500 (%i2) eliminate_using(eq,first(eq),z);
502 (%o2) @{y + (1 - 3 x) y + 3 x y - x - x ,
504 y - x y + 13 x y - 75 x y + x + 125@}
505 (%i3) eliminate_using(eq,second(eq),z);
507 (%o3) @{y - 3 x y + x + 5, y - x y + 13 x y - 75 x y + x
509 (%i4) eliminate_using(eq, third(eq),z);
511 (%o4) @{y - 3 x y + x + 5, y + (1 - 3 x) y + 3 x y - x - x @}
514 Para hacer uso de esta función, ejecútese @code{load("to_poly")}.
516 Véanse también @code{elim}, @code{elim_allbut}, @code{eliminate}
526 @deffn {Función} fourier_elim ([@var{eq1}, @var{eq2}, ...], [@var{var1}, @var{var}, ...])
528 La instrucción @code{fourier_elim([eq1,eq2,...], [var1,var2,...]} aplica el
529 algoritmo de eliminación de Fourier para resolver el sistema de inecuaciones
530 lineales @code{[eq1,eq2,...]} respecto de las variables @code{[var1,var2,...]}.
535 (%i1) fourier_elim([y-x < 5, x - y < 7, 10 < y],[x,y]);
536 (%o1) [y - 5 < x, x < y + 7, 10 < y]
537 (%i2) fourier_elim([y-x < 5, x - y < 7, 10 < y],[y,x]);
538 (%o2) [max(10, x - 7) < y, y < x + 5, 5 < x]
541 Eliminando primero respecto de @math{x} y luego respecto de @math{y},
542 se obtienen límites inferior y superior para @math{x}
543 que dependen de @math{y}, y límites numéricos para @math{y}.
544 Si se eliminan en orden inverso, se obtienen los límites
545 de @math{y} en función de @math{x}, y los de @math{x} son números.
547 De ser necesario, @code{fourier_elim} devuelve una disyunción de listas
551 (%i3) fourier_elim([x # 6],[x]);
552 (%o3) [x < 6] or [6 < x]
555 Si no existe solución, @code{fourier_elim} devuelve @code{emptyset},
556 y si la solución son todos los reales, @code{fourier_elim} devuelve
560 (%i4) fourier_elim([x < 1, x > 1],[x]);
562 (%i5) fourier_elim([minf < x, x < inf],[x]);
566 En caso de que las inecuaciones no sean lineales, @code{fourier_elim}
567 devuelve una lista de inecuaciones simplificadas:
570 (%i6) fourier_elim([x^3 - 1 > 0],[x]);
572 (%o6) [1 < x, x + x + 1 > 0] or [x < 1, - (x + x + 1) > 0]
573 (%i7) fourier_elim([cos(x) < 1/2],[x]);
574 (%o7) [1 - 2 cos(x) > 0]
577 En lugar de una lista de inecuaciones, el primer argumento pasado a
578 @code{fourier_elim} puede ser una conjunción o disyunción lógica.
581 (%i8) fourier_elim((x + y < 5) and (x - y >8),[x,y]);
583 (%o8) [y + 8 < x, x < 5 - y, y < - -]
585 (%i9) fourier_elim(((x + y < 5) and x < 1) or (x - y >8),[x,y]);
586 (%o9) [y + 8 < x] or [x < min(1, 5 - y)]
589 La función @code{fourier_elim} soporta los operadores de desigualdad
590 @code{<}, @code{<=}, @code{>}, @code{>=}, @code{#} y @code{=}.
592 La rutina de eliminación de Fourier dispone de un preprocesador que
593 convierte algunas inecuaciones no lineales formadas con las funciones
594 del valor absoluto, mínimo y máximo a inecuaciones
595 lineales. Además, el preprocesador admite algunas expresiones
596 que son productos o cocientes de términos lineales:
599 (%i10) fourier_elim([max(x,y) > 6, x # 8, abs(y-1) > 12],[x,y]);
600 (%o10) [6 < x, x < 8, y < - 11] or [8 < x, y < - 11]
601 or [x < 8, 13 < y] or [x = y, 13 < y] or [8 < x, x < y, 13 < y]
603 (%i11) fourier_elim([(x+6)/(x-9) <= 6],[x]);
604 (%o11) [x = 12] or [12 < x] or [x < 9]
605 (%i12) fourier_elim([x^2 - 1 # 0],[x]);
606 (%o12) [- 1 < x, x < 1] or [1 < x] or [x < - 1]
609 Para hacer uso de esta función, ejecútese @code{load("fourier_elim")}.
619 @deffn {Función} isreal_p (@var{e})
621 El predicado @code{isreal_p} devuelve @code{true} si @code{e} representa un
622 número real y @code{false} si no representa un punto de la recta; en cualquier
623 otro caso devuelve una forma nominal.
626 (%i1) map('isreal_p, [-1, 0, %i, %pi]);
627 (%o1) [true, true, false, true]
630 Las variables de Maxima se interpretan como números reales:
637 La función @code{isreal_p} consulta los hechos almacenados en la base de datos:
639 (%i3) declare(z,complex)$
645 Con frecuencia, @code{isreal_p} devuelve una forma nominal cuando debería
646 devolver @code{false}; por ejemplo, la función logarítmica no toma valores
647 reales en toda la recta real, por lo que @code{isreal_p(log(x))} debería
648 devolver @code{false}, sin embargo:
651 (%i5) isreal_p(log(x));
652 (%o5) isreal_p(log(x))
655 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
657 Véase también @code{complex_number_p}.
659 La función @code{isreal_p} es experimental; sus
660 especificaciones pueden cambiar y su funcionalidad puede incorporarse a otras funciones
669 @deffn {Función} new_variable (@var{type})
671 Devuelve un símbolo de la forma @code{%[z,n,r,c,g]k},
672 siendo @code{k} un número entero. Los valores admisibles para @var{type}
673 son @code{integer}, @code{natural_number}, @code{real}, @code{natural_number}
674 y @code{general}. Por número natural se entiende @i{entero negativo}, de
675 manera que el ceero es un número natural.
677 Cuando @var{type} no es de ninguno de los tipos indicados más arriba,
678 @var{type} toma por defecto el valor @code{general}. Para enteros, números
679 naturales y números complejos, Maxima añade esta información a la base de
680 datos de forma automática.
683 (%i1) map('new_variable,
684 ['integer, 'natural_number, 'real, 'complex, 'general]);
685 (%o1) [%z144, %n145, %r146, %c147, %g148]
686 (%i2) nicedummies(%);
687 (%o2) [%z0, %n0, %r0, %c0, %g0]
688 (%i3) featurep(%z0, 'integer);
690 (%i4) featurep(%n0, 'integer);
694 (%i6) featurep(%c0, 'complex);
698 Es recomendable que al argumento de @code{new_variable} se le
699 aplique el operador de comilla simple para evitar su evaluación,
700 de esta manera se evitan errores como el siguiente:
705 (%i8) new_variable(integer);
707 (%i9) new_variable('integer);
711 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
713 Véase también @code{nicedummies}.
722 @deffn {Función} nicedummies
724 La función @code{nicedummies} reescribe los índices,
725 comenzando por cero, de las variables de una expresión qua hayan
726 sido introducidas por @code{new_variable}:
729 (%i1) new_variable('integer) + 52 * new_variable('integer);
730 (%o1) 52 %z136 + %z135
731 (%i2) new_variable('integer) - new_variable('integer);
733 (%i3) nicedummies(%);
737 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
739 Véase también @code{new_variable}.
747 @deffn {Función} parg (@var{x})
749 La función @code{parg} es una versión con capacidades simplificadoras
750 de la función de argumento complejo @code{carg}:
753 (%i1) map('parg,[1,1+%i,%i, -1 + %i, -1]);
755 (%o1) [0, ---, ---, -----, %pi]
759 Si el argumento pasado a la función @code{parg} no es una constante,
760 se devolverá una forma nominal:
763 (%i2) parg(x + %i * sqrt(x));
764 (%o2) parg(x + %i sqrt(x))
767 Si @code{sign} detecta que la entrada es un número real negativo o
768 positivo, @code{parg} devuelve una forma no nominal aunque la entrada
769 no sea una constante:
778 La función @code{sign} suele ignorar las variables declaradas complejas
779 (@code{declare(x,complex)}); en tales casos, @code{parg}
780 puede retornar valores incorrectos:
783 (%i1) declare(x,complex)$
789 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
791 Véanse también @code{carg}, @code{isreal_p}.
800 @deffn {Función} real_imagpart_to_conjugate (@var{e})
802 La función @code{real_imagpart_to_conjugate} reemplaza todas las
803 llamadas a @code{realpart} y @code{imagpart} presentes en una expresión
804 por llamadas a @code{conjugate}, obteniendo otra expresión equivalente:
807 (%i1) declare(x, complex)$
809 (%i2) real_imagpart_to_conjugate(realpart(x) + imagpart(x) = 3);
810 conjugate(x) + x %i (x - conjugate(x))
811 (%o2) ---------------- - --------------------- = 3
815 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
823 @deffn {Función} rectform_log_if_constant (@var{e})
825 La función @code{rectform_log_if_constant} convierte todos los términos
826 de la forma @code{log(c)} a @code{rectform(log(c))}, siendo @code{c}
827 una expresión constante o declarada como tal.
830 (%i1) rectform_log_if_constant(log(1-%i) - log(x - %i));
832 (%o1) - log(x - %i) + ------ - ------
834 (%i2) declare(a,constant, b,constant)$
836 (%i3) rectform_log_if_constant(log(a + %i*b));
839 (%o3) ------------ + %i atan2(b, a)
843 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
851 @deffn {Función} simp_inequality (@var{e})
853 La función @code{simp_inequality} aplica ciertas simplificaciones
854 a conjunciones y disyunciones de inecuaciones.
856 @b{Limitaciones} La función @code{simp_inequality} está limitada en
857 al menos dos aspectos; en primer lugar, las simplificaciones son locales:
860 (%i1) simp_inequality((x > minf) %and (x < 0));
861 (%o2) (x>1) %and (x<1)
864 En segundo lugar, @code{simp_inequality} no tiene en cuenta los hechos de la
870 (%i3) simp_inequality(x > 0);
874 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
882 @deffn {Función} standardize_inverse_trig (@var{e})
884 Esta función aplica las identidades @code{cot(x) = atan(1/x)} y
885 @code{acsc(x) = asin(1/x)} y similares con @code{asec}, @code{acoth}
886 y @code{acsch}. Consúltese Abramowitz y Stegun, ecuaciones
887 4.4.6 a 4.4.8 y 4.6.4 a 4.6.6.
889 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
897 @deffn {Función} subst_parallel (@var{l}, @var{e})
899 Dada la ecuación o lista de ecuaciones @var{l} y la expresión
900 @var{e}, sustituye @i{en paralelo} en @var{e} los miembros izquierdos
901 de las ecuaciones por los derechos:
904 (%i1) load("to_poly_solve")$
906 (%i2) subst_parallel([x=y,y=x], [x,y]);
910 Compárese el resultado anterior con las sustituciones hechas en serie:
913 (%i3) subst([x=y,y=x],[x,y]);
917 La función @code{subst_parallel} es similar a @code{sublis}, excepto por
918 el hecho de que @code{subst_parallel} permite la sustitución de expresiones
922 (%i4) subst_parallel([x^2 = a, y = b], x^2 * y);
924 (%i5) sublis([x^2 = a, y = b], x^2 * y);
927 sublis: left-hand side of equation must be a symbol; found: x
928 -- an error. To debug this try: debugmode(true);
931 Las sustituciones hechas por @code{subst_parallel} son literales, no semánticas,
932 por lo que @code{subst_parallel} no reconoce que @math{x * y} sea una subexpresión
936 (%i6) subst_parallel([x * y = a], x^2 * y);
941 La función @code{subst_parallel} realiza todas las sustituciones
942 antes de proceder a la simplificación, lo que permite sustituciones
943 en expresiones condicionales que podrín producir
944 errores en caso de simplificar antes de sustituir:
947 (%i7) subst_parallel([x = 0], %if(x < 1, 5, log(x)));
949 (%i8) subst([x = 0], %if(x < 1, 5, log(x)));
951 log: encountered log(0).
952 -- an error. To debug this try: debugmode(true);
955 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve_extra.lisp")}.
957 Véanse también @code{subst}, @code{sublis} y @code{ratsubst}.
966 @deffn {Función} to_poly (@var{e}, @var{l})
968 La función @code{to_poly} intenta convertir la ecuación @var{e}
969 en un sistema de polinomios, junto con restricciones en forma de
970 desigualdades. Las soluciones del sistema polinómico que cumplan
971 las restricciones son, a su vez, las soluciones de la ecuación @var{e}.
972 Dicho de manera informal, @code{to_poly} intenta pasar a forma de
973 polinomio la ecuación @var{e}; un ejemplo ayudará a aclarar su
977 (%i1) load("to_poly_solve")$
979 (%i2) to_poly(sqrt(x) = 3, [x]);
981 (%o2) [[%g130 - 3, x = %g130 ],
983 [- --- < parg(%g130), parg(%g130) <= ---], []]
987 Las condiciones @code{-%pi/2<parg(%g130),parg(%g130)<=%pi/2} dicen que
988 @code{%g130} está en el rango de la función radical; cuando eso se
989 cumpla, el conjunto de ecuaciones de @code{sqrt(x) = 3} coincide con
990 el de @code{%g130-3,x=%g130^2}.
992 Para convertir a forma polinómica una expresión trigonométrica,
993 es necesario introducir una sustitución no algebraica; tal sustitución
994 se devuelve en la tercera lista de la respuesta de @code{to_poly}:
997 (%i3) to_poly(cos(x),[x]);
999 (%o3) [[%g131 + 1], [2 %g131 # 0], [%g131 = %e ]]
1002 Los términos constantes no se transforman a polinomios a menos que el
1003 número uno se introduzca en la lista de variables:
1006 (%i4) to_poly(x = sqrt(5),[x]);
1007 (%o4) [[x - sqrt(5)], [], []]
1008 (%i5) to_poly(x = sqrt(5),[1,x]);
1010 (%o5) [[x - %g132, 5 = %g132 ],
1012 [- --- < parg(%g132), parg(%g132) <= ---], []]
1016 Para generar un polinomio que tenga @math{sqrt(5) + sqrt(7)} como
1017 raíz puede hacerse lo siguiente:
1020 (%i6) first(elim_allbut(first(to_poly(x = sqrt(5) + sqrt(7),
1023 (%o6) [x - 24 x + 4]
1026 Para hacer uso de esta función, ejecútese @code{load("to_poly")}.
1028 Véase también @code{to_poly_solve}.
1037 @deffn {Función} to_poly_solve (@var{e}, @var{l}, [options])
1039 La función @code{to_poly_solve} intenta resolver las ecuaciones @var{e}
1040 de incógnitas @var{l}. El argumento @var{e} puede ser una única ecuación,
1041 o una lista o conjunto de ecuaciones; de forma similar, @var{l} puede ser un
1042 símbolo o una lista o conjunto de símbolos. Cuando
1043 uno de los elementos de @var{e} no sea una igualdad, como @math{x^2 -1},
1044 se supodrá que es igual a cero.
1046 La estrategia básica de @code{to_poly_solve} consiste en convertir la entrada en un
1047 polinomio y luego invocar a la función @code{algsys}. Internamente, @code{to_poly_solve}
1048 asigna a @code{algexact} el valor @code{true}. Para cambiar el valor de @code{algexact},
1049 debe anñadirse @code{'algexact=false} a la lista de argumentos de @code{to_poly_solve}.
1051 Cuando @code{to_poly_solve} consigue determinar el conjunto de soluciones, cada
1052 miembro del conjunto de soluciones es una lista en un objeto @code{%union}:
1055 (%i1) load("to_poly_solve")$
1057 (%i2) to_poly_solve(x*(x-1) = 0, x);
1058 (%o2) %union([x = 0], [x = 1])
1061 Cuando @code{to_poly_solve} es incapaz de determinar el conjunto de soluciones,
1062 devuelve una forma nominal de @code{%solve} y muestra un mensaje de aviso:
1065 (%i3) to_poly_solve(x^k + 2* x + 1 = 0, x);
1067 Nonalgebraic argument given to 'to_poly'
1070 (%o3) %solve([x + 2 x + 1 = 0], [x])
1073 A veces se puede obtener la solución haciendo una sustitución en @code{%solve}:
1076 (%i4) subst(k = 2, %);
1077 (%o4) %union([x = - 1])
1080 Especialmente en el caso de las funciones trigonométricas, los resultados pueden
1081 incorporar números enteros arbitrarios de la forma @code{%zXXX}, siendo @code{XXX}
1085 (%i5) to_poly_solve(sin(x) = 0, x);
1086 (%o5) %union([x = 2 %pi %z33 + %pi], [x = 2 %pi %z35])
1089 Para inicializar los índices, hágase uso de @code{nicedummies}:
1092 (%i6) nicedummies(%);
1093 (%o6) %union([x = 2 %pi %z0 + %pi], [x = 2 %pi %z1])
1096 En ocasiones, se introducen números complejos arbitrarios de la forma
1097 @code{%cXXX}, o reales de la forma @code{%rXXX}. La función @code{nicedummies}
1098 inicializa estos identificadores a cero.
1100 También a veces, la solución incorpora versiones simplificadas de los
1101 operadores lógicos @code{%and}, @code{%or} y @code{%if}, que representan, respectivamente,
1102 la conjunción, la disyunción y la implicación:
1105 (%i7) sol : to_poly_solve(abs(x) = a, x);
1106 (%o7) %union(%if(isnonnegative_p(a), [x = - a], %union()),
1107 %if(isnonnegative_p(a), [x = a], %union()))
1108 (%i8) subst(a = 42, sol);
1109 (%o8) %union([x = - 42], [x = 42])
1110 (%i9) subst(a = -42, sol);
1114 El conjunto vacío se representa por @code{%union}.
1116 La función @code{to_poly_solve} es capaz de resolver algunas ecuaciones
1117 con potencias racionales, potencias no racionales, valores absolutos, funciones
1118 trigonométricas y funciones del mínimo y del máximo.
1119 También puede resolver algunas ecuaciones resolubles en términos de la
1120 función W de Lambert:
1123 (%i1) load("to_poly_solve")$
1125 (%i2) to_poly_solve(set(max(x,y) = 5, x+y = 2), set(x,y));
1126 (%o2) %union([x = - 3, y = 5], [x = 5, y = - 3])
1127 (%i3) to_poly_solve(abs(1-abs(1-x)) = 10,x);
1128 (%o3) %union([x = - 10], [x = 12])
1129 (%i4) to_poly_solve(set(sqrt(x) + sqrt(y) = 5, x + y = 10),
1133 (%o4) %union([x = - ------------, y = ------------],
1137 [x = ------------, y = - ------------])
1139 (%i5) to_poly_solve(cos(x) * sin(x) = 1/2,x,
1140 'simpfuncs = ['expand, 'nicedummies]);
1142 (%o5) %union([x = %pi %z0 + ---])
1144 (%i6) to_poly_solve(x^(2*a) + x^a + 1,x);
1149 (%o6) %union([x = -----------------------------------],
1155 (- sqrt(3) %i - 1) %e
1156 [x = -------------------------------------])
1159 (%i7) to_poly_solve(x * exp(x) = a, x);
1160 (%o7) %union([x = lambert_w(a)])
1163 En el caso de inecuaciones lineales, @code{to_poly_solve} aplica automáticamente
1164 la eliminación de Fourier:
1167 (%i8) to_poly_solve([x + y < 1, x - y >= 8], [x,y]);
1169 (%o8) %union([x = y + 8, y < - -],
1172 [y + 8 < x, x < 1 - y, y < - -])
1176 Los argumentos opcionales deben tener forma de ecuación; generalmente, el orden
1177 de estas opciones no reviste importancia.
1181 @item @code{simpfuncs = l}, siendo @code{l} una lista de funciones,
1182 aplica la composición de los elementos de @code{l} a cada solución:
1184 (%i1) to_poly_solve(x^2=%i,x);
1186 (%o1) %union([x = - (- 1) ], [x = (- 1) ])
1187 (%i2) to_poly_solve(x^2= %i,x, 'simpfuncs = ['rectform]);
1189 (%o2) %union([x = - ------- - -------], [x = ------- + -------])
1190 sqrt(2) sqrt(2) sqrt(2) sqrt(2)
1193 A veces, una simplificación puede anular una simplificación anterior:
1195 (%i3) to_poly_solve(x^2=1,x);
1196 (%o3) %union([x = - 1], [x = 1])
1197 (%i4) to_poly_solve(x^2= 1,x, 'simpfuncs = [polarform]);
1199 (%o4) %union([x = 1], [x = %e ]
1202 Maxima no comprueba que los elementos de la lista de funciones @code{l} sean
1203 todos simplificaciones:
1205 (%i5) to_poly_solve(x^2 = %i,x, 'simpfuncs = [lambda([s],s^2)]);
1206 (%o5) %union([x = %i])
1209 Para convertir cada solución a real de doble precisión hágase uso de
1210 @code{simpfunc = ['dfloat]}:
1212 (%i6) to_poly_solve(x^3 +x + 1 = 0,x,
1213 'simpfuncs = ['dfloat]), algexact : true;
1214 (%o6) %union([x = - .6823278038280178],
1215 [x = .3411639019140089 - 1.161541399997251 %i],
1216 [x = 1.161541399997251 %i + .3411639019140089])
1219 @item Con la opción @code{use_grobner = true} se aplica la función
1220 @code{poly_reduced_grobner} a las ecuaciones antes de intentar resolverlas.
1221 En primer lugar, esta opción proporciona una manera de soslayar algunas
1222 debilidades de la función @code{algsys}:
1225 (%i7) to_poly_solve([x^2+y^2=2^2,(x-1)^2+(y-1)^2=2^2],[x,y],
1226 'use_grobner = true);
1227 sqrt(7) - 1 sqrt(7) + 1
1228 (%o7) %union([x = - -----------, y = -----------],
1230 sqrt(7) + 1 sqrt(7) - 1
1231 [x = -----------, y = - -----------])
1233 (%i8) to_poly_solve([x^2+y^2=2^2,(x-1)^2+(y-1)^2=2^2],[x,y]);
1237 @item @code{maxdepth = k}, siendo @code{k} un positivo entero, controla el nivel
1238 de recursión. El valor por defecto es cinco. Cuando se excede el nivel de recursión
1239 se obtiene un mensaje de error:
1241 (%i9) to_poly_solve(cos(x) = x,x, 'maxdepth = 2);
1245 (%o9) %solve([cos(x) = x], [x], maxdepth = 2)
1248 @item Con @code{parameters = l}, siendo @code{l} una lista de símbolos,
1249 el programa intenta encontrar una solución válida para todos los miembros de la
1252 (%i10) to_poly_solve(a * x = x, x);
1253 (%o10) %union([x = 0])
1254 (%i11) to_poly_solve(a * x = x, x, 'parameters = [a]);
1255 (%o11) %union(%if(a - 1 = 0, [x = %c111], %union()),
1256 %if(a - 1 # 0, [x = 0], %union()))
1258 En @code{(%o2)}, el programa introduce una variable ficticia; para reinicializarla,
1259 úsese la función @code{nicedummies}:
1261 (%i12) nicedummies(%);
1262 (%o12) %union(%if(a - 1 = 0, [x = %c0], %union()),
1263 %if(a - 1 # 0, [x = 0], %union()))
1267 @code{to_poly_solve} utiliza información almacenada en el array @code{one_to_one_reduce}
1268 para resolver ecuaciones de la forma @math{f(a) = f(b)}. La asignación
1269 @code{one_to_one_reduce['f,'f] : lambda([a,b], a=b)} le dice a @code{to_poly_solve}
1270 que el conjunto de soluciones de @math{f(a) = f(b)} es igual al conjunto de soluciones
1273 (%i13) one_to_one_reduce['f,'f] : lambda([a,b], a=b)$
1275 (%i14) to_poly_solve(f(x^2-1) = f(0),x);
1276 (%o14) %union([x = - 1], [x = 1])
1279 De forma más general, la asignación
1280 @code{one_to_one_reduce['f,'g] : lambda([a,b], w(a,b)=0} le indica a
1281 @code{to_poly_solve} que el cojunto de soluciones de @math{f(a) = f(b)}
1282 es igual al conjunto de soluciones de @math{w(a,b) = 0}:
1284 (%i15) one_to_one_reduce['f,'g] : lambda([a,b], a = 1 + b/2)$
1286 (%i16) to_poly_solve(f(x) - g(x),x);
1287 (%o16) %union([x = 2])
1290 Además, @code{to_poly_solve} utiliza información almacenada en el array
1291 @code{function_inverse} para resolver ecuaciones de la forma @math{f(a) = b}.
1292 La asignación @code{function_inverse['f] : lambda([s], g(s))} le dice a
1293 @code{to_poly_solve} que el conjunto de soluciones de @math{f(x) = b} es
1294 igual al conjunto de soluciones de @math{x = g(b)}:
1296 (%i17) function_inverse['Q] : lambda([s], P(s))$
1298 (%i18) to_poly_solve(Q(x-1) = 2009,x);
1299 (%o18) %union([x = P(2009) + 1])
1300 (%i19) function_inverse['G] : lambda([s], s+new_variable(integer));
1301 (%o19) lambda([s], s + new_variable(integer))
1302 (%i20) to_poly_solve(G(x - a) = b,x);
1303 (%o20) %union([x = b + a + %z125])
1310 @item Las incógnitas a resolver no necesitan ser símbolos, lo cual es
1311 cierto cuando @code{fullratsubst} es capaz de hacer las sustituciones de forma apropiadas:
1313 (%i1) to_poly_solve([x^2 + y^2 + x * y = 5, x * y = 8],
1314 [x^2 + y^2, x * y]);
1316 (%o1) %union([x y = 8, y + x = - 3])
1319 @item Cuando las ecuaciones involucran conjugados de complejos, el programa
1320 añade automáticamente las ecuaciones conjugadas:
1322 (%i1) declare(x,complex)$
1324 (%i2) to_poly_solve(x + (5 + %i) * conjugate(x) = 1, x);
1326 (%o2) %union([x = - -----------])
1328 (%i3) declare(y,complex)$
1330 (%i4) to_poly_solve(set(conjugate(x) - y = 42 + %i,
1331 x + conjugate(y) = 0), set(x,y));
1333 (%o4) %union([x = - -------, y = - -------])
1337 @item Cuando las funciones involucran valores absolutos, @code{to_poly_solve}
1338 consulta los hechos de la base de datos para decidir si los argumentos de los valores
1339 absolutos son números complejos:
1341 (%i1) to_poly_solve(abs(x) = 6, x);
1342 (%o1) %union([x = - 6], [x = 6])
1343 (%i2) declare(z,complex)$
1345 (%i3) to_poly_solve(abs(z) = 6, z);
1346 (%o3) %union(%if((%c11 # 0) %and (%c11 conjugate(%c11) - 36 =
1347 0), [z = %c11], %union()))
1350 Esta es la única situación en la que @code{to_poly_solve} consulta la base de
1351 datos; si una incógnita se declara, por ejemplo, como entero, @code{to_poly_solve} lo ignora.
1354 Para hacer uso de esta función, ejecútese @code{load("to_poly_solve")}.
1356 Véase también @code{algexact}, @code{resultant}, @code{algebraic} y @code{to_poly}.