1 @c /linearalgebra.texi/1.11/Fri Jan 5 17:01:04 2007//
3 * Introdução a linearalgebra::
4 * Definições para linearalgebra::
7 @node Introdução a linearalgebra, Definições para linearalgebra, linearalgebra, linearalgebra
8 @section Introdução a linearalgebra
10 @code{linearalgebra} é uma colecção de funções para álgebra linear.
15 @c load ("linearalgebra")$
16 @c M : matrix ([1, 2], [1, 2]);
19 @c ptriangularize (M - z*ident(2), z);
20 @c M : matrix ([1, 2, 3], [4, 5, 6], [7, 8, 9]) - z*ident(3);
21 @c MM : ptriangularize (M, z);
23 @c tellrat (MM [3, 3]);
26 @c M : matrix ([1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]);
28 @c apply ('orthogonal_complement, args (nullspace (transpose (M))));
31 (%i1) load ("linearalgebra");
32 Warning - you are redefining the Maxima function require_list
33 Warning - you are redefining the Maxima function matrix_size
34 Warning - you are redefining the Maxima function rank
35 (%o1) /usr/local/share/maxima/5.9.2/share/linearalgebra/linearalgebra.mac
36 (%i2) M : matrix ([1, 2], [1, 2]);
46 (%i4) columnspace (M);
50 (%i5) ptriangularize (M - z*ident(2), z);
55 (%i6) M : matrix ([1, 2, 3], [4, 5, 6], [7, 8, 9]) - z*ident(3);
61 (%i7) MM : ptriangularize (M, z);
66 [ 0 -- - -- + ----- + --- ]
71 [ 0 0 ----- - ------ - ----- ]
73 (%i8) algebraic : true;
75 (%i9) tellrat (MM [3, 3]);
77 (%o9) [z - 15 z - 18 z]
78 (%i10) MM : ratsimp (MM);
82 (%o10) [ 66 7 z - 102 z - 132 ]
83 [ 0 -- - ------------------ ]
87 (%i11) nullspace (MM);
99 (%i12) M : matrix ([1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]);
107 (%i13) columnspace (M);
111 (%o13) span([ ], [ ])
115 (%i14) apply ('orthogonal_complement, args (nullspace (transpose (M))));
119 (%o14) span([ ], [ ])
125 @node Definições para linearalgebra, , Introdução a linearalgebra, linearalgebra
126 @section Definições para linearalgebra
128 @deffn {Função} addmatrices (@var{f}, @var{M_1}, ..., @var{M_n})
130 @c REWORD -- THE RESULT IS NOT GENERALLY THE SUM OF M_1, ..., M_N
131 Usando a função @var{f} como a função de adição, retorne a adição das
132 matrizes @var{M_1}, ..., @var{M_n}. A função @var{f} deve aceitar qualquer número de
133 argumentos (uma função enária do Maxima).
138 @c m1 : matrix([1,2],[3,4])$
139 @c m2 : matrix([7,8],[9,10])$
140 @c addmatrices('max,m1,m2);
141 @c addmatrices('max,m1,m2,5*m1);
144 (%i1) m1 : matrix([1,2],[3,4])$
145 (%i2) m2 : matrix([7,8],[9,10])$
146 (%i3) addmatrices('max,m1,m2);
147 (%o3) matrix([7,8],[9,10])
148 (%i4) addmatrices('max,m1,m2,5*m1);
149 (%o4) matrix([7,10],[15,20])
154 @deffn {Função} blockmatrixp (@var{M})
156 Retorna @code{true} se e somente se @var{M} for uma matriz e toda entrada de
157 @var{M} também for uma matriz.
161 @deffn {Função} columnop (@var{M}, @var{i}, @var{j}, @var{theta})
163 Se @var{M} for uma matriz, retorna a matriz que resulta de fazer a
164 operação de coluna @code{C_i <- C_i - @var{theta} * C_j}. Se @var{M} não tiver uma linha
165 @var{i} ou @var{j}, emite uma mensagem de erro.
169 @deffn {Função} columnswap (@var{M}, @var{i}, @var{j})
171 Se @var{M} for uma matriz, troca as colunas @var{i} e @var{j}. Se @var{M} não tiver uma coluna
172 @var{i} ou @var{j}, emite uma mensagem de erro.
176 @deffn {Função} columnspace (@var{M})
178 Se @var{M} for uma matriz, retorna @code{span (v_1, ..., v_n)}, onde o conjunto
179 @code{@{v_1, ..., v_n@}} é uma base para o espaço coluna de @var{M}. A diferença entre o maior elemento e o menor elemento do
180 conjunto vazio é @code{@{0@}}. Dessa forma, quando o espaço coluna tiver somente
181 um membro, retorna @code{span ()}.
185 @deffn {Função} copy (@var{e})
187 Retorna uma cópia da expressão @var{e} do Maxima. Embora @var{e} possa ser qualquer
188 expressão do Maxima, Afunção @code{copy} é mais útil quando @var{e} for ou
189 uma lista ou uma matriz; considere:
191 load ("linearalgebra");
199 (%i1) load("linearalgebra")$
208 Vamos tentar a mesma experiência, mas dessa vez tomemos @var{mm} como sendo uma cópia de @var{m}
225 Dessa vez, a atribuição a @var{mm} não muda o valor de @var{m}.
229 @deffn {Função} cholesky (@var{M})
230 @deffnx {Função} cholesky (@var{M}, @var{corpo})
232 Retorna factorização de Cholesky da matriz hermitiana (or autoadjunta)
233 @var{M}. O valor padrão para o segundo argumento é @code{generalring}. Para uma descrição dos
234 possíveis valores para @var{corpo}, veja @code{lu_factor}.
238 @deffn {Função} ctranspose (@var{M})
240 Retorna a matriz transposta conjugada complexa da matriz @var{M}. A função
241 @code{ctranspose} usa @code{matrix_element_transpose} para transpor cada elemento da matriz.
245 @deffn {Função} diag_matrix (@var{d_1}, @var{d_2},...,@var{d_n})
247 Retorna uma matriz diagonal matriz com entradas de diagonal @var{d_1}, @var{d_2},...,@var{d_n}.
248 Quando as entradas de diagonal forem matrizes, as entradas zero da matriz retornada
249 serão todas matrizes de tamanho apropriado; por exemplo:
251 @c load("linearalgebra")$
252 @c diag_matrix(diag_matrix(1,2),diag_matrix(3,4));
256 (%i1) load("linearalgebra")$
258 (%i2) diag_matrix(diag_matrix(1,2),diag_matrix(3,4));
267 (%i3) diag_matrix(p,q);
275 @deffn {Função} dotproduct (@var{u}, @var{v})
277 Retorna o produto do ponto (produto escalar) dos vectores @var{u} e @var{v}. Isso é o mesmo
278 que @code{conjugate (transpose (@var{u})) . @var{v}}. Os argumentos @var{u} e @var{v} devem ser
283 @deffn {Função} eigens_by_jacobi (@var{A})
284 @deffnx {Função} eigens_by_jacobi (@var{A}, @var{tipo_corpo})
286 Calculam os autovalores e autovectores de @var{A} pelo método de rotações de Jacobi.
287 @var{A} deve ser uma matriz simétrica (mas essa matriz simétrica precisa não ser nem definida positiva e nem semidefinida positiva).
288 @var{tipo_corpo} indica o corpo computacional, pode ser ou @code{floatfield} ou @code{bigfloatfield}.
289 Se @var{tipo_corpo} não for especificado, o padrão é @code{floatfield}.
291 Os elementos de @var{A} devem ser números ou expressões que avaliam para números
292 via @code{float} ou @code{bfloat} (dependendo do valor de @var{tipo_corpo}).
296 @c load ("linearalgebra");
297 @c S : matrix ([1/sqrt(2), 1/sqrt(2)], [- 1/sqrt(2), 1/sqrt(2)]);
298 @c L : matrix ([sqrt(3), 0], [0, sqrt(5)]);
299 @c M : S . L . transpose (S);
300 @c eigens_by_jacobi (M);
301 @c float ([[sqrt(3), sqrt(5)], S]);
302 @c eigens_by_jacobi (M, bigfloatfield);
306 (%i1) load ("linearalgebra");
307 (%o1) /home/robert/tmp/maxima-head/maxima/share/linearalgebra/li\
309 (%i2) S : matrix ([1/sqrt(2), 1/sqrt(2)], [- 1/sqrt(2), 1/sqrt(2)]);
315 [ - ------- ------- ]
317 (%i3) L : matrix ([sqrt(3), 0], [0, sqrt(5)]);
321 (%i4) M : S . L . transpose (S);
322 [ sqrt(5) sqrt(3) sqrt(5) sqrt(3) ]
323 [ ------- + ------- ------- - ------- ]
326 [ sqrt(5) sqrt(3) sqrt(5) sqrt(3) ]
327 [ ------- - ------- ------- + ------- ]
329 (%i5) eigens_by_jacobi (M);
330 The largest percent change was 0.1454972243679
331 The largest percent change was 0.0
333 number of rotations: 1
334 (%o5) [[1.732050807568877, 2.23606797749979],
335 [ 0.70710678118655 0.70710678118655 ]
337 [ - 0.70710678118655 0.70710678118655 ]
338 (%i6) float ([[sqrt(3), sqrt(5)], S]);
339 (%o6) [[1.732050807568877, 2.23606797749979],
340 [ 0.70710678118655 0.70710678118655 ]
342 [ - 0.70710678118655 0.70710678118655 ]
343 (%i7) eigens_by_jacobi (M, bigfloatfield);
344 The largest percent change was 1.454972243679028b-1
345 The largest percent change was 0.0b0
347 number of rotations: 1
348 (%o7) [[1.732050807568877b0, 2.23606797749979b0],
349 [ 7.071067811865475b-1 7.071067811865475b-1 ]
351 [ - 7.071067811865475b-1 7.071067811865475b-1 ]
356 @deffn {Função} get_lu_factors (@var{x})
358 Quando @code{@var{x} = lu_factor (@var{A})}, então @code{get_lu_factors} retorna uma lista da
359 forma @code{[P, L, U]}, onde @var{P} é uma matriz de permutação, @var{L} é triangular baixa com
360 a diagonal preenchida com a unidade, e @var{U} é triangular alta, e @code{@var{A} = @var{P} @var{L} @var{U}}.
364 @deffn {Função} hankel (@var{col})
365 @deffnx {Função} hankel (@var{col}, @var{lin})
367 Retorna uma matriz de Hankel @var{H}. A primeira coluna de @var{H} é @var{col};
368 excepto para a primeira entrada, a última linha de @var{H} é @var{lin}. O
369 valor padrão para @var{lin} é o vector nulo com o mesmo comprimento que @var{col}.
373 @deffn {Função} hessian (@var{f},@var{vars})
375 Retorna a matriz hessiana de @var{f} com relação às variáveis na lista
376 @var{vars}. As entradas @var{i},@var{j} da matriz hessiana são
377 @var{diff(f vars[i],1,vars[j],1)}.
381 @deffn {Função} hilbert_matrix (@var{n})
383 Retorna the @var{n} by @var{n} matriz de Hilbert. Quando @var{n} não for um inteiro
384 positivo, emite uma mensagem de erro.
388 @deffn {Função} identfor (@var{M})
389 @deffnx {Função} identfor (@var{M}, @var{corpo})
391 Retorna uma matriz identidade que tem o mesmo tamanho que a matriz
392 @var{M}. As entradas de diagonal da matriz identidade são a
393 identidade multiplicativa do corpo @var{corpo}; o padrão para
394 @var{corpo} é @var{generalring}.
396 O primeiro argumento @var{M} pode ser uma matriz quadrada ou um
397 não matriz. Quando @var{M} for uma matriz, cada entrada de @var{M} pode ser uma
398 matriz quadrada -- dessa forma @var{M} pode ser uma matriz de bloco do Maxima. A
399 matriz pode ser de bloco para qualquer (finita) quantidade de níveis.
401 Veja também @code{zerofor}
405 @deffn {Função} invert_by_lu (@var{M}, @var{(rng generalring)})
407 Inverte a matriz @var{M} através de factorização linear alta (LU). A factorização LU
408 é concluída usando o anel @var{rng}.
412 @deffn {Função} kronecker_product (@var{A}, @var{B})
414 Retorna o produto de Kronecker das matrizes @var{A} e @var{B}.
418 @deffn {Função} listp (@var{e}, @var{p})
419 @deffnx {Função} listp (@var{e})
421 Recebendo um argumento opcional @var{p}, retorna @code{true} se @var{e} for
422 uma lista do Maxima e @var{p} avalia para @code{true} para elemento da lista.
423 Quando @code{listp} não recebe o argumento opcional, retorna @code{true} se @var{e} for
424 uma lista do Maxima. em todos os outros casos, retorna @code{false}.
428 @deffn {Função} locate_matrix_entry (@var{M}, @var{r_1}, @var{c_1}, @var{r_2}, @var{c_2}, @var{f}, @var{rel})
430 O primeiro argumento deve ser uma matriz; os argumentos que vão de
431 @var{r_1} até @var{c_2} determinam um sub-matriz de @var{M} que consiste de
432 linhas que vão de @var{r_1} até @var{r_2} e colunas que vão de @var{c_1} até @var{c_2}.
434 Encontra uma entrada na sub-matriz @var{M} que satisfaz alguma propriedade.
437 (1) @code{@var{rel} = 'bool} e @var{f} um predicado:
439 Examina a sub-matriz da esquerda para a direita e de cima para baixo,
440 e retorna o índice da primeira entrada que satisfizer o
441 predicado @var{f}. Se nenhuma entrada da matriz satisfizer o predicado @var{f}, retorna @code{false}.
443 (2) @code{@var{rel} = 'max} e @var{f} avaliar para um número real:
445 Examina a sub-matriz procurando por uma entrada que maximize @var{f}.
446 Retorna retorna o índice da entrada maximizada.
448 (3) @code{@var{rel} = 'min} e @var{f} avaliar para um número real:
450 Examina a sub-matriz procurando por uma entrada que minimize @var{f}.
451 Retorna o índice de uma entrada minimizada.
455 @deffn {Função} lu_backsub (@var{M}, @var{b})
457 Quando @code{@var{M} = lu_factor (@var{A}, @var{corpo})},
458 então @code{lu_backsub (@var{M}, @var{b})} resolve o sistema
459 linear @code{@var{A} @var{x} = @var{b}}.
463 @deffn {Função} lu_factor (@var{M}, @var{corpo})
465 Retorna uma lista da forma @code{[@var{LU}, @var{perm}, @var{corpo}]},
466 ou da forma @code{[@var{LU}, @var{perm}, @var{cmp}, @var{baixo-cnd} @var{alto-cnd}]}, onde
468 (1) A matriz @var{LU} contéa factorização de @var{M} na forma enpacotada. Forma
469 empacotada significa três coisas: Primeiro, as linhas de @var{LU} são permutadas confirme a
470 lista @var{perm}. Se, por exemplo, @var{perm} for a lista list @code{[3,2,1]}, a primeira linha actual
471 da factorização @var{LU} será a terceira linha da matriz @var{LU}. Segundo,
472 o factor triangular baixo de m é a parte triangular baixa de @var{LU} com as
473 entradas de diagonal todas substituídas pela unidade. Terceiro, o factor triangular alto de
474 @var{M} é a parte triangular alta de @var{LU}.
476 (2) Quando o corpo for ou @code{floatfield} ou @code{complexfield},
477 os números @var{baixo-cnd} e @var{alto-cnd} serão associados baixo e alto para o
478 número condicional de norma infinita de @var{M}. Para todos os corpos (fields), o número condicional de norma infinita
479 não pode ser estimado; para tais corpos, @code{lu_factor} retorna uma lista com dois itens.
480 Ambos o baixo e o alto associado podem diferir de seus verdadeiros valores de
481 factores arbitráriamente grandes. (Veja também @code{mat_cond}.)
483 O argumento @var{M} deve ser a matriz quadrada.
485 O argumento opcional @var{cmp} deve ser um símbolo que determine um anel ou corpo. Os corpos e anéis
488 (a) @code{generalring} -- o anel de expressões do Maxima,
489 (b) @code{floatfield} -- o corpo dos números em ponto flutuante do tipo de precisão dupla,
490 (c) @code{complexfield} -- o corpo dos números complexos em ponto flutuante do
491 tipo de precisão dupla,
492 (d) @code{crering} -- o anel das expressões racionais canónicas (CRE) do Maxima,
493 (e) @code{rationalfield} -- o corpo dos números racionais,
494 (f) @code{runningerror} -- rastro de todos os erros de arredondamento de números em ponto flutuante,
495 (g) @code{noncommutingring} -- o anel de expressões do Maxima onde multiplicação for o
496 operador ponto não comutativo.
498 Quando o corpo for @code{floatfield}, @code{complexfield}, ou
499 @code{runningerror}, o algoritmo usa pivotagem parcial; para todos
500 os outros corpos, linhas são comutadas somente quando necessário para evitar um piv@^o
503 A adição aritmética em ponto flutuante não é associativa, então o significado
504 de 'corpo' difere da definição matemática.
506 Um membro do corpo @code{runningerror} é uma lista do Máxima de dois membros
507 da forma @code{[x,n]},onde @var{x} é um número em onto flutuante e
508 @code{n} é um inteiro. A diferença relativa entre o valor de
509 'verdadeiro' de @code{x} e @code{x} é aproximadamente associado pelo épsilon da
510 máquina vezes @code{n}. O erro de execução associado arrasta alguns termos
511 da ordem do quadrado do épsilon da máquina.
513 Não existe interface de utilizador definida um novo anel. Um utilizador que estiver
514 familiazrizado com o Lisp Comum está apto para definir um novo corpo. Para fazer
515 isso, um utilizador deve definir funções para as operações aritméticas e
516 funções para conversão para a representação de corpo do Máxima e
517 vice-versa. Adicionalmente, para corpos ordenados (onde a pivotagem parcial será
518 usada), um uduário deve definir funções para módulo e para
519 comparar membros do corpo. Após isso tudo que resta é definir uma
520 estrutura de Lisp Comum @code{mring}. O ficheiro @code{mring} tem muitos
523 Para calcular a factorização, a primeira tarefa é converter cada entrada de
524 matriz para um elemento do corpo indicado. Quando a cnversão não for
525 possível, a factorização encerra com uma mensagem de erro. Elementos do
526 corpo não precisam ser expressões do Maxima. Elementos do
527 @code{complexfield}, por exemplo, são números complexos do Lisp Comum. Dessa forma
528 após calcular a factorização, como entradas da matriz devem ser
529 convertidas para expressões do Maxima.
531 Veja também @code{get_lu_factors}.
535 @c load ("linearalgebra");
536 @c w[i,j] := random (1.0) + %i * random (1.0);
538 @c M : genmatrix (w, 100, 100)$
539 @c lu_factor (M, complexfield)$
540 @c lu_factor (M, generalring)$
542 @c M : matrix ([1 - z, 3], [3, 8 - z]);
543 @c lu_factor (M, generalring);
544 @c get_lu_factors (%);
545 @c %[1] . %[2] . %[3];
548 (%i1) load ("linearalgebra");
549 Warning - you are redefining the Maxima function require_list
550 Warning - you are redefining the Maxima function matrix_size
551 Warning - you are redefining the Maxima function rank
552 (%o1) /usr/local/share/maxima/5.9.2/share/linearalgebra/linearalgebra.mac
553 (%i2) w[i,j] := random (1.0) + %i * random (1.0);
554 (%o2) w := random(1.) + %i random(1.)
556 (%i3) showtime : true$
557 Evaluation took 0.00 seconds (0.00 elapsed)
558 (%i4) M : genmatrix (w, 100, 100)$
559 Evaluation took 7.40 seconds (8.23 elapsed)
560 (%i5) lu_factor (M, complexfield)$
561 Evaluation took 28.71 seconds (35.00 elapsed)
562 (%i6) lu_factor (M, generalring)$
563 Evaluation took 109.24 seconds (152.10 elapsed)
564 (%i7) showtime : false$
566 (%i8) M : matrix ([1 - z, 3], [3, 8 - z]);
570 (%i9) lu_factor (M, generalring);
573 (%o9) [[ 3 9 ], [1, 2]]
574 [ ----- - z - ----- + 8 ]
576 (%i10) get_lu_factors (%);
579 (%o10) [[ ], [ 3 ], [ 9 ]]
580 [ 0 1 ] [ ----- 1 ] [ 0 - z - ----- + 8 ]
582 (%i11) %[1] . %[2] . %[3];
590 @deffn {Função} mat_cond (@var{M}, 1)
591 @deffnx {Função} mat_cond (@var{M}, inf)
593 Retorna o número condiciona da norma de ordem @var{p} da matriz
594 @var{m}. Os valores permitidos para @var{p} são 1 e @var{inf}. Essa
595 função utiliza a factorização linear alta para inverter a matriz @var{m}. Dessa forma
596 o tempode execução para @code{mat_cond} é proporcional ao cubo do
597 tamanho da matriz; @code{lu_factor} determina as associaçãoes baixa e alta
598 para o número de condição de norma infinita em tempo proporcional ao
599 quadrado do tamanho da matriz.
603 @deffn {Função} mat_norm (@var{M}, 1)
604 @deffnx {Função} mat_norm (@var{M}, inf)
605 @deffnx {Função} mat_norm (@var{M}, frobenius)
607 Retorna a matriz de norma @var{p} da matriz @var{M}. Os valores permitidos para @var{p} são
608 1, @code{inf}, e @code{frobenius} (a norma da matriz de Frobenius). A matriz @var{M} pode ser
609 uma matriz não de bloco.
613 @deffn {Função} matrixp (@var{e}, @var{p})
614 @deffnx {Função} matrixp (@var{e})
616 Fornecendo um argumento opcional @var{p}, @code{matrixp} retorna @code{true} se @var{e} for
617 uma matriz e @var{p} avaliar para @code{true} para todo elemento da matriz.
618 Quando a @code{matrixp} não for fornecido umargumento opcional, retorna @code{true}
619 se @code{e} for uma matriz. em todos os outros casos, retorna @code{false}.
621 Veja também @code{blockmatrixp}
625 @deffn {Função} matrix_size (@var{M})
627 Retorna uma lista com dois elementos que fornecem o número de linhas e colunas, respectivamente
632 @deffn {Função} mat_fullunblocker (@var{M})
634 Se @var{M} for uma matriz de bloco, expande todos os blocos da matriz em todos os níveis. Se @var{M} for uma matriz,
635 retorna @var{M}; de outra forma, emite uma mensagem de erro.
637 @c precisa de exemplo aqui
641 @deffn {Função} mat_trace (@var{M})
643 Retorna o traço da matriz @var{M}. Se @var{M} não for uma matriz, retorna uma
644 forma substantiva. Quando @var{M} for uma matriz de bloco, @code{mat_trace(M)} retorna
645 o mesmo valor retornado por @code{mat_trace(mat_unblocker(m))}.
649 @deffn {Função} mat_unblocker (@var{M})
651 Se @var{M} for uma matriz de bloco, @code{mat_unbloker} desfaz o bloco de @var{M} um nível. Se @var{M} for uma matriz,
652 @code{mat_unblocker (M)} retorna @var{M}; de outra forma, emite uma mensagem de erro.
654 Dessa forma se cada entrada de @var{M} for matriz, @code{mat_unblocker (M)} retorna uma
655 matriz "desblocada", mas se cada entrada de @var{M} for uma matriz de bloco, @code{mat_unblocker (M)}
656 retorna uma matriz de bloco com um nível de bloco a menos.
658 Se usar matrizes de bloco, muito provavelmente irá querer escolher @code{matrix_element_mult} para
659 @code{"."} e @code{matrix_element_transpose} para @code{'transpose}. Veja também @code{mat_fullunblocker}.
664 @c load ("linearalgebra");
665 @c A : matrix ([1, 2], [3, 4]);
666 @c B : matrix ([7, 8], [9, 10]);
668 @c mat_unblocker (%);
671 (%i1) load ("linearalgebra");
672 Warning - you are redefining the Maxima function require_list
673 Warning - you are redefining the Maxima function matrix_size
674 Warning - you are redefining the Maxima function rank
675 (%o1) /usr/local/share/maxima/5.9.2/share/linearalgebra/linearalgebra.mac
676 (%i2) A : matrix ([1, 2], [3, 4]);
680 (%i3) B : matrix ([7, 8], [9, 10]);
684 (%i4) matrix ([A, B]);
688 (%i5) mat_unblocker (%);
696 @deffn {Função} nonnegintegerp (@var{n})
698 Retorna @code{true} se e somente se @code{@var{n} >= 0} e @var{n} for um inteiro.
702 @deffn {Função} nullspace (@var{M})
704 Se @var{M} for uma matriz, retorna @code{span (v_1, ..., v_n)}, onde o conjunto @code{@{v_1, ..., v_n@}}
705 é uma base para o espaço nulo de @var{M}. A diferença entre o maior elemento e o menor elemento do conjunto vazio é @code{@{0@}}.
706 Dessa forma, quando o espaço nulo tiver somente um membro, retorna @code{span ()}.
710 @deffn {Função} nullity (@var{M})
712 Se @var{M} for uma matriz, retorna a dimensão do espaço nulo de @var{M}.
716 @deffn {Função} orthogonal_complement (@var{v_1}, ..., @var{v_n})
718 Retorna @code{span (u_1, ..., u_m)}, onde o conjunto @code{@{u_1, ..., u_m@}} é uma
719 base para o complemento ortogonal do conjunto @code{(v_1, ..., v_n)}.
721 Cada vector no intervalo de @var{v_1} até @var{v_n} deve ser um vector coluna.
725 @deffn {Função} polynomialp (@var{p}, @var{L}, @var{coeffp}, @var{exponp})
726 @deffnx {Função} polynomialp (@var{p}, @var{L}, @var{coeffp})
727 @deffnx {Função} polynomialp (@var{p}, @var{L})
729 Retorna @code{true} se @var{p} for um polinómio nas variáveis da lista @var{L},
730 O predicado @var{coeffp} deve avaliar para @code{true} para cada
731 coeficiente, e o predicado @var{exponp} deve avaliar para @code{true} para todos os
732 expoentes das variáveis na lista @var{L}. Se quiser usar um valor
733 personalizado para @var{exponp}, deverá fornecer @var{coeffp} com um valor mesmo se quiser
734 o valor padrão para @var{coeffp}.
736 @c WORK THE FOLLOWING INTO THE PRECEDING
737 @code{polynomialp (@var{p}, @var{L}, @var{coeffp})} é equivalente a
738 @code{polynomialp (@var{p}, @var{L}, @var{coeffp}, 'nonnegintegerp)}.
740 @code{polynomialp (@var{p}, @var{L})} é equivalente a
741 @code{polynomialp (@var{p}, L@var{,} 'constantp, 'nonnegintegerp)}.
743 O polinómio não precisa ser expandido:
746 @c load ("linearalgebra");
747 @c polynomialp ((x + 1)*(x + 2), [x]);
748 @c polynomialp ((x + 1)*(x + 2)^a, [x]);
751 (%i1) load ("linearalgebra");
752 Warning - you are redefining the Maxima function require_list
753 Warning - you are redefining the Maxima function matrix_size
754 Warning - you are redefining the Maxima function rank
755 (%o1) /usr/local/share/maxima/5.9.2/share/linearalgebra/linearalgebra.mac
756 (%i2) polynomialp ((x + 1)*(x + 2), [x]);
758 (%i3) polynomialp ((x + 1)*(x + 2)^a, [x]);
762 Um exemplo usando um valor personalizado para @code{coeffp} e para @code{exponp}:
765 @c load ("linearalgebra");
766 @c polynomialp ((x + 1)*(x + 2)^(3/2), [x], numberp, numberp);
767 @c polynomialp ((x^(1/2) + 1)*(x + 2)^(3/2), [x], numberp, numberp);
770 (%i1) load ("linearalgebra");
771 Warning - you are redefining the Maxima function require_list
772 Warning - you are redefining the Maxima function matrix_size
773 Warning - you are redefining the Maxima function rank
774 (%o1) /usr/local/share/maxima/5.9.2/share/linearalgebra/linearalgebra.mac
775 (%i2) polynomialp ((x + 1)*(x + 2)^(3/2), [x], numberp, numberp);
777 (%i3) polynomialp ((x^(1/2) + 1)*(x + 2)^(3/2), [x], numberp, numberp);
781 Polinómios com duas variáveis:
784 @c load ("linearalgebra");
785 @c polynomialp (x^2 + 5*x*y + y^2, [x]);
786 @c polynomialp (x^2 + 5*x*y + y^2, [x, y]);
789 (%i1) load ("linearalgebra");
790 Warning - you are redefining the Maxima function require_list
791 Warning - you are redefining the Maxima function matrix_size
792 Warning - you are redefining the Maxima function rank
793 (%o1) /usr/local/share/maxima/5.9.2/share/linearalgebra/linearalgebra.mac
794 (%i2) polynomialp (x^2 + 5*x*y + y^2, [x]);
796 (%i3) polynomialp (x^2 + 5*x*y + y^2, [x, y]);
802 @deffn {Função} polytocompanion (@var{p}, @var{x})
804 Se @var{p} for um polinómio em @var{x}, retorna a atriz companheira de @var{p}. Para
805 um polinómio m@^onico @var{p} de grau @var{n},
806 temos @code{@var{p} = (-1)^@var{n} charpoly (polytocompanion (@var{p}, @var{x}))}.
808 Quando @var{p} não for um polinómio em @var{x}, emite uma mensagem de erro.
812 @deffn {Função} ptriangularize (@var{M}, @var{v})
814 Se @var{M} for uma matriz onde cada entrada dessa matriz for um polinómio em @var{v}, retorna
815 a matriz @var{M2} tal que
817 (1) @var{M2} é triangular alta,
819 (2) @code{@var{M2} = @var{E_n} ... @var{E_1} @var{M}},
820 onde os elemetnos de @var{E_1} a @var{E_n} são matrizes elementares
821 cujas entrada são polinómios em @var{v},
823 (3) @code{|det (@var{M})| = |det (@var{M2})|},
825 Nota: Essa função não verifica se toda entrada é um polinómio em @var{v}.
829 @deffn {Função} rowop (@var{M}, @var{i}, @var{j}, @var{theta})
831 Se @var{M} for uma matriz, retorna a matriz que resulta de se fazer a
832 operação de linha @code{R_i <- R_i - theta * R_j}. Se @var{M} não tiver uma linha
833 @var{i} ou @var{j}, emite uma mensagem de erro.
837 @deffn {Função} rank (@var{M})
839 Retorna o ranque daquela matriz @var{M}. O rank é a dimensão do
840 espaço coluna. Exemplo:
842 @c load ("linearalgebra")$
843 @c rank(matrix([1,2],[2,4]));
844 @c rank(matrix([1,b],[c,d]));
847 (%i1) load ("linearalgebra")$
848 WARNING: DEFUN/DEFMACRO: redefining function $COPY in
849 /share/maxima/5.11.0/share/linearalgebra/linalg-utilities.lisp,
851 /maxima-5.11.0/src/binary-clisp/comm2.fas
852 (%i2) rank(matrix([1,2],[2,4]));
854 (%i3) rank(matrix([1,b],[c,d]));
855 Proviso: @{d - b c # 0@}
862 @deffn {Função} rowswap (@var{M}, @var{i}, @var{j})
864 Se @var{M} for uma matriz, permuta as linha @var{i} e @var{j}. Se @var{M} não tiver uma linha
865 @var{i} ou @var{j}, emite uma mensagem de erro.
869 @deffn {Função} toeplitz (@var{col})
870 @deffnx {Função} toeplitz (@var{col}, @var{lin})
872 Retorna uma matriz de Toeplitz @var{T}. a primeira coluna de @var{T} é @var{col};
873 excepto para a primeira entrada, a primeira linha de @var{T} é @var{lin}. O
874 padrão para @var{lin} é o conjugado complexo de @var{col}. Exemplo:
876 @c load("linearalgebra")$
877 @c toeplitz([1,2,3],[x,y,z]);
878 @c toeplitz([1,1+%i]);
881 (%i1) load("linearalgebra")$
883 (%i2) toeplitz([1,2,3],[x,y,z]);
890 (%i3) toeplitz([1,1+%i]);
899 @deffn {Função} vandermonde_matrix ([@var{x_1}, ..., @var{x_n}])
901 Retorna uma matriz @var{n} por @var{n} cuja @var{i}-ésima linha é
902 @code{[1, @var{x_i}, @var{x_i}^2, ... @var{x_i}^(@var{n}-1)]}.
906 @deffn {Função} zerofor (@var{M})
907 @deffnx {Função} zerofor (@var{M}, @var{fld})
909 Retorna uma matriz zero que tem o mesmo tamanho da matriz
910 @var{M}. Toda entrada da matriz zero é a
911 identidade aditiva do anel @var{fld}; o valor padrão para
912 @var{fld} é @var{generalring}.
914 O primeiro argumento @var{M} pode ser uma matriz quadrada ou uma
915 não matriz. Quando @var{M} for uma matriz, cada entrada de @var{M} pode ser uma
916 matriz quadrada -- dessa forma @var{M} pode ser uma matriz de bloco do Maxima. A
917 matriz pode ser de bloco para qualquer nível (finito).
919 Veja também @code{identfor}
923 @deffn {Função} zeromatrixp (@var{M})
925 Se @var{M} não for uma matriz de bloco, retorna @code{true} se @code{is (equal (@var{e}, 0))}
926 for verdadeiro para cada elemento @var{e} da matriz @var{M}. Se @var{M} for uma matriz de bloco, retorna
927 @code{true} se @code{zeromatrixp} avaliar para @code{true} para cada elemento de @var{e}.