Próximo: Funções e Variáveis Definidas para polinômios ortogonais, Previous: orthopoly, Acima: orthopoly [Conteúdo][Índice]
orthopoly é um pacote para avaliação simbólica e numérica de
muitos tipos de polinômios ortogonais, incluindo polinômios de Chebyshev,
Laguerre, Hermite, Jacobi, Legendre, e ultraesférico
(Gegenbauer). Adicionalmentey, orthopoly inclui suporte funções esféricas segundo o critério de
Bessel, esféricas segundo o critério de Hankel, e funções harmônica esféricas.
Em sua maior parte, orthopoly segue as convenções de Abramowitz e Stegun
Handbook of Mathematical Functions, Chapter 22 (10th printing, December 1972);
adicionalmente, usamos Gradshteyn e Ryzhik, 
Table of Integrals, Series, and Products (1980 corrected and 
enlarged edition), e Eugen Merzbacher Quantum Mechanics (2nd edition, 1970).
Barton Willis da University de Nebraska e Kearney (UNK) escreveu
o pacote orthopoly e sua documetação. O pacote 
é liberado segundo a licença pública geral GNU (GPL).
load ("orthopoly") torna o pacote orthopoly disponível para uso.
Para encontrar o polinômio de Legendre de terceira ordem,
(%i1) legendre_p (3, x);
                      3             2
             5 (1 - x)    15 (1 - x)
(%o1)      - ---------- + ----------- - 6 (1 - x) + 1
                 2             2
Para expressar esse polinômio como uma soma de potências de x, aplique ratsimp ou rat para o resultado anterior.
(%i2) [ratsimp (%), rat (%)];
                        3           3
                     5 x  - 3 x  5 x  - 3 x
(%o2)/R/            [----------, ----------]
                         2           2
Alternativamente, faça o segundo argumento  para legendre_p (sua variável “principal”) 
uma expressão racional canônica (CRE)  usando rat(x) em lugar de somente x.
(%i1) legendre_p (3, rat (x));
                              3
                           5 x  - 3 x
(%o1)/R/                   ----------
                               2
Para avaliação em ponto flutuante, orthopoly usa uma análise de erro durante a execução
para estimar uma associação superior para o erro. Por exemplo,
(%i1) jacobi_p (150, 2, 3, 0.2); (%o1) interval(- 0.062017037936715, 1.533267919277521E-11)
intervalos possuem a forma interval (c, r), onde c é o
centro e r é o raio do intervalo. Uma vez que Maxima
não suporta aritmética sobre intervalos, em algumas situações, tais
como em gráficos, você vai querer suprimir o erro e sair somente com o
centro do intervalo. Para fazer isso, escolha a variável de
opção orthopoly_returns_intervals para false.
(%i1) orthopoly_returns_intervals : false; (%o1) false (%i2) jacobi_p (150, 2, 3, 0.2); (%o2) - 0.062017037936715
Veja a seção veja Avaliação em Ponto Flutuante para maiores informaçõesfor more information.
Muitas funções em orthopoly possuem uma propriedade gradef; dessa forma
(%i1) diff (hermite (n, x), x);
(%o1)                     2 n H     (x)
                               n - 1
(%i2) diff (gen_laguerre (n, a, x), x);
              (a)               (a)
           n L   (x) - (n + a) L     (x) unit_step(n)
              n                 n - 1
(%o2)      ------------------------------------------
                               x
A função de um único passo no segundo exemplo previne um erro que poderia de outra forma surgir através da avaliação de n para 0.
(%i3) ev (%, n = 0); (%o3) 0
A propriedade gradef somente aplica para a variável “principal”; dderivadas com
relação a outros argumentos usualmente resultam em uma mensagem de erro; por exemplo
(%i1) diff (hermite (n, x), x);
(%o1)                     2 n H     (x)
                               n - 1
(%i2) diff (hermite (n, x), n);
Maxima doesn't know the derivative of hermite with respect the first argument
 -- an error.  Quitting.  To debug this try debugmode(true);
Geralmente, funções em orthopoly mapeiam sobre listas e matrizes. Para
o mapeamento para avaliação total, as variáveis de opção 
doallmxops e listarith devem ambas serem true (o valor padrão).
Para ilustrar o mapeamento sobre matrizes, considere
(%i1) hermite (2, x);
                                     2
(%o1)                    - 2 (1 - 2 x )
(%i2) m : matrix ([0, x], [y, 0]);
                            [ 0  x ]
