Próximo: , Anterior:   [Conteúdo][Índice]

52, interpol


Próximo: , Anterior: , Acima: interpol   [Conteúdo][Índice]

52.1, Introdução a interpol

Pacote 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 ’mario AT edu DOT xunta DOT es’.


52.2, Definições para interpol

Função: lagrange (pontos)
Função: lagrange (pontos, opção)

Calcula a interpolaçã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 relação à primeira coordenada antes de fazer os cálculos.

Com o argumento opçã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
Funçã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.

Função: linearinterpol (pontos)
Função: linearinterpol (pontos, opção)

Calcula a interpolaçã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 relação à primeira coordenada antes de fazer os cálculos.

Com o argumento opçã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
Função: cspline (pontos)
Função: cspline (pontos, opção1, 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 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 relação à primeira coordenada antes de fazer os cálculos.

Existem três opçõ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"]])$

Próximo: , Anterior:   [Conteúdo][Índice]