Introducedilhaão a interpol
===========================

Pacote interpol define os métodos Lagrangiano, linear e o de splines cúbicos para interpolacedilhaão polinomial.

Comentários, correcedilhaões e sugestões, por favor contacte-me em 'MARIO AT EDU DOT XUNTA DOT ES'.

Definicedilhaões para interpol
==============================

 -- Funcedilhaão: lagrange (PONTOS)
 -- Funcedilhaão: lagrange (PONTOS, OPCEDILHAÃO)
     Calcula a interpolacedilhaão polinomial através do método Lagrangiano. O argumento PONTOS deve ser um dos seguintes:

       * uma matriz de duas colunas, p:matrix([2,4],[5,6],[9,3]),

       * uma lista de pares, p: [[2,4],[5,6],[9,3]],

       * uma lista de números, p: [4,6,3], e nesse caso as abcissas irão ser atribuídas automaticamente aos valores 1, 2, 3, etc.

     Nos dois primeiros casos os pares são ordenados em relacedilhaão à primeira coordenada antes de fazer os cálculos.

     Com o argumento OPCEDILHAÃO é possível escolher o nome da variável independente, o qual é 'x por padrão; para definir qualquer outra, z por exemplo, escreva varname='z.

     Exemplos:

          (%i1) load("interpol")$
          (%i2) p:[[7,2],[8,2],[1,5],[3,2],[6,7]]$
          (%i3) lagrange(p);
                           4        3         2
                       73 x    701 x    8957 x    5288 x   186
          (%o3)        ----- - ------ + ------- - ------ + ---
                        420     210       420      105      5
          (%i4) f(x):=''%;
                               4        3         2
                           73 x    701 x    8957 x    5288 x   186
          (%o4)    f(x) := ----- - ------ + ------- - ------ + ---
                            420     210       420      105      5
          (%i5) /* Evaluate the polynomial at some points */
                map(f,[2.3,5/7,%pi]);
                                       919062
          (%o5)  [- 1.567534999999992, ------,
                                       84035
                                   4          3           2
                             73 %pi    701 %pi    8957 %pi    5288 %pi   186
                             ------- - -------- + --------- - -------- + ---]
                               420       210         420        105       5
          (%i6) %,numer;
          (%o6) [- 1.567534999999992, 10.9366573451538, 2.89319655125692]
          (%i7) /* Plot the polynomial together with points */
                plot2d([f(x),[discrete,p]],[x,0,10],
                     [gnuplot_curve_styles,
                           ["with lines","with points pointsize 3"]])$
          (%i8) /* Change variable name */
                lagrange(p, varname=w);
                           4        3         2
                       73 w    701 w    8957 w    5288 w   186
          (%o8)        ----- - ------ + ------- - ------ + ---
                        420     210       420      105      5

 -- Funcedilhaão: charfun2 (X, A, B)
     Retorna true, i. e., verdadeiro se o número X pertence ao intervalo [a, b), e false, i. e., falsono caso contrário.

 -- Funcedilhaão: linearinterpol (PONTOS)
 -- Funcedilhaão: linearinterpol (PONTOS, OPCEDILHAÃO)
     Calcula a interpolacedilhaão polinomial através do método linear. O argumento PONTOS deve ser um dos seguintes:

       * uma matriz de duas colunas, p:matrix([2,4],[5,6],[9,3]),

       * uma lista de pares, p: [[2,4],[5,6],[9,3]],

       * uma lista de números, p: [4,6,3], e nesse caso as abcissas irão ser atribuídas automaticamente aos valores 1, 2, 3, etc.

     Nos dois primeiros casos os pares são ordenados em relacedilhaão à primeira coordenada antes de fazer os cálculos.

     Com o argumento OPCEDILHAÃO é possível escolher o nome da variável independente, o qual é 'x por padrão; para definir qualquer outra, z por exemplo, escreva varname='z.

     Examples:

          (%i1) load("interpol")$
          (%i2) p: matrix([7,2],[8,3],[1,5],[3,2],[6,7])$
          (%i3) linearinterpol(p);
                  13   3 x
          (%o3)  (-- - ---) charfun2(x, minf, 3)
                  2     2
           + (x - 5) charfun2(x, 7, inf) + (37 - 5 x) charfun2(x, 6, 7)
              5 x
           + (--- - 3) charfun2(x, 3, 6)
               3

          (%i4) f(x):=''%;
                          13   3 x
          (%o4)  f(x) := (-- - ---) charfun2(x, minf, 3)
                          2     2
           + (x - 5) charfun2(x, 7, inf) + (37 - 5 x) charfun2(x, 6, 7)
              5 x
           + (--- - 3) charfun2(x, 3, 6)
               3
          (%i5)  /* Evaluate the polynomial at some points */
                 map(f,[7.3,25/7,%pi]);
                                      62  5 %pi
          (%o5)                 [2.3, --, ----- - 3]
                                      21    3
          (%i6) %,numer;
          (%o6)  [2.3, 2.952380952380953, 2.235987755982989]
          (%i7)  /* Plot the polynomial together with points */
                 plot2d(['(f(x)),[discrete,args(p)]],[x,-5,20],
                     [gnuplot_curve_styles,
                           ["with lines","with points pointsize 3"]])$
          (%i8)  /* Change variable name */
                 linearinterpol(p, varname='s);
                 13   3 s
          (%o8) (-- - ---) charfun2(s, minf, 3)
                 2     2
           + (s - 5) charfun2(s, 7, inf) + (37 - 5 s) charfun2(s, 6, 7)
              5 s
           + (--- - 3) charfun2(s, 3, 6)
               3

 -- Funcedilhaão: cspline (PONTOS)
 -- Funcedilhaão: cspline (PONTOS, OPCEDILHAÃO1, OPCEDILHAÃO2, ...)
     Calcula a interpolacedilhaão polnomial pelo método de splines ( polinómios de ordem k que interpolam os dados e têm k-1 derivadas contínuas em todo o intervalo ) cúbicos. O argumento PONTOS deve ser um dos seguintes:

       * uma matriz de duas colunas, p:matrix([2,4],[5,6],[9,3]),

       * uma lista de pares, p: [[2,4],[5,6],[9,3]],

       * uma lista de números, p: [4,6,3], e nesse caso as abcissas irão ser atribuídas automaticamente aos valores 1, 2, 3, etc.

     Nos dois primeiros casos os pares são ordenados em relacedilhaão à primeira coordenada antes de fazer os cálculos.

     Existem três opcedilhaões para ajustar necessidades específicas:

       * 'd1, o padrão é 'unknown, é a primeira derivada em x_1; se essa primeira derivada for desconhecida, 'unknown, a segunda derivada em x_1 é igualada a 0 (o spline cúbico natural); se essa primeira derivada for igual a um número, a segunda derivada é calculada baseando-se nesse número.

       * 'dn, o padrão é 'unknown, é a primeira derivada em x_n; se essa primeira derivada for desconhecida, 'unknown, a segunda derivada em x_n é igualada a 0 (o spline cúbico natural); se essa primeira derivada for igual a um número, a segunda derivada é calculada baseando-se nesse número.

       * 'nome_var, o padrão é 'x, é o nome da variável independente.

     Exemplos:

          (%i1) load("interpol")$
          (%i2) p:[[7,2],[8,2],[1,5],[3,2],[6,7]]$
          (%i3) /* Unknown first derivatives at the extremes
                   is equivalent to natural cubic splines */
                cspline(p);
                        3         2
                  1159 x    1159 x    6091 x   8283
          (%o3)  (------- - ------- - ------ + ----) charfun2(x, minf, 3)
                   3288      1096      3288    1096
                      3         2
                2587 x    5174 x    494117 x   108928
           + (- ------- + ------- - -------- + ------) charfun2(x, 7, inf)
                 1644       137       1644      137
                    3          2
              4715 x    15209 x    579277 x   199575
           + (------- - -------- + -------- - ------) charfun2(x, 6, 7)
               1644       274        1644      274
                      3         2
                3287 x    2223 x    48275 x   9609
           + (- ------- + ------- - ------- + ----) charfun2(x, 3, 6)
                 4932       274      1644     274

          (%i4) f(x):=''%$
          (%i5) /* Some evaluations */
                map(f,[2.3,5/7,%pi]), numer;
          (%o5) [1.991460766423356, 5.823200187269903, 2.227405312429507]
          (%i6) /* Plotting interpolating function */
                plot2d(['(f(x)),[discrete,p]],[x,0,10],
                    [gnuplot_curve_styles,
                         ["with lines","with points pointsize 3"]])$
          (%i7) /* New call, but giving values at the derivatives */
                cspline(p,d1=0,dn=0);
                        3          2
                  1949 x    11437 x    17027 x   1247
          (%o7)  (------- - -------- + ------- + ----) charfun2(x, minf, 3)
                   2256       2256      2256     752
                      3          2
                1547 x    35581 x    68068 x   173546
           + (- ------- + -------- - ------- + ------) charfun2(x, 7, inf)
                  564       564        141      141
                   3          2
              607 x    35147 x    55706 x   38420
           + (------ - -------- + ------- - -----) charfun2(x, 6, 7)
               188       564        141      47
                      3         2
                3895 x    1807 x    5146 x   2148
           + (- ------- + ------- - ------ + ----) charfun2(x, 3, 6)
                 5076       188      141      47
          (%i8) /* Defining new interpolating function */
                g(x):=''%$
          (%i9) /* Plotting both functions together */
                plot2d(['(f(x)),'(g(x)),[discrete,p]],[x,0,10],
                     [gnuplot_curve_styles,
                        ["with lines","with lines","with points pointsize 3"]])$