(%o2)                       [      ]
                            [ y  0 ]
(%i3) hermite (2, m);
               [                             2  ]
               [      - 2        - 2 (1 - 2 x ) ]
(%o3)          [                                ]
               [             2                  ]
               [ - 2 (1 - 2 y )       - 2       ]
No segundo exemplo, o elemento i, j do valor
é hermite (2, m[i,j]); isso não é o mesmo que calcular
-2 + 4 m . m, como visto no próximo exemplo.
(%i4) -2 * matrix ([1, 0], [0, 1]) + 4 * m . m;
                    [ 4 x y - 2      0     ]
(%o4)               [                      ]
                    [     0      4 x y - 2 ]
Se você avaliar uma função em um ponto fora do seu domínio, geralmente
orthopoly retorna uma função não avaliada. Por exemplo,
(%i1) legendre_p (2/3, x);
(%o1)                        P   (x)
                              2/3
orthopoly suporta tradução em TeX; orthopoly também faz saídas
bidimensionais em um terminal.
(%i1) spherical_harmonic (l, m, theta, phi);
                          m
(%o1)                    Y (theta, phi)
                          l
(%i2) tex (%);
$$Y_{l}^{m}\left(\vartheta,\varphi\right)$$
(%o2)                         false
(%i3) jacobi_p (n, a, a - b, x/2);
                          (a, a - b) x
(%o3)                    P          (-)
                          n          2
(%i4) tex (%);
$$P_{n}^{\left(a,a-b\right)}\left({{x}\over{2}}\right)$$
(%o4)                         false
Quando uma expressão envolve muitos polinômios ortogonais com ordens simbólicas, é possível que a expressão atualmente tenda para zero, e ainda ocorre também que Maxima estar incapacitado de simplificar essa expressão para zero. Se você faz uma divisão por tal quantidade que tende a zero, você pode estar em apuros. Por exemplo, a seguinte expressão tende para zero para inteiros n maiores que 1, e ainda ocorre também que Maxima está incapacitado de simplificar essa expressão para zero.
(%i1) (2*n - 1) * legendre_p (n - 1, x) * x - n * legendre_p (n, x) + (1 - n) * legendre_p (n - 2, x);
(%o1)  (2 n - 1) P     (x) x - n P (x) + (1 - n) P     (x)
                  n - 1           n               n - 2
Para um n específico, podemos reduzir a expressão a zero.
(%i2) ev (% ,n = 10, ratsimp); (%o2) 0
Geralmente, a forma polinomial de um polinômio ortogonal esteja adequada de forma hostil para avaliaçao em ponto flutuante. Aqui está um exemplo.
(%i1) p : jacobi_p (100, 2, 3, x)$ (%i2) subst (0.2, x, p); (%o2) 3.4442767023833592E+35 (%i3) jacobi_p (100, 2, 3, 0.2); (%o3) interval(0.18413609135169, 6.8990300925815987E-12) (%i4) float(jacobi_p (100, 2, 3, 2/10)); (%o4) 0.18413609135169
O verdadeiro valor está em torno de 0.184; ess calculo suporta erro de cancelamento por extremo subtrativo.Expandindo o polinômio e então avaliando, fornecendo um melhor resultado.
(%i5) p : expand(p)$ (%i6) subst (0.2, x, p); (%o6) 0.18413609766122982
Essa não é uma regra geral; expandindo o polinômio não resulta sempre em expressões que são melhores adaptadas a avaliação numérica. Com grande folga, o melhor caminho para fazer avaliação numérica é fazer um ou mais argumentos da função serem números em ponto flutuante. Em função disso, algorítmos especializados em ponto flutuante são usados para avaliação.
A função float do Maxima é até certo ponto indiscriminada; se você aplicar 
float a uma expressão envolvendo um polinômio ortogonal com um
grau simbólico ou um parâmetro de ordem, esses parâmetos (inteiros) podem ser 
convertido em números em ponto flutuante; após o que, a expressão não irá avaliar 
completamente. Considere
(%i1) assoc_legendre_p (n, 1, x);
                               1
(%o1)                         P (x)
                               n
(%i2) float (%);
                              1.0
(%o2)                        P   (x)
                              n
(%i3) ev (%, n=2, x=0.9);
                             1.0
(%o3)                       P   (0.9)
                             2
