Merge branch 'master' into bug-4403-remove-polyfill
[maxima.git] / doc / info / es / lsquares.texi
blob4519bd67697cd3d78061de39ce79a750e20edab0
1 @c English version: 2011-06-07
2 @menu
3 * Funciones y variables para lsquares::
4 @end menu
6 @node Funciones y variables para lsquares,  , lsquares, lsquares
7 @section Funciones y variables para lsquares
10 @deffn {Función} lsquares_estimates (@var{D}, @var{x}, @var{e}, @var{a})
11 @deffnx {Función} lsquares_estimates (@var{D}, @var{x}, @var{e}, @var{a}, initial = @var{L}, tol = @var{t})
13 Estima los parámetros @var{a} que mejor se ajusten a la ecuación @var{e}
14 de variables @var{x} y @var{a} a los datos @var{D} por el método de los
15 mínimos cuadrados. La función @code{lsquares_estimates}
16 busca primero una solución exacta, y si no la encuentra, buscará
17 una aproximada.
19 El resultado es una lista de listas de ecuaciones de la forma
20 @code{[a = ..., b = ..., c = ...]}. Cada elemento de la lista es un
21 mínimo diferente de error cuadrático medio.
23 Los datos deben darse en formato matricial. Cada fila es un dato (el cual suele
24 denominarse `registro' o `caso' en ciertos contextos), y las columnas contienen los
25 valores para cada una de las variables. La lista de variables @var{x} asigna un nombre
26 a cada una de las columnas de @var{D}, incluso a aquellas que no intervienen en el
27 análisis. La lista @var{a} asigna nombres a los parámetros cuyas estimaciones se
28 buscan. El argumento @var{e} es una expresión o ecuación de variables @var{x} y @var{a};
29 si @var{e} no es una ecuación (es decir, carece de igualdad), se trata como si 
30 fuese  @code{@var{e} = 0}.
32 Se pueden dar argumentos adicionales a @code{lsquares_estimates} en forma de ecuaciones,
33 las cuales se pasan tal cual a la función @code{lbfgs}, que es la que se encarga de
34 calcular las estimaciones por el método numérico cuando no encuentra una
35 solución exacta.
37 Cuando se pueda encontrar una solución exacta, mediante @code{solve}, los datos
38 en @var{D} pueden contener valores no numéricos. Sin embargo, cuando no exista
39 solución exacta, todos los elementos de @var{D} deben ser necesariamente
40 numéricos, lo cual incluye constantes numéricas tales como @code{%pi} o @code{%e}
41 y números literales (enteros, racionales y decimales en coma flotante, tanto los de doble 
42 precisión como los de precisión arbitraria).
43 Los cálculos numéricos se realizan en doble precisión con aritmética de
44 punto flotante, por lo que números de cualesquiera otro tipo son 
45 convenientemente convertidos antes de proceder con los cálculos.
47 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
49 Véanse también
50 @code{lsquares_estimates_exact},
51 @code{lsquares_estimates_approximate},
52 @code{lsquares_mse},
53 @code{lsquares_residuals}
54 y @code{lsquares_residual_mse}.
56 Ejemplos:
58 Un problema con solución exacta.
60 @c ===beg===
61 @c load ("lsquares")$
62 @c M : matrix (
63 @c         [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
64 @c lsquares_estimates (
65 @c          M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
66 @c ===end===
67 @example
68 (%i1) load ("lsquares")$
69 (%i2) M : matrix (
70         [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
71                                   [ 1  1  1 ]
72                                   [         ]
73                                   [ 3       ]
74                                   [ -  1  2 ]
75                                   [ 2       ]
76                                   [         ]
77 (%o2)                             [ 9       ]
78                                   [ -  2  1 ]
79                                   [ 4       ]
80                                   [         ]
81                                   [ 3  2  2 ]
82                                   [         ]
83                                   [ 2  2  1 ]
84 (%i3) lsquares_estimates (
85          M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
86                          59        27      10921        107
87 (%o3)            [[A = - --, B = - --, C = -----, D = - ---]]
88                          16        16      1024         32
89 @end example
91 un problema para el que no se encuentra solución exacta,
92 por lo que @code{lsquares_estimates} recurre a la aproximación numérica.
94 @c ===beg===
95 @c load ("lsquares")$
96 @c M : matrix ([1, 1], [2, 7/4], [3, 11/4], [4, 13/4]);
97 @c lsquares_estimates (
98 @c   M, [x,y], y=a*x^b+c, [a,b,c], initial=[3,3,3], iprint=[-1,0]);
99 @c ===end===
100 @example
101 (%i1) load ("lsquares")$
102 (%i2) M : matrix ([1, 1], [2, 7/4], [3, 11/4], [4, 13/4]);
103                                    [ 1  1  ]
104                                    [       ]
105                                    [    7  ]
106                                    [ 2  -  ]
107                                    [    4  ]
108                                    [       ]
109 (%o2)                              [    11 ]
110                                    [ 3  -- ]
111                                    [    4  ]
112                                    [       ]
113                                    [    13 ]
114                                    [ 4  -- ]
115                                    [    4  ]
116 (%i3) lsquares_estimates (
117   M, [x,y], y=a*x^b+c, [a,b,c], initial=[3,3,3], iprint=[-1,0]);
118 (%o3) [[a = 1.387365874920637, b = .7110956639593767, 
119                                         c = - .4142705622439105]]
120 @end example
122 @end deffn
124 @deffn {Función} lsquares_estimates_exact (@var{MSE}, @var{a})
126 Estima los valores de los parámetros @var{a} que minimizan el error
127 cuadrático medio @var{MSE} mediante un sistema de ecuaciones que intentará
128 resolver simbólicamente con @code{solve}. El error cuadrático medio es una
129 expresión con parámetros @var{a}, como los devueltos por @code{lsquares_mse}.
131 El valor devuelto por la función es una lista de listas de ecuaciones de la 
132 forma @code{[a = ..., b = ..., c = ...]}. El resultado puede contener cero, uno o
133 más elementos. Cuando la respuesta contiene más de una solución, todas ellas
134 representan mínimos del error cuadrático medio.
136 Véanse también
137 @code{lsquares_estimates},
138 @code{lsquares_estimates_approximate},
139 @code{lsquares_mse},
140 @code{lsquares_residuals}
141 y @code{lsquares_residual_mse}.
143 Ejemplo:
145 @c ===beg===
146 @c load ("lsquares")$
147 @c M : matrix (
148 @c          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
149 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
150 @c lsquares_estimates_exact (mse, [A, B, C, D]);
151 @c ===end===
152 @example
153 (%i1) load ("lsquares")$
154 (%i2) M : matrix (
155          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
156                            [ 1  1  1 ]
157                            [         ]
158                            [ 3       ]
159                            [ -  1  2 ]
160                            [ 2       ]
161                            [         ]
162 (%o2)                      [ 9       ]
163                            [ -  2  1 ]
164                            [ 4       ]
165                            [         ]
166                            [ 3  2  2 ]
167                            [         ]
168                            [ 2  2  1 ]
169 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
170            5
171           ====
172           \                 2                         2
173            >    ((D + M    )  - C - M     B - M     A)
174           /            i, 1          i, 3      i, 2
175           ====
176           i = 1
177 (%o3)     ---------------------------------------------
178                                 5
179 (%i4) lsquares_estimates_exact (mse, [A, B, C, D]);
180                   59        27      10921        107
181 (%o4)     [[A = - --, B = - --, C = -----, D = - ---]]
182                   16        16      1024         32
183 @end example
185 @end deffn
187 @deffn {Función} lsquares_estimates_approximate (@var{MSE}, @var{a}, initial = @var{L}, tol = @var{t})
189 Estima los valores de los parámetros @var{a} que minimizan el error
190 cuadrático medio @var{MSE} mediante el algoritmo numérico @code{lbfgs}.
191 El error cuadrático medio es una expresión con parámetros @var{a},
192 como los devueltos por @code{lsquares_mse}.
194 La solución devuelta por la función es un mínimo local
195 (posiblemente global) del error cuadrático medio.
197 Por consistencia con @code{lsquares_estimates_exact}, el valor devuelto
198 es una lista anidada con un único elemento, consistente en una lista
199 de ecuaciones de la forma @code{[a = ..., b = ..., c = ...]}.
201 Los argumentos adicionales de @code{lsquares_estimates_approximate}
202 se especifican como ecuaciones y se pasan de esta forma a la función @code{lbfgs}.
204 @var{MSE} debe devolver un número cuando a sus parámetros se les
205 asignen valores numéricos, lo cual implica que los datos a partir de los
206 cuales se ha generado @var{MSE} contengan únicamente constantes numéricas 
207 tales como @code{%pi} o @code{%e} y números literales (enteros, racionales y 
208 decimales en coma flotante, tanto los de doble 
209 precisión como los de precisión arbitraria).
210 Los cálculos numéricos se realizan en doble precisión con aritmética de
211 punto flotante, por lo que números de cualesquiera otro tipo son 
212 convenientemente convertidos antes de proceder con los cálculos.
214 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
216 Véanse también
217 @code{lsquares_estimates},
218 @code{lsquares_estimates_exact},
219 @code{lsquares_mse},
220 @code{lsquares_residuals} y @code{lsquares_residual_mse}.
222 Ejemplo:
224 @c ===beg===
225 @c load ("lsquares")$
226 @c M : matrix (
227 @c          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
228 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
229 @c lsquares_estimates_approximate (
230 @c         mse, [A, B, C, D], iprint = [-1, 0]);
231 @c ===end===
232 @example
233 (%i1) load ("lsquares")$
234 (%i2) M : matrix (
235          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
236                            [ 1  1  1 ]
237                            [         ]
238                            [ 3       ]
239                            [ -  1  2 ]
240                            [ 2       ]
241                            [         ]
242 (%o2)                      [ 9       ]
243                            [ -  2  1 ]
244                            [ 4       ]
245                            [         ]
246                            [ 3  2  2 ]
247                            [         ]
248                            [ 2  2  1 ]
249 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
250            5
251           ====
252           \                 2                         2
253            >    ((D + M    )  - C - M     B - M     A)
254           /            i, 1          i, 3      i, 2
255           ====
256           i = 1
257 (%o3)     ---------------------------------------------
258                                 5
259 (%i4) lsquares_estimates_approximate (
260               mse, [A, B, C, D], iprint = [-1, 0]);
261 (%o4) [[A = - 3.67850494740174, B = - 1.683070351177813, 
262                  C = 10.63469950148635, D = - 3.340357993175206]]
263 @end example
265 @end deffn
267 @deffn {Función} lsquares_mse (@var{D}, @var{x}, @var{e})
269 Devuelve el error medio cuadrático (MSE) para la ecuación @var{e}
270 de variables @var{x} respecto de los datos @var{D}. El resultado devuelto
271 es una suma, definida como
273 @tex
274 $${1 \over n} \, \sum_{i=1}^n \left[{\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right)\right]^2,$$
275 @end tex
276 @ifnottex
277 @example
278                     n
279                    ====
280                1   \                        2
281                -    >    (lhs(e ) - rhs(e ))
282                n   /           i         i
283                    ====
284                    i = 1
285 @end example
286 @end ifnottex
289 siendo @var{n} el número de datos y @code{@var{e}[i]} es la ecuación @var{e}
290 evaluada cuando a sus variables @var{x} se le asignan los valores asociados
291 al dato @code{i}-ésimo @code{@var{D}[i]}.
293 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
295 Ejemplo:
297 @c ===beg===
298 @c load ("lsquares")$
299 @c M : matrix (
300 @c          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
301 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
302 @c diff (mse, D);
303 @c ''mse, nouns;
304 @c ===end===
305 @example
306 (%i1) load ("lsquares")$
307 (%i2) M : matrix (
308          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
309                            [ 1  1  1 ]
310                            [         ]
311                            [ 3       ]
312                            [ -  1  2 ]
313                            [ 2       ]
314                            [         ]
315 (%o2)                      [ 9       ]
316                            [ -  2  1 ]
317                            [ 4       ]
318                            [         ]
319                            [ 3  2  2 ]
320                            [         ]
321                            [ 2  2  1 ]
322 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
323            5
324           ====
325           \                 2                         2
326            >    ((D + M    )  - C - M     B - M     A)
327           /            i, 1          i, 3      i, 2
328           ====
329           i = 1
330 (%o3)     ---------------------------------------------
331                                 5
332 (%i4) diff (mse, D);
333          5
334         ====
335         \                             2
336       4  >    (D + M    ) ((D + M    )  - C - M     B - M     A)
337         /           i, 1         i, 1          i, 3      i, 2
338         ====
339         i = 1
340 (%o4) ----------------------------------------------------------
341                                   5
342 (%i5) ''mse, nouns;
343                2                 2         9 2               2
344 (%o5) (((D + 3)  - C - 2 B - 2 A)  + ((D + -)  - C - B - 2 A)
345                                            4
346            2               2         3 2               2
347  + ((D + 2)  - C - B - 2 A)  + ((D + -)  - C - 2 B - A)
348                                      2
349            2             2
350  + ((D + 1)  - C - B - A) )/5
351 @end example
353 @end deffn
355 @deffn {Función} lsquares_residuals (@var{D}, @var{x}, @var{e}, @var{a})
357 Devuelve los residuos para la ecuación @var{e} de parámetros @var{a}
358 y datos @var{D}.
360 @var{D} es una matriz, @var{x} una lista de variables y @var{e} es una ecuación
361 o expresión general; si @var{e} no es una ecuación (es decir, carece de igualdad),
362 se trata como si fuese  @code{@var{e} = 0}. La lista @var{a} contiene ecuaciones
363 que especifican valores para cualesquiera parámetros de @var{e} que no estén en @var{x}.
365 Los residuos se definen como
367 @tex
368 $${\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right),$$
369 @end tex
370 @ifnottex
371 @example
372                         lhs(e ) - rhs(e )
373                              i         i
374 @end example
375 @end ifnottex
377 siendo @code{@var{e}[i]} la ecuación @var{e} evaluada cuando las variables @var{x}
378 toman los valores asociados al dato @code{i}-ésimo @code{@var{D}[i]}, y haciendo las
379 asignaciones indicadas en @var{a} al resto de variables.
381 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
383 Ejemplo:
385 @c ===beg===
386 @c load ("lsquares")$
387 @c M : matrix (
388 @c          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
389 @c a : lsquares_estimates (
390 @c           M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
391 @c lsquares_residuals (
392 @c           M, [z,x,y], (z+D)^2 = A*x+B*y+C, first(a));
393 @c ===end===
394 @example
395 (%i1) load ("lsquares")$
396 (%i2) M : matrix (
397          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
398                                   [ 1  1  1 ]
399                                   [         ]
400                                   [ 3       ]
401                                   [ -  1  2 ]
402                                   [ 2       ]
403                                   [         ]
404 (%o2)                             [ 9       ]
405                                   [ -  2  1 ]
406                                   [ 4       ]
407                                   [         ]
408                                   [ 3  2  2 ]
409                                   [         ]
410                                   [ 2  2  1 ]
411 (%i3) a : lsquares_estimates (
412           M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
413                          59        27      10921        107
414 (%o3)            [[A = - --, B = - --, C = -----, D = - ---]]
415                          16        16      1024         32
416 (%i4) lsquares_residuals (
417           M, [z,x,y], (z+D)^2 = A*x+B*y+C, first(a));
418                             13    13    13  13  13
419 (%o4)                      [--, - --, - --, --, --]
420                             64    64    32  64  64
421 @end example
423 @end deffn
425 @deffn {Función} lsquares_residual_mse (@var{D}, @var{x}, @var{e}, @var{a})
427 Devuelve el residuo del error cuadrático medio (MSE) de la ecuación @var{e}
428 para los valores parámetricos @var{a} y datos @var{D}.
430 El residuo del error cuadrático medio (MSE) se define como
432 @tex
433 $${1 \over n} \, \sum_{i=1}^n \left[{\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right)\right]^2,$$
434 @end tex
435 @ifnottex
436 @example
437                     n
438                    ====
439                1   \                        2
440                -    >    (lhs(e ) - rhs(e ))
441                n   /           i         i
442                    ====
443                    i = 1
444 @end example
445 @end ifnottex
448 siendo @code{@var{e}[i]} la ecuación @var{e} evaluada cuando las variables @var{x}
449 toman los valores asociados al dato @code{i}-ésimo @code{@var{D}[i]}, y haciendo las
450 asignaciones indicadas en @var{a} al resto de variables.
452 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
454 Ejemplo:
456 @c ===beg===
457 @c load ("lsquares")$
458 @c M : matrix (
459 @c          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
460 @c a : lsquares_estimates (
461 @c        M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
462 @c lsquares_residual_mse (
463 @c        M, [z,x,y], (z + D)^2 = A*x + B*y + C, first (a));
464 @c ===end===
465 @example
466 (%i1) load ("lsquares")$
467 (%i2) M : matrix (
468          [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
469                            [ 1  1  1 ]
470                            [         ]
471                            [ 3       ]
472                            [ -  1  2 ]
473                            [ 2       ]
474                            [         ]
475 (%o2)                      [ 9       ]
476                            [ -  2  1 ]
477                            [ 4       ]
478                            [         ]
479                            [ 3  2  2 ]
480                            [         ]
481                            [ 2  2  1 ]
482 (%i3) a : lsquares_estimates (
483              M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
485                   59        27      10921        107
486 (%o3)     [[A = - --, B = - --, C = -----, D = - ---]]
487                   16        16      1024         32
488 (%i4) lsquares_residual_mse (
489              M, [z,x,y], (z + D)^2 = A*x + B*y + C, first (a));
490                               169
491 (%o4)                         ----
492                               2560
493 @end example
495 @end deffn
499 @deffn {Función} plsquares (@var{Mat},@var{VarList},@var{depvars})
500 @deffnx {Función} plsquares (@var{Mat},@var{VarList},@var{depvars},@var{maxexpon})
501 @deffnx {Función} plsquares (@var{Mat},@var{VarList},@var{depvars},@var{maxexpon},@var{maxdegree})
503 Ajuste de una función polinómica multivariante a una tabla de datos por el método
504 de los @i{mínimos cuadrados}. @var{Mat} es la matriz con los datos 
505 empíricos, @var{VarList} es la lista con los nombres de las variables
506 (una por cada columna de @var{Mat}, pero puede usarse @code{-} en lugar de los nombres de
507 variables para ignorar las columnas de @var{Mat}), @var{depvars} es el nombre de la
508 variable dependiente o una lista con uno o más nombres de variables dependientes
509 (cuyos nombres deben estar también en @var{VarList}), @var{maxexpon} es un argumento
510 opcional para indicar el máximo exponente para cada una de las variables independientes
511 (1 por defecto) y  @var{maxdegree} es otro argumento opcional para el grado del polinomio
512 (@var{maxexpon} por defecto); nótese que la suma de exponentes de cada término debe ser
513 igual o menor que @var{maxdegree}. Si @code{maxdgree = 0} entonces no se aplicará
514 ningún límite.
516 Si @var{depvars} es el nombre de una variable dependiente (no en una lista),
517 @code{plsquares} devuelve el polinomio ajustado. Si @var{depvars} es una lista
518 de una o más variables dependientes, @code{plsquares} devuelve una lista con
519 los polinomios ajustados. Los coeficientes de determinación se muestran en
520 su orden correspondiente para informar sobre la bondad del ajuste. Estos
521 valores se almacenan también en la variable global @var{DETCOEF} en un
522 formato de lista si @var{depvars} es a su vez una lista.
524 Un ejemplo sencillo de ajuste lineal multivariante:
526 @example
527 (%i1) load("plsquares")$
529 (%i2) plsquares(matrix([1,2,0],[3,5,4],[4,7,9],[5,8,10]),
530                 [x,y,z],z);
531      Determination Coefficient for z = .9897039897039897
532                        11 y - 9 x - 14
533 (%o2)              z = ---------------
534                               3
535 @end example
537 El mismo ejemplo sin restricciones en el grado:
539 @example
540 (%i3) plsquares(matrix([1,2,0],[3,5,4],[4,7,9],[5,8,10]),
541                 [x,y,z],z,1,0);
542      Determination Coefficient for z = 1.0
543                     x y + 23 y - 29 x - 19
544 (%o3)           z = ----------------------
545                               6
546 @end example
548 Cálculo del número de diagonales de un polígono de @math{N} lados
550 @example
551 (%i4) plsquares(matrix([3,0],[4,2],[5,5],[6,9],[7,14],[8,20]),
552                 [N,diagonals],diagonals,5);
553      Determination Coefficient for diagonals = 1.0
554                                 2
555                                N  - 3 N
556 (%o4)              diagonals = --------
557                                   2
558 (%i5) ev(%, N=9);   /* Testing for a 9 sides polygon */
559 (%o5)                 diagonals = 27
560 @end example
562 Cálculo del número de formas de colocar dos reinas en un tablero 
563 n x n de manera que no se amenacen.
565 @example
566 (%i6) plsquares(matrix([0,0],[1,0],[2,0],[3,8],[4,44]),
567                 [n,positions],[positions],4);
568      Determination Coefficient for [positions] = [1.0]
569                          4       3      2
570                       3 n  - 10 n  + 9 n  - 2 n
571 (%o6)    [positions = -------------------------]
572                                   6
573 (%i7) ev(%[1], n=8); /* Testing for a (8 x 8) chessboard */
574 (%o7)                positions = 1288
575 @end example
577 Un ejemplo con seis variables dependientes:
579 @example
580 (%i8) mtrx:matrix([0,0,0,0,0,1,1,1],[0,1,0,1,1,1,0,0],
581                   [1,0,0,1,1,1,0,0],[1,1,1,1,0,0,0,1])$
582 (%i8) plsquares(mtrx,[a,b,_And,_Or,_Xor,_Nand,_Nor,_Nxor],
583                      [_And,_Or,_Xor,_Nand,_Nor,_Nxor],1,0);
584       Determination Coefficient for
585 [_And, _Or, _Xor, _Nand, _Nor, _Nxor] =
586 [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
587 (%o2) [_And = a b, _Or = - a b + b + a,
588 _Xor = - 2 a b + b + a, _Nand = 1 - a b,
589 _Nor = a b - b - a + 1, _Nxor = 2 a b - b - a + 1]
590 @end example
592 Antes de hacer uso de esta función ejecútese  @code{load("plsquares")}.
593 @end deffn