[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse capítulo descreve funções para avaliar e resolver polinômios. Existem rotinas para encontrar raízes reais e complexas de equações quadráticas e cúbicas usando métodos analíticos. Um resolvedor polinomial analítico está também disponível para encontrar raízes de polinômios em geral com coeficientes reais (de qualquer ordem). As funções são declaradas no arquivo de cabeçalho ‘gsl_poly.h’.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
As funções descritas aqui avaliam o polinômio
P(x) = c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^{len-1} usando
o método de Horner para estabilidade. Versões modificadas dessa função são usada quando HAVE_INLINE
for definida.
Essa função avalia um polinômio com coeficientes reais para a variável real x.
Essa função avalia um polinômio com coeficientes reais para a variável complexa z.
Essa função avalia um polinômio com coeficientes complexos para a variável complexa z.
Essa função avalia um polinômio e suas derivadas armazenando o resultado no vetor estático res de tamanho lenres. O vetor estático de saída contém os valores de d^k P/d x^k para o valor especificado de x iniciando com k = 0.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
As funções descritas aqui tratam polinômios armazenados na representação de diferenças divididas de Newton. O uso de diferenças divididas é descrito em Abramowitz & Stegun seções 25.1.4 e 25.2.26 e em Burden e Faires, capítulo 3, e discutido brevemente abaixo.
Dado uma função f(x), um polinômio de interpolação de n-ésimo grau P_{n}(x) pode ser construído o qual concorda com f em n+1 pontos distintos x_0,x_1,...,x_{n}. Esse polinômio pode ser escrito de uma forma conhecida como representação de diferença dividida de Newton: onde as diferenças divididas [x_0,x_1,...,x_k] são definidas na seção 25.1.4 de Abramowitz e Stegun. Adicionalmente, é também possível construir um polinômio de interpolação de grau 2n+1 que também coincide com a primeira derivada de f nos pontos x_0,x_1,...,x_n. É chamado de polinômio de interpolação de Hermite e é definido como onde os elementos de z = \{x_0,x_0,x_1,x_1,...,x_n,x_n\} são definidos por z_{2k} = z_{2k+1} = x_k. As diferenças divididas [z_0,z_1,...,z_k] são discutidas em Burden e Faires, seção 3.4.
Essa função calcula uma representação de diferenças divididas do polinômio interpolado para os pontos (x, y) armazenados nos vetores estáticos xa e ya de comprimento size. Na saída as diferenças divididas de (xa,ya) são armazenados no vetor dd, também de comprimento size. Usando a notação acima, dd[k] = [x_0,x_1,...,x_k].
Essa função avalia o polinômio armazenado na forma de diferença dividida
nos vetores estáticos dd e xa de comprimento size no ponto
x. Uma versão modificada dessa função é usada quando HAVE_INLINE
for definida.
Essa função converte a representação de diferença dividida de um polinômio para uma expansão de Taylor. A representação de diferença dividida é fornecida nos vetores estáticos dd e xa de comprimento size. Na saída os coeficientes de Taylor do polinômio expandido sobre o ponto xp são armazenados no vetor estático c também de comprimento size. Um espaço de trabalho de comprimento size deve ser fornecido no vetor estático w.
This function computes a divided-difference representation of the interpolating Hermite polynomial for the points (x, y) stored in the arrays xa and ya of length size. Hermite interpolation constructs polynomials which also match first derivatives dy/dx which are provided in the array dya also of length size. The first derivatives can be incorported into the usual divided-difference algorithm by forming a new dataset z = \{x_0,x_0,x_1,x_1,...\}, which is stored in the array za of length 2*size on output. On output the divided-differences of the Hermite representation are stored in the array dd, also of length 2*size. Using the notation above, dd[k] = [z_0,z_1,...,z_k].
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função encontra as raízes reais da equação quadrática,
|
O número de raízes encontradas depende do sinal do discriminante b^2 - 4 a c. O discriminante estará sujeito a erros de arredondamento e cancelamento quando calculado em precisão dupla, e estará também sujeito a erros se os coeficientes do polinômios forem inexatos. Esses erros podem causar uma discreta modificação no número de raízes. Todavia, para polinômios com pequenos coeficientes inteiro o discriminante pode sempre ser calculado com grande exatidão.
Essa função encontra as raízes complexas da equação quadrática,
|
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função encontra as raízes reais da equação cúbica,
|
Essa função encontra as raízes complexas da equação cúbica,
|
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
As raízes de equações polinomiais não podem ser encontradas analiticamente excetuando-se os casos especiais da quadrática, da cúbica e da equação de quarto grau. O algoritmo descrito nessa seção usa um método iterativo para encontrar uma localização aproximada de raízes de polinômios de grau mais elevado.
Essa função aloca espaço para uma estrutura
gsl_poly_complex_workspace
e um espaço de trabalho adequado para resolver um polinômio com n
coeficientes usando a rotina gsl_poly_complex_solve
.
A função retorna um apontador para o mais recentemente alocado
gsl_poly_complex_workspace
se nenhum erro for encontrado, e um apontador
nulo (null) no caso de erro.
Essa função libera toda memória associada ao espaço de trabalho w.
Essa função calcula as raízes do polinômio genérico
P(x) = a_0 + a_1 x + a_2 x^2 + ... + a_{n-1} x^{n-1} usando
redução QR balanceada da matriz adjunta . O parâmetro n
especifica o comprimento do vetor estático do coeficiente. O coeficiente do
termo de mais alta ordem deve ser diferente de zero. A função requer um espaço de trabalho
w de tamanho apropriado. As n-1 raízes são retornadas
dentro do vetor estático complexo z de comprimento 2(n-1), alternando
partes reais e imaginárias.
As funções retornam GSL_SUCCESS
se todas as raízes forem encontradas. Se
a redução QR não vier a convergir, o controlador de erro é chamado com
um código de erro de GSL_EFAILED
. Note que devido à precisão finita,
raízes de alta mutiplicidade são retornadas como um grupo de raízes simples
com exatidão reduzida. A solução de polinômios com raízes de
alta ordem requerem algoritmos especializados que tomam a estrutura de
multiplicidade dentro de uma conta (veja e.g. Z. Zeng, Algorithm 835, ACM
Transactions on Mathematical Software, Volume 30, Impressão 2 (2004), pp
218–236).
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Para demonstrar o uso do resolvedor de polinômios gerais iremos tomar o
polinômio P(x) = x^5 - 1 que tem as seguintes raízes,
|
#include <stdio.h> #include <gsl/gsl_poly.h> int main (void) { int i; /* coefficients of P(x) = -1 + x^5 */ double a[6] = { -1, 0, 0, 0, 0, 1 }; double z[10]; gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc (6); gsl_poly_complex_solve (a, 6, w, z); gsl_poly_complex_workspace_free (w); for (i = 0; i < 5; i++) { printf ("z%d = %+.18f %+.18f\n", i, z[2*i], z[2*i+1]); } return 0; }
A saída do programa é,
$ ./a.outz0 = -0.809016994374947451 +0.587785252292473137 z1 = -0.809016994374947451 -0.587785252292473137 z2 = +0.309016994374947451 +0.951056516295153642 z3 = +0.309016994374947451 -0.951056516295153642 z4 = +1.000000000000000000 +0.000000000000000000
que concorda com o resultado analítico, z_n = \exp(2 \pi n i/5).
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O método QR balanceado e sua análise de erro são ambos descritos no seguintes artigos,
As fórmulas para diferenças divididas são fornecidas nos seguintes textos,
[ << ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.