A expressão em (%o3) não irá avaliar para um número em ponto flutuante; orthopoly não
reconhece valores em ponto flutuante em lugares onde deve haver valores inteiros. Similarmente, 
avaliação numérica da função pochhammer para ordens que
excedam pochhammer_max_index pode ser perturbador; considere
(%i1) x :  pochhammer (1, 10), pochhammer_max_index : 5;
(%o1)                         (1)
                                 10
Aplicando float não avalia x para um número em ponto flutuante
(%i2) float (x);
(%o2)                       (1.0)
                                 10.0
Para avaliar x para um número em ponto flutuante, você irá precisar associar
pochhammer_max_index a 11 ou mais e aplicar float a x.
(%i3) float (x), pochhammer_max_index : 11; (%o3) 3628800.0
O valor padrão de pochhammer_max_index é 100;
modifique esse valor após chama orthopoly.
Finalmente, tenha consciência que os livros citados nas referências adotam diferentes definições de polinômios ortogonais; geralmente adotamos as convenções citadas nas convenções de Abramowitz e Stegun.
Antes de você suspeitar de um erro no pacote orthopoly, verifique alguns casos especiais 
para determinar se suas definições coincidem com aquelas usadas por orthopoly. 
Definitions muitas vezes diferem por uma normalização; ocasionalmente, autores
utilizam versões “modificadas” das funções que fazem a família
ortogonal sobre um intervalo diferente do intervalo (-1, 1). Para definir, por exemplo,
um polinômio de Legendre que é ortogonal a (0, 1), defina
(%i1) shifted_legendre_p (n, x) := legendre_p (n, 2*x - 1)$
(%i2) shifted_legendre_p (2, rat (x));
                            2
(%o2)/R/                 6 x  - 6 x + 1
(%i3) legendre_p (2, rat (x));
                               2
                            3 x  - 1
(%o3)/R/                    --------
                               2
Muitas funções em orthopoly utilizam análise de erro durante a execução para 
estimar o erro em avaliações em ponto flutuante; as 
exceções são funções de Bessel esféricas e os polinômios associados de
Legendre do segundo tipo. Para avaliações numéricas, as funções 
de Bessel esféricas chamam funções da coleção de programas SLATEC. Nenhum método especializado é usado
para avaliação numérica dos polinômios associados  de Legendre do
segundo tipo.
A análise de erro durante a execução ignora erros que são de segunda ordem ou maior na máquina (também conhecida como perda de algarismos). A análise de erro durante a execução também ignora alguns poucos outros tipos de erro. É possível (embora não provável) que o erro atual exceda o estimado.
Intervalos possuem a forma interval (c, r), onde c é o centro 
do intervalo e r é seu raio. O 
centro de um intervalo pode sr um número complexo, e o raio é sempre um número real positivo.
Aqui está um exemplo.
(%i1) fpprec : 50$ (%i2) y0 : jacobi_p (100, 2, 3, 0.2); (%o2) interval(0.1841360913516871, 6.8990300925815987E-12) (%i3) y1 : bfloat (jacobi_p (100, 2, 3, 1/5)); (%o3) 1.8413609135168563091370224958913493690868904463668b-1
Vamos testar o quanto o erro atual é é menor que o erro estimado
(%i4) is (abs (part (y0, 1) - y1) < part (y0, 2)); (%o4) true
Realmente, por esse exemplo o erro estimado é um maior que o erro verdadeiro.
Maxima não suporta aritmética sobre intervalos.
(%i1) legendre_p (7, 0.1) + legendre_p (8, 0.1);
(%o1) interval(0.18032072148437508, 3.1477135311021797E-15)
        + interval(- 0.19949294375000004, 3.3769353084291579E-15)
Um usuário pode definir operadores aritméticos que fazem matemática de intervalos. Para definir adição de intervalos, podemos definir
(%i1) infix ("@+")$
(%i2) "@+"(x,y) := interval (part (x, 1) + part (y, 1), part (x, 2) + part (y, 2))$
(%i3) legendre_p (7, 0.1) @+ legendre_p (8, 0.1);
(%o3) interval(- 0.019172222265624955, 6.5246488395313372E-15)
As rotinas eseciais em ponto flutuante são chamadas quando os argumentos forem complexos. Por exemplo,
(%i1) legendre_p (10, 2 + 3.0*%i);
(%o1) interval(- 3.876378825E+7 %i - 6.0787748E+7, 
                                           1.2089173052721777E-6)
