@c /interpol.texi/1.2/Fri Feb 23 20:00:44 2007//
@menu
* Introdução a interpol::
* Definições para interpol::
@end menu

@node Introdução a interpol, Definições para interpol, interpol, interpol
@section Introdução a interpol

Pacote @code{interpol} define os métodos Lagrangiano, linear e o de
splines cúbicos para interpolação polinomial.



Comentários, correções e sugestões, por favor contacte-me em @var{'mario AT edu DOT xunta DOT es'}.



@node Definições para interpol,  , Introdução a interpol, interpol
@section Definições para interpol


@deffn {Função} lagrange (@var{pontos})
@deffnx {Função} lagrange (@var{pontos}, @var{opção})
Calcula a interpolação polinomial através do método Lagrangiano. O argumento @var{pontos} deve ser um dos seguintes:

@itemize @bullet
@item
uma matriz de duas colunas, @code{p:matrix([2,4],[5,6],[9,3])},
@item
uma lista de pares, @code{p: [[2,4],[5,6],[9,3]]},
@item
uma lista de números, @code{p: [4,6,3]}, e nesse caso as abcissas irão ser atribuídas automaticamente aos valores 1, 2, 3, etc.
@end itemize

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

Com o argumento @var{opção} é possível escolher o nome da variável independente, o qual é @code{'x} por padrão; para definir qualquer outra, z por exemplo, escreva @code{varname='z}. 

Exemplos:

@example
(%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
@end example

@end deffn


@deffn {Função} charfun2 (@var{x}, @var{a}, @var{b})
Retorna @code{true}, i. e., verdadeiro se o número @var{x} pertence ao intervalo @math{[a, b)}, e @code{false}, i. e., falsono caso contrário.
@end deffn


@deffn {Função} linearinterpol (@var{pontos})
@deffnx {Função} linearinterpol (@var{pontos}, @var{opção})
Calcula a interpolação polinomial através do método linear. O argumento @var{pontos} deve ser um dos seguintes:

@itemize @bullet
@item
uma matriz de duas colunas, @code{p:matrix([2,4],[5,6],[9,3])},
@item
uma lista de pares, @code{p: [[2,4],[5,6],[9,3]]},
@item
uma lista de números, @code{p: [4,6,3]}, e nesse caso as abcissas irão ser atribuídas automaticamente aos valores 1, 2, 3, etc.
@end itemize

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

Com o argumento @var{opção} é possível escolher o nome da variável independente, o qual é @code{'x} por padrão; para definir qualquer outra, z por exemplo, escreva @code{varname='z}. 

Examples:
@example
(%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
@end example

@end deffn



@deffn {Função} cspline (@var{pontos})
@deffnx {Função} cspline (@var{pontos}, @var{opção1}, @var{opção2}, ...)
Calcula a interpolaçã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 @var{pontos} deve ser um dos
seguintes:

@itemize @bullet
@item
uma matriz de duas colunas, @code{p:matrix([2,4],[5,6],[9,3])},
@item
uma lista de pares, @code{p: [[2,4],[5,6],[9,3]]},
@item
uma lista de números, @code{p: [4,6,3]}, e nesse caso as abcissas irão ser atribuídas automaticamente aos valores 1, 2, 3, etc.
@end itemize

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

Existem três opções para ajustar necessidades específicas:
@itemize @bullet
@item
@code{'d1}, o padrão é @code{'unknown}, é a primeira derivada em @math{x_1}; se essa primeira derivada for desconhecida, @code{'unknown}, a segunda derivada em @math{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.

@item
@code{'dn}, o padrão é @code{'unknown}, é a primeira derivada em @math{x_n}; se essa primeira derivada for desconhecida, @code{'unknown}, a segunda derivada em @math{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.

@item
@code{'nome_var}, o padrão é @code{'x}, é o nome da variável independente.
@end itemize

Exemplos:
@example
(%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"]])$
@end example

@end deffn

