1 @c /orthopoly.texi/1.10/Fri Mar 2 00:44:47 2007//
3 * Introdução a polinómios ortogonais::
4 * Definições para polinómios ortogonais::
7 @node Introdução a polinómios ortogonais, Definições para polinómios ortogonais, orthopoly, orthopoly
8 @section Introdução a polinómios ortogonais
10 @code{orthopoly} é um pacote para avaliação simbólica e numérica de
11 muitos tipos de polinómios ortogonais, incluindo polinómios de Chebyshev,
12 Laguerre, Hermite, Jacobi, Legendre, e ultraesférico
13 (Gegenbauer). Adicionalmentey, @code{orthopoly} inclui suporte funções esféricas segundo o critério de
14 Bessel, esféricas segundo o critério de Hankel, e funções harm@^onica esféricas.
16 Em sua maior parte, @code{orthopoly} segue as convenções de Abramowitz e Stegun
17 @i{Handbook of Mathematical Functions}, Chapter 22 (10th printing, December 1972);
18 adicionalmente, usamos Gradshteyn e Ryzhik,
19 @i{Table of Integrals, Series, and Products} (1980 corrected and
20 enlarged edition), e Eugen Merzbacher @i{Quantum Mechanics} (2nd edition, 1970).
22 @c INSTALLATION INSTRUCTIONS NO LONGER RELEVANT
23 @c BUT MAYBE SOME OF THESE FILES SHOULD BE MENTIONED IN ANOTHER CONTEXT
24 @c This will create a directory @code{orthopoly_x} (again x is the release
25 @c identifier) that contains the source file @code{orthopoly.lisp}, user
26 @c documentation in html and texi formats, a sample maxima initialization file
27 @c @code{orthopoly-init.lisp}, a README file, a testing routine
28 @c @code{test_orthopoly.mac}, and two demonstration files.
30 @c Start Maxima and compile orthopoly. To do this, use the command
32 @c (c1) compile_file("orthopoly.lisp");
34 Barton Willis da University de Nebraska e Kearney (UNK) escreveu
35 o pacote @code{orthopoly} e sua documetação. O pacote
36 é liberado segundo a licença pública geral GNU (GPL).
38 @subsection Iniciando com orthopoly
40 @code{load (orthopoly)} torna o pacote @code{orthopoly} disponível para uso.
42 Para encontrar o polinómio de Legendre de terceira ordem,
48 (%i1) legendre_p (3, x);
51 (%o1) - ---------- + ----------- - 6 (1 - x) + 1
55 Para expressar esse polinómio como uma soma de potências de @var{x}, aplique @var{ratsimp} ou @var{rat}
56 para o resultado anterior.
58 @c CONTINUING PREVIOUS EXAMPLE HERE
60 @c [ratsimp (%), rat (%)];
63 (%i2) [ratsimp (%), rat (%)];
66 (%o2)/R/ [----------, ----------]
70 Alternativamente, faça o segundo argumento para @code{legendre_p} (sua variável ``principal'')
71 uma expressão racional canónica (CRE) usando @code{rat(x)} em lugar de somente @code{x}.
74 @c legendre_p (3, rat (x));
77 (%i1) legendre_p (3, rat (x));
84 Para avaliação em ponto flutuante, @code{orthopoly} usa uma análise de erro durante a execução
85 para estimar uma associação superior para o erro. Por exemplo,
88 @c jacobi_p (150, 2, 3, 0.2);
91 (%i1) jacobi_p (150, 2, 3, 0.2);
92 (%o1) interval(- 0.062017037936715, 1.533267919277521E-11)
95 intervalos possuem a forma @code{interval (@var{c}, @var{r})}, onde @var{c} é o
96 centro e @var{r} é o raio do intervalo. Uma vez que Maxima
97 não suporta aritmética sobre intervalos, em algumas situações, tais
98 como em gráficos, vai querer suprimir o erro e sair somente com o
99 centro do intervalo. Para fazer isso, escolha a variável de
100 opção @code{orthopoly_returns_intervals} para @code{false}.
103 @c orthopoly_returns_intervals : false;
104 @c jacobi_p (150, 2, 3, 0.2);
107 (%i1) orthopoly_returns_intervals : false;
109 (%i2) jacobi_p (150, 2, 3, 0.2);
110 (%o2) - 0.062017037936715
113 Veja a secção @pxref{Avaliação em Ponto Flutuante} para maiores informações.
115 Muitas funções em @code{orthopoly} possuem uma propriedade @code{gradef}; dessa forma
118 @c diff (hermite (n, x), x);
119 @c diff (gen_laguerre (n, a, x), x);
122 (%i1) diff (hermite (n, x), x);
125 (%i2) diff (gen_laguerre (n, a, x), x);
127 n L (x) - (n + a) L (x) unit_step(n)
129 (%o2) ------------------------------------------
133 A função de um único passo no segundo exemplo previne um erro que poderia
134 de outra forma surgir através da avaliação de @var{n} para 0.
136 @c CONTINUING PREVIOUS EXAMPLE HERE
145 A propriedade @code{gradef} somente aplica para a variável ``principal''; dderivadas com
146 relação a outros argumentos usualmente resultam em uma mensagem de erro; por exemplo
149 @c diff (hermite (n, x), x);
150 @c diff (hermite (n, x), n);
153 (%i1) diff (hermite (n, x), x);
156 (%i2) diff (hermite (n, x), n);
158 Maxima doesn't know the derivative of hermite with respect the first argument
159 -- an error. Quitting. To debug this try debugmode(true);
162 Geralmente, funções em @code{orthopoly} mapeiam sobre listas e matrizes. Para
163 o mapeamento para avaliação total, as variáveis de opção
164 @code{doallmxops} e @code{listarith} devem ambas serem @code{true} (o valor padrão).
165 Para ilustrar o mapeamento sobre matrizes, considere
169 @c m : matrix ([0, x], [y, 0]);
173 (%i1) hermite (2, x);
176 (%i2) m : matrix ([0, x], [y, 0]);
180 (%i3) hermite (2, m);
182 [ - 2 - 2 (1 - 2 x ) ]
185 [ - 2 (1 - 2 y ) - 2 ]
188 No segundo exemplo, o elemento @code{i, j} do valor
189 é @code{hermite (2, m[i,j])}; isso não é o mesmo que calcular
190 @code{-2 + 4 m . m}, como visto no próximo exemplo.
192 @c CONTINUING PREVIOUS EXAMPLE HERE
194 @c -2 * matrix ([1, 0], [0, 1]) + 4 * m . m;
197 (%i4) -2 * matrix ([1, 0], [0, 1]) + 4 * m . m;
203 Se avaliar uma função em um ponto fora do seu domínio, geralmente
204 @code{orthopoly} retorna uma função não avaliada. Por exemplo,
207 @c legendre_p (2/3, x);
210 (%i1) legendre_p (2/3, x);
215 @code{orthopoly} suporta tradução em TeX; @code{orthopoly} também faz saídas
216 bidimensionais em um terminal.
219 @c spherical_harmonic (l, m, theta, phi);
221 @c jacobi_p (n, a, a - b, x/2);
225 (%i1) spherical_harmonic (l, m, theta, phi);
230 $$Y_@{l@}^@{m@}\left(\vartheta,\varphi\right)$$
232 (%i3) jacobi_p (n, a, a - b, x/2);
237 $$P_@{n@}^@{\left(a,a-b\right)@}\left(@{@{x@}\over@{2@}@}\right)$$
241 @subsection Limitations
243 Quando uma expressão envolve muitos polinómios ortogonais com ordens
244 simbólicas, é possível que a expressão actualmente
245 tenda para zero, e ainda ocorre também que Maxima estar incapacitado
246 de simplificar essa expressão para zero. Se fizer uma divisão por
247 tal quantidade que tende a zero, poderá ficar em apuros. Por exemplo,
248 a seguinte expressão tende para zero para inteiros @var{n} maiores que
249 1, e ainda ocorre também que Maxima está incapacitado de simplificar
250 essa expressão para zero.
253 @c (2*n - 1) * legendre_p (n - 1, x) * x - n * legendre_p (n, x) + (1 - n) * legendre_p (n - 2, x);
256 (%i1) (2*n - 1) * legendre_p (n - 1, x) * x - n * legendre_p (n, x) + (1 - n) * legendre_p (n - 2, x);
257 (%o1) (2 n - 1) P (x) x - n P (x) + (1 - n) P (x)
261 Para um @var{n} específico, podemos reduzir a expressão a zero.
263 @c CONTINUING PREVIOUS EXAMPLE HERE
265 @c ev (% ,n = 10, ratsimp);
268 (%i2) ev (% ,n = 10, ratsimp);
272 Geralmente, a forma polinomial de um polinómio ortogonal esteja adequada de forma hostil
273 para avaliaçao em ponto flutuante. Aqui está um exemplo.
275 @c ACTUALLY NEEDS load(orthopoly); BEFORE ANYTHING ELSE
277 @c p : jacobi_p (100, 2, 3, x)$
278 @c subst (0.2, x, p);
279 @c jacobi_p (100, 2, 3, 0.2);
280 @c float(jacobi_p (100, 2, 3, 2/10));
283 (%i1) p : jacobi_p (100, 2, 3, x)$
285 (%i2) subst (0.2, x, p);
286 (%o2) 3.4442767023833592E+35
287 (%i3) jacobi_p (100, 2, 3, 0.2);
288 (%o3) interval(0.18413609135169, 6.8990300925815987E-12)
289 (%i4) float(jacobi_p (100, 2, 3, 2/10));
290 (%o4) 0.18413609135169
293 O verdadeiro valor está em torno de 0.184; ess calculo suporta erro de
294 cancelamento por extremo subtrativo.Expandindo o polinómio e então
295 avaliando, fornecendo um melhor resultado.
296 @c CONTINUING PREVIOUS EXAMPLE HERE
299 @c subst (0.2, x, p);
303 (%i6) subst (0.2, x, p);
304 (%o6) 0.18413609766122982
307 Essa não é uma regra geral; expandindo o polinómio não resulta sempre
308 em expressões que são melhores adaptadas a avaliação numérica.
309 Com grande folga, o melhor caminho para fazer avaliação numérica é fazer um ou mais
310 argumentos da função serem números em ponto flutuante. Em função disso,
311 algoritmos especializados em ponto flutuante são usados para avaliação.
313 A função @code{float} do Maxima é até certo ponto indiscriminada; se aplicar
314 @code{float} a uma expressão envolvendo um polinómio ortogonal com um
315 grau simbólico ou um parâmetro de ordem, esses parâmetos (inteiros) podem ser
316 convertido em números em ponto flutuante; após o que, a expressão não irá avaliar
317 completamente. Considere
320 @c assoc_legendre_p (n, 1, x);
322 @c ev (%, n=2, x=0.9);
325 (%i1) assoc_legendre_p (n, 1, x);
333 (%i3) ev (%, n=2, x=0.9);
339 A expressão em (%o3) não irá avaliar para um número em ponto flutuante; @code{orthopoly} não
340 reconhece valores em ponto flutuante em lugares onde deve haver valores inteiros. Similarmente,
341 avaliação numérica da função @code{pochhammer} para ordens que
342 excedam @code{pochhammer_max_index} pode ser perturbador; considere
345 @c x : pochhammer (1, 10), pochhammer_max_index : 5;
348 (%i1) x : pochhammer (1, 10), pochhammer_max_index : 5;
353 Aplicando @code{float} não avalia @var{x} para um número em ponto flutuante
355 @c CONTINUING PREVIOUS EXAMPLE HERE
365 Para avaliar @var{x} para um número em ponto flutuante, irá precisar associar
366 @code{pochhammer_max_index} a 11 ou mais e aplicar @code{float} a @var{x}.
368 @c CONTINUING PREVIOUS EXAMPLE HERE
370 @c float (x), pochhammer_max_index : 11;
373 (%i3) float (x), pochhammer_max_index : 11;
377 O valor padrão de @code{pochhammer_max_index} é 100;
378 modifique esse valor após chama @code{orthopoly}.
380 Finalmente, tenha consciência que os livros citados nas referências adotam diferentes definições de
381 polinómios ortogonais; geralmente adotamos as convenções
382 citadas nas convenções de Abramowitz e Stegun.
384 Antes de suspeitar de um erro no pacote @code{orthopoly}, verifique alguns casos especiais
385 para determinar se suas definições coincidem com aquelas usadas por @code{orthopoly}.
386 Definitions muitas vezes diferem por uma normalização; ocasionalmente, autores
387 utilizam versões ``modificadas'' das funções que fazem a família
388 ortogonal sobre um intervalo diferente do intervalo @math{(-1, 1)}. Para definir, por exemplo,
389 um polinómio de Legendre que é ortogonal a @math{(0, 1)}, defina
392 @c shifted_legendre_p (n, x) := legendre_p (n, 2*x - 1)$
393 @c shifted_legendre_p (2, rat (x));
394 @c legendre_p (2, rat (x));
397 (%i1) shifted_legendre_p (n, x) := legendre_p (n, 2*x - 1)$
399 (%i2) shifted_legendre_p (2, rat (x));
401 (%o2)/R/ 6 x - 6 x + 1
402 (%i3) legendre_p (2, rat (x));
409 @anchor{Avaliação em Ponto Flutuante}
410 @subsection Avaliação em Ponto Flutuante
412 Muitas funções em @code{orthopoly} utilizam análise de erro durante a execução para
413 estimar o erro em avaliações em ponto flutuante; as
414 exceções são funções de Bessel esféricas e os polinómios associados de
415 Legendre do segundo tipo. Para avaliações numéricas, as funções
416 de Bessel esféricas chamam funções da colecção de programas @code{SLATEC}. Nenhum método especializado é usado
417 para avaliação numérica dos polinómios associados de Legendre do
420 A análise de erro durante a execução ignora erros que são de segunda ordem ou maior
421 na máquina (também conhecida como perda de algarismos). A análise de erro durante a execução também
422 ignora alguns poucos outros tipos de erro. É possível (embora não provável)
423 que o erro actual exceda o estimado.
425 Intervalos possuem a forma @code{interval (@var{c}, @var{r})}, onde @var{c} é o centro
426 do intervalo e @var{r} é seu raio. O
427 centro de um intervalo pode sr um número complexo, e o raio é sempre um número real positivo.
429 Aqui está um exemplo.
433 @c y0 : jacobi_p (100, 2, 3, 0.2);
434 @c y1 : bfloat (jacobi_p (100, 2, 3, 1/5));
440 (%i2) y0 : jacobi_p (100, 2, 3, 0.2);
441 (%o2) interval(0.1841360913516871, 6.8990300925815987E-12)
442 (%i3) y1 : bfloat (jacobi_p (100, 2, 3, 1/5));
443 (%o3) 1.8413609135168563091370224958913493690868904463668b-1
446 Vamos testar o quanto o erro actual é é menor que o erro estimado
448 @c CONTINUING PREVIOUS EXAMPLE HERE
450 @c is (abs (part (y0, 1) - y1) < part (y0, 2));
453 (%i4) is (abs (part (y0, 1) - y1) < part (y0, 2));
457 Realmente, por esse exemplo o erro estimado é um maior que
460 Maxima não suporta aritmética sobre intervalos.
463 @c legendre_p (7, 0.1) + legendre_p (8, 0.1);
466 (%i1) legendre_p (7, 0.1) + legendre_p (8, 0.1);
467 (%o1) interval(0.18032072148437508, 3.1477135311021797E-15)
468 + interval(- 0.19949294375000004, 3.3769353084291579E-15)
471 Um utilizador pode definir operadores aritméticos que fazem matemática de intervalos. Para
472 definir adição de intervalos, podemos definir
476 @c "@+"(x,y) := interval (part (x, 1) + part (y, 1), part (x, 2) + part (y, 2))$
477 @c legendre_p (7, 0.1) @+ legendre_p (8, 0.1);
482 (%i2) "@@+"(x,y) := interval (part (x, 1) + part (y, 1), part (x, 2) + part (y, 2))$
484 (%i3) legendre_p (7, 0.1) @@+ legendre_p (8, 0.1);
485 (%o3) interval(- 0.019172222265624955, 6.5246488395313372E-15)
488 As rotinas eseciais em ponto flutuante são chamadas quando os argumentos
489 forem complexos. Por exemplo,
492 @c legendre_p (10, 2 + 3.0*%i);
495 (%i1) legendre_p (10, 2 + 3.0*%i);
496 (%o1) interval(- 3.876378825E+7 %i - 6.0787748E+7,
497 1.2089173052721777E-6)
500 Let's compare this to the true value.
503 @c float (expand (legendre_p (10, 2 + 3*%i)));
506 (%i1) float (expand (legendre_p (10, 2 + 3*%i)));
507 (%o1) - 3.876378825E+7 %i - 6.0787748E+7
510 Adicionalmente, quando os argumentos forem grandes números em ponto flutuante, as rotinas especiais
511 de ponto flutuante são chamadas; todavia, tos grandes números em ponto flutuante são convertidos para números em ponto flutuante de dupla precisão
512 e o resultado final é número em ponto flutuante de precisão dupla.
515 @c ultraspherical (150, 0.5b0, 0.9b0);
518 (%i1) ultraspherical (150, 0.5b0, 0.9b0);
519 (%o1) interval(- 0.043009481257265, 3.3750051301228864E-14)
522 @subsection Gráficos e @code{orthopoly}
524 Para desenhar gráficos de expressões que envolvem polinómios
525 ortogonais, deverá fazer duas coisas:
528 Escolher a variável de opção @code{orthopoly_returns_intervals} para @code{false},
530 Colocar apóstrofo em qualquer chamada a funções do pacote @code{orthopoly}.
532 Se chamadas a funções não receberem apóstrofo, Maxima irá avaliá-las para polinómios antes
533 de montar o gráfico; consequêntemente, as rotinas especializadas em ponto flutuante não serão chamadas.
534 Aqui está um exemplo de como montar o gráfico de uma expressão que envolve
535 um polinómio de Legendre.
538 @c plot2d ('(legendre_p (5, x)), [x, 0, 1]), orthopoly_returns_intervals : false;
541 (%i1) plot2d ('(legendre_p (5, x)), [x, 0, 1]), orthopoly_returns_intervals : false;
549 A expressão @i{completa} @code{legendre_p (5, x)} recebe apóstrofo; isso é
550 diferente de apenas colocar apóstrofo no nome da função usando @code{'legendre_p (5, @var{x})}.
552 @subsection Funções Diversas
554 O pacote @code{orthopoly} define o
555 síbolo de Pochhammer e uma função de passo de unidade. @code{orthopoly} utiliza
556 a função delta de Kronecker e a função de passo de unidade em
557 declarações @code{gradef}.
559 Para converter os símbolos Pochhammer em quocientes da funções gama,
560 use @code{makegamma}.
563 @c makegamma (pochhammer (x, n));
564 @c makegamma (pochhammer (1/2, 1/2));
567 (%i1) makegamma (pochhammer (x, n));
571 (%i2) makegamma (pochhammer (1/2, 1/2));
577 Derivadas de símbolos de Pochhammer são fornecidas em termos de @code{psi}
581 @c diff (pochhammer (x, n), x);
582 @c diff (pochhammer (x, n), n);
585 (%i1) diff (pochhammer (x, n), x);
586 (%o1) (x) (psi (x + n) - psi (x))
588 (%i2) diff (pochhammer (x, n), n);
589 (%o2) (x) psi (x + n)
593 É preciso ser cuidadoso com expressões como (%o1); a diferença das
594 funções @code{psi} possuem polinómios quando @code{@var{x} = -1, -2, .., -@var{n}}. Esses polinómios
595 cacelam-se com factores em @code{pochhammer (@var{x}, @var{n})} fazendo da derivada um polinómio
596 de grau @code{@var{n} - 1} quando @var{n} for um inteiro positivo.
598 O símbolo de Pochhammer é definido de ordens negativas até sua
599 representação como um quociente de funções gama. Considere
602 @c q : makegamma (pochhammer (x, n));
603 @c sublis ([x=11/3, n= -6], q);
606 (%i1) q : makegamma (pochhammer (x, n));
610 (%i2) sublis ([x=11/3, n= -6], q);
616 Alternativamente, podemos tomar ese resultado directamente.
619 @c pochhammer (11/3, -6);
622 (%i1) pochhammer (11/3, -6);
628 A função passo de unidade é contínua à esquerda; dessa forma
631 @c [unit_step (-1/10), unit_step (0), unit_step (1/10)];
634 (%i1) [unit_step (-1/10), unit_step (0), unit_step (1/10)];
638 Se precisar de uma função de degrau unitário que seja
639 ou contínua à esquerda ou contínua à
640 direita do zero, defina a sua própria função usando
641 @code{signum}; por exemplo,
644 @c xunit_step (x) := (1 + signum (x))/2$
645 @c [xunit_step (-1/10), xunit_step (0), xunit_step (1/10)];
648 (%i1) xunit_step (x) := (1 + signum (x))/2$
650 (%i2) [xunit_step (-1/10), xunit_step (0), xunit_step (1/10)];
656 Não redefina a própria @code{unit_step}; alguns código em @code{orthopoly}
657 requerem que a função de passo de unidade seja contínua à esquerda.
659 @subsection Algorítmos
661 Geralmente, @code{orthopoly} faz avaliações simbólicas pelo uso de uma representação
662 hipergeométrica de polinómios ortogonais. As funções
663 hipegeométricas são avaliadas usando as funções (não documetadas) @code{hypergeo11}
664 e @code{hypergeo21}. As excessões são as funções de Bessel metade inteiras
665 e a função de Legendre associada de segundo tipo. As funções de Bessel metade inteiras são
666 avaliadas usando uma representação explícita, e a função de Legendre
667 associada de segundo tipo é avaliada usando recursividade.
669 Para avaliação em ponto flutuante, nós novamente convertemos muitas fuções em
670 uma forma hipergeométrica; nós avaliamos as funções hipergeométricas usando
671 recursividade para frente. Novamente, as excessões são as funções de Bessel metade inteiras
672 e a função de Legendre associada de segundo tipo. Numericamente,
673 as funções de Bessel meio inteiras são avaliadas usando o código SLATEC.
675 @node Definições para polinómios ortogonais, , Introdução a polinómios ortogonais, orthopoly
676 @section Definições para polinómios ortogonais
678 @deffn {Função} assoc_legendre_p (@var{n}, @var{m}, @var{x})
679 As funções de Legendre associadas de primeiro tipo.
681 Referência: Abramowitz e Stegun, equações 22.5.37, página 779, 8.6.6
682 (segunda equação), página 334, e 8.2.5, página 333.
685 @deffn {Função} assoc_legendre_q (@var{n}, @var{m}, @var{x})
686 A função de Legendre associada de segundo tipo.
688 Referência: Abramowitz e Stegun, equação 8.5.3 e 8.1.8.
691 @deffn {Função} chebyshev_t (@var{n}, @var{x})
692 A função de Chebyshev de primeiro tipo.
694 Referência: Abramowitz e Stegun, equação 22.5.47,página 779.
697 @deffn {Função} chebyshev_u (@var{n}, @var{x})
698 A função de Chebyshev do segundo tipo.
700 Referência: Abramowitz e Stegun, equação 22.5.48,página 779.
703 @deffn {Função} gen_laguerre (@var{n}, @var{a}, @var{x})
704 O poli@^omio generalizado de Laguerre.
706 Referência: Abramowitz e Stegun, equação 22.5.54,página 780.
709 @deffn {Função} hermite (@var{n}, @var{x})
710 O polinómio de Hermite.
712 Referência: Abramowitz e Stegun, equação 22.5.55,página 780.
715 @deffn {Função} intervalp (@var{e})
716 Retorna @code{true} se a entrada for um intervalo e retorna @code{false} se não for.
719 @deffn {Função} jacobi_p (@var{n}, @var{a}, @var{b}, @var{x})
720 o polinómio de Jacobi.
722 Os polinómios de Jacobi são actualmente definidos para todo
723 @var{a} e @var{b}; todavia, o peso do polinómio de
724 Jacobi @code{(1 - @var{x})^@var{a} (1 + @var{x})^@var{b}} não é integrável para @code{@var{a} <= -1} ou
725 @code{@var{b} <= -1}.
727 Referência: Abramowitz e Stegun, equação 22.5.42,página 779.
730 @deffn {Função} laguerre (@var{n}, @var{x})
731 O polinómio de Laguerre.
733 Referência: Abramowitz e Stegun, equatções 22.5.16 e 22.5.54,página 780.
736 @deffn {Função} legendre_p (@var{n}, @var{x})
737 O polinómio de Legendre de primeiro tipo.
739 Referência: Abramowitz e Stegun, equações 22.5.50 e 22.5.51,página 779.
742 @deffn {Função} legendre_q (@var{n}, @var{x})
743 O polinómio de Legendre de primeiro tipo.
745 Referência: Abramowitz e Stegun, equações 8.5.3 e 8.1.8.
748 @deffn {Função} orthopoly_recur (@var{f}, @var{args})
749 Retorna uma relação recursiva para a família de funções ortogonais
750 @var{f} com argumentos @var{args}. A recursividade é com
751 relação ao grau do polinómio.
754 @c orthopoly_recur (legendre_p, [n, x]);
757 (%i1) orthopoly_recur (legendre_p, [n, x]);
758 (2 n - 1) P (x) x + (1 - n) P (x)
760 (%o1) P (x) = -----------------------------------------
764 O segundo argumento a @code{orthopoly_recur} deve ser uma lista com o
765 número correcto de argumentos para a função @var{f}; se o número de argumentos não for o correcto,
766 Maxima sinaliza com um erro.
769 @c orthopoly_recur (jacobi_p, [n, x]);
772 (%i1) orthopoly_recur (jacobi_p, [n, x]);
774 Function jacobi_p needs 4 arguments, instead it received 2
775 -- an error. Quitting. To debug this try debugmode(true);
778 Adicionalmente, quando @var{f} não for o nome de uma das
779 famílias de polinómios ortogonais, um erro é sinalizado.
782 @c orthopoly_recur (foo, [n, x]);
785 (%i1) orthopoly_recur (foo, [n, x]);
787 A recursion relation for foo isn't known to Maxima
788 -- an error. Quitting. To debug this try debugmode(true);
792 @defvr {Variable} orthopoly_returns_intervals
793 Valor por omissão: @code{true}
795 Quando @code{orthopoly_returns_intervals} for @code{true}, resultados em ponto flutuante são retornados na
796 forma @code{interval (@var{c}, @var{r})}, onde @var{c} é o centro de um intervalo
797 e @var{r} é seu raio. O centro pode ser um número complexo; nesse
798 caso, o intervalo é um disco no plano complexo.
801 @deffn {Função} orthopoly_weight (@var{f}, @var{args})
803 Retorna uma lista de três elementos; o primeiro elemento é
804 a fórmula do peso para a família de polinómios ortogonais
805 @var{f} com argumentos fornecidos pela lista @var{args}; os
806 segundos e terceiros elementos fornecem os pontos finais inferior e superior
807 do intervalo de ortogonalidade. Por exemplo,
810 @c w : orthopoly_weight (hermite, [n, x]);
811 @c integrate (w[1] * hermite (3, x) * hermite (2, x), x, w[2], w[3]);
814 (%i1) w : orthopoly_weight (hermite, [n, x]);
817 (%o1) [%e , - inf, inf]
818 (%i2) integrate (w[1] * hermite (3, x) * hermite (2, x), x, w[2], w[3]);
822 A variável principal de @var{f} deve ser um símbolo; Se não for, Maxima
823 sinaliza com um erro.
827 @deffn {Função} pochhammer (@var{n}, @var{x})
828 O símbolo de Pochhammer. Para inteiros não negativos @var{n} com
829 @code{@var{n} <= pochhammer_max_index}, a expressão @code{pochhammer (@var{x}, @var{n})}
830 avalia para o produto @code{@var{x} (@var{x} + 1) (@var{x} + 2) ... (@var{x} + n - 1)}
831 when @code{@var{n} > 0} e
832 para 1 quando @code{@var{n} = 0}. Para valores negativos de @var{n},
833 @code{pochhammer (@var{x}, @var{n})} é definido como @code{(-1)^@var{n} / pochhammer (1 - @var{x}, -@var{n})}.
837 @c pochhammer (x, 3);
838 @c pochhammer (x, -3);
841 (%i1) pochhammer (x, 3);
842 (%o1) x (x + 1) (x + 2)
843 (%i2) pochhammer (x, -3);
845 (%o2) - -----------------------
846 (1 - x) (2 - x) (3 - x)
849 Para converter um símbolo de Pochhammer em um quociente de funções gama,
850 (veja Abramowitz e Stegun, equação 6.1.22) use @code{makegamma}; por exemplo
853 @c makegamma (pochhammer (x, n));
856 (%i1) makegamma (pochhammer (x, n));
862 Quando @var{n} exceder @code{pochhammer_max_index} ou quando @var{n}
863 for simbólico, @code{pochhammer} retorna uma forma substantiva.
866 @c pochhammer (x, n);
869 (%i1) pochhammer (x, n);
875 @defvr {Variável} pochhammer_max_index
876 Valor por omissão: 100
878 @code{pochhammer (@var{n}, @var{x})} expande para um produto se e somente se
879 @code{@var{n} <= pochhammer_max_index}.
884 @c pochhammer (x, 3), pochhammer_max_index : 3;
885 @c pochhammer (x, 4), pochhammer_max_index : 3;
888 (%i1) pochhammer (x, 3), pochhammer_max_index : 3;
889 (%o1) x (x + 1) (x + 2)
890 (%i2) pochhammer (x, 4), pochhammer_max_index : 3;
895 Referência: Abramowitz e Stegun, equação 6.1.16,página 256.
898 @deffn {Função} spherical_bessel_j (@var{n}, @var{x})
899 A Função de Bessel esférica de primeiro tipo.
901 Referência: Abramowitz e Stegun, equações 10.1.8,página 437 e 10.1.15,página 439.
904 @deffn {Função} spherical_bessel_y (@var{n}, @var{x})
905 A Função de Bessel esférica de segundo tipo.
907 Referência: Abramowitz e Stegun, equações 10.1.9,página 437 e 10.1.15,página 439.
910 @deffn {Função} spherical_hankel1 (@var{n}, @var{x})
911 A Função de Hankel esférica de
914 Referência: Abramowitz e Stegun, equação 10.1.36,página 439.
917 @deffn {Função} spherical_hankel2 (@var{n}, @var{x})
918 A Função de Hankel esférica de segundo tipo.
920 Referência: Abramowitz e Stegun, equação 10.1.17,página 439.
923 @deffn {Função} spherical_harmonic (@var{n}, @var{m}, @var{x}, @var{y})
924 A função arm@^onica esférica.
926 Referência: Merzbacher 9.64.
929 @deffn {Função} unit_step (@var{x})
930 A função de passo de unidade contínua à esquerda; dessa forma
931 @code{unit_step (@var{x})} tende para @code{@var{x} <= 0} e é igual a
932 1 para @code{@var{x} > 0}.
934 Se quiser uma função de degrau unitário que tome o
935 valor 1/2 em zero, use @code{(1 + signum (@var{x}))/2}.
938 @deffn {Função} ultraspherical (@var{n}, @var{a}, @var{x})
939 A função polin@^omial ultraesférica (também conhecida como função polinomial de Gegenbauer).
941 Referência: Abramowitz e Stegun, equação 22.5.46,página 779.