Let’s compare this to the true value.
(%i1) float (expand (legendre_p (10, 2 + 3*%i))); (%o1) - 3.876378825E+7 %i - 6.0787748E+7
Adicionalmente, quando os argumentos forem grandes números em ponto flutuante, as rotinas especiais 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 e o resultado final é número em ponto flutuante de precisão dupla.
(%i1) ultraspherical (150, 0.5b0, 0.9b0); (%o1) interval(- 0.043009481257265, 3.3750051301228864E-14)
orthopolyPara montar gráficos de expressões que envolvem polinômios ortogonais, você deve azer duas coisas:
orthopoly_returns_intervals para false,
orthopoly.
Se chamadas a funções não receberem apóstrofo, Maxima irá avaliá-las para polinômios antes de montar o gráfico; conseqüêntemente, as rotinas especializadas em ponto flutuante não serão chamadas. Aqui está um exemplo de como montar o gráfico de uma expressão que envolve um polinômio de Legendre.
(%i1) plot2d ('(legendre_p (5, x)), [x, 0, 1]), orthopoly_returns_intervals : false;
(%o1)
 
A expressão completa legendre_p (5, x) recebe apóstrofo; isso é 
diferente de apenas colocar apóstrofo no nome da função usando 'legendre_p (5, x).
O pacote orthopoly define o
síbolo de Pochhammer e uma função de passo de unidade. orthopoly utiliza 
a função delta de Kronecker e a função de passo de unidade em
declarações gradef.
Para converter os símbolos Pochhammer em quocientes da funções gama,
use makegamma.
(%i1) makegamma (pochhammer (x, n));
                          gamma(x + n)
(%o1)                     ------------
                            gamma(x)
(%i2) makegamma (pochhammer (1/2, 1/2));
                                1
(%o2)                       ---------
                            sqrt(%pi)
Derivadas de símbolos de Pochhammer são fornecidas em termos de psi
function.
(%i1) diff (pochhammer (x, n), x);
(%o1)             (x)  (psi (x + n) - psi (x))
                     n     0             0
(%i2) diff (pochhammer (x, n), n);
(%o2)                   (x)  psi (x + n)
                           n    0
Vocêprecisa ser cuidadoso com expressões como (%o1); a diferença das
funções psi possuem polinômios quando x = -1, -2, .., -n. Esses polinômios
cacelam-se com fatores em pochhammer (x, n) fazendo da derivada um polinômio
de grau n - 1 quando n for um inteiro positivo.
O símbolo de Pochhammer é definido de ordens negativas até sua representação como um quociente de funções gama. Considere
(%i1) q : makegamma (pochhammer (x, n));
                          gamma(x + n)
(%o1)                     ------------
                            gamma(x)
(%i2) sublis ([x=11/3, n= -6], q);
                               729
(%o2)                        - ----
                               2240
Alternativamente, podemos tomar ese resultado diretamente.
(%i1) pochhammer (11/3, -6);
                               729
(%o1)                        - ----
                               2240
A função passo de unidade é contínua à esquerda; dessa forma
(%i1) [unit_step (-1/10), unit_step (0), unit_step (1/10)]; (%o1) [0, 0, 1]
Se você precisa de uma função de unidade de passo que é ou contínua à esquerda ou contínua à direita
em zero, defina sua própria função de unidade de passo usando signum; por exemplo,
(%i1) xunit_step (x) := (1 + signum (x))/2$
(%i2) [xunit_step (-1/10), xunit_step (0), xunit_step (1/10)];
                                1
(%o2)                       [0, -, 1]
                                2
Não redefina a própria unit_step; alguns código em orthopoly
requerem que a função de passo de unidade seja contínua à esquerda.
Geralmente, orthopoly faz avaliações simbólicas pelo uso de uma representação 
hipergeométrica de polinômios ortogonais. As funções 
hipegeométricas são avaliadas usando as funções (não documetadas) hypergeo11 
e hypergeo21. As excessões são as funções de Bessel metade inteiras 
e a função de Legendre associada de segundo tipo. As funções de Bessel metade inteiras são
avaliadas usando uma representação explícita, e a função de Legendre 
associada de segundo tipo é avaliada usando recursividade.
Para avaliação em ponto flutuante, nós novamente convertemos muitas fuções em uma forma hipergeométrica; nós avaliamos as funções hipergeométricas usando recursividade para frente. Novamente, as excessões são as funções de Bessel metade inteiras e a função de Legendre associada de segundo tipo. Numericamente, as funções de Bessel meio inteiras são avaliadas usando o código SLATEC.
Próximo: Funções e Variáveis Definidas para polinômios ortogonais, Previous: orthopoly, Acima: orthopoly [Conteúdo][Índice]