[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

# 59. interpol

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 59.1 Introduction to interpol

パッケージ `interpol`は多項式内挿のための Lagrange、線形、三次スプライン法を定義します。

コメント、バグ、提案は ’mario AT edu DOT xunta DOT es’にコンタクトを取ってください。

·

Categories: Numerical methods ·Share packages ·Package interpol

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 59.2 Functions and Variables for interpol

関数: lagrange (points)
関数: lagrange (points, option)

  Lagrange法で多項式内挿を計算します。 引数 pointsは以下のいずれかでなければいけません:

  - 2列行列, `p:matrix([2,4],[5,6],[9,3])`,
  - 対のリスト, `p: [[2,4],[5,6],[9,3]]`,
  - 数のリスト, `p: [4,6,3]`, この場合、横座標は自動的に 1, 2, 3などに割り当てます。

  最初の 2つの場合には、 計算を行う前に対を最初の座標に関して並び替えます。

  option引数を使って独立変数の名前を選択することが可能です。 デフォルトでは `'x`です; 別のものを定義するには `varname='z`のように書いてください。

  高次多項式を使って計算する時には、浮動小数点評価は不安定なことに注意してください。

  `linearinterpol`, `cspline`, `ratinterpol`も参照して下さい。

  例:

      (%i1) load(interpol)$
      (%i2) p:[[7,2],[8,2],[1,5],[3,2],[6,7]]$
      (%i3) lagrange(p);
             (x - 7) (x - 6) (x - 3) (x - 1)
      (%o3)  -------------------------------
                           35
         (x - 8) (x - 6) (x - 3) (x - 1)
       - -------------------------------
                       12
         7 (x - 8) (x - 7) (x - 3) (x - 1)
       + ---------------------------------
                        30
         (x - 8) (x - 7) (x - 6) (x - 1)
       - -------------------------------
                       60
         (x - 8) (x - 7) (x - 6) (x - 3)
       + -------------------------------
                       84
      (%i4) f(x):=''%;
                     (x - 7) (x - 6) (x - 3) (x - 1)
      (%o4)  f(x) := -------------------------------
                                   35
         (x - 8) (x - 6) (x - 3) (x - 1)
       - -------------------------------
                       12
         7 (x - 8) (x - 7) (x - 3) (x - 1)
       + ---------------------------------
                        30
         (x - 8) (x - 7) (x - 6) (x - 1)
       - -------------------------------
                       60
         (x - 8) (x - 7) (x - 6) (x - 3)
       + -------------------------------
                       84
      (%i5) /* Evaluate the polynomial at some points */
            expand(map(f,[2.3,5/7,%pi]));
                                        4          3           2
                          919062  73 %pi    701 %pi    8957 %pi
      (%o5)  [- 1.567535, ------, ------- - -------- + ---------
                          84035     420       210         420
                                                   5288 %pi   186
                                                 - -------- + ---]
                                                     105       5
      (%i6) %,numer;
      (%o6) [- 1.567535, 10.9366573451538, 2.89319655125692]
      (%i7) load(draw)$  /* load draw package */
      (%i8) /* Plot the polynomial together with points */
            draw2d(
              color      = red,
              key        = "Lagrange polynomial",
              explicit(f(x),x,0,10),
              point_size = 3,
              color      = blue,
              key        = "Sample points",
              points(p))$
      (%i9) /* Change variable name */
            lagrange(p, varname=w);
             (w - 7) (w - 6) (w - 3) (w - 1)
      (%o9)  -------------------------------
                           35
         (w - 8) (w - 6) (w - 3) (w - 1)
       - -------------------------------
                       12
         7 (w - 8) (w - 7) (w - 3) (w - 1)
       + ---------------------------------
                        30
         (w - 8) (w - 7) (w - 6) (w - 1)
       - -------------------------------
                       60
         (w - 8) (w - 7) (w - 6) (w - 3)
       + -------------------------------
                       84

  ·

  Categories: Package interpol

関数: charfun2 (x, a, b)

  もし数 xが区間 [a, b)に属するなら `true`を返し、 そうでないなら `false`を返します。

  ·

  Categories: Package interpol

関数: linearinterpol (points)
関数: linearinterpol (points, option)

  線形法で多項式内挿を計算します。 引数 pointsは以下のいずれかでなければいけません:

  - 2列行列, `p:matrix([2,4],[5,6],[9,3])`,
  - 対のリスト, `p: [[2,4],[5,6],[9,3]]`,
  - 数のリスト, `p: [4,6,3]`, この場合、横座標は自動的に 1, 2, 3などに割り当てます。

  最初の 2つの場合には、 計算を行う前に対を最初の座標に関して並び替えます。

  option引数を使って独立変数の名前を選択することが可能です。 デフォルトでは `'x`です; 別のものを定義するには `varname='z`のように書いてください。

  `lagrange`, `cspline`, `ratinterpol`も参照して下さい。

  例:

      (%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) load(draw)$  /* load draw package */
      (%i8)  /* Plot the polynomial together with points */
             draw2d(
               color      = red,
               key        = "Linear interpolator",
               explicit(f(x),x,-5,20),
               point_size = 3,
               color      = blue,
               key        = "Sample points",
               points(args(p)))$
      (%i9)  /* Change variable name */
             linearinterpol(p, varname='s);
             13   3 s
      (%o9) (-- - ---) 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

  ·

  Categories: Package interpol

関数: cspline (points)
関数: cspline (points, option1, option2, ...)

  三次スプライン法で多項式内挿を計算します。 引数 pointsは以下のいずれかでなければいけません:

  - 2列行列, `p:matrix([2,4],[5,6],[9,3])`,
  - 対のリスト, `p: [[2,4],[5,6],[9,3]]`,
  - 数のリスト, `p: [4,6,3]`, この場合、横座標は自動的に1, 2, 3などに割り当てます。

  最初の 2つの場合には、 計算を行う前に対を最初の座標に関して並び替えます。

  特定の必要性に合わせるため3つのオプションがあります:

  - `'d1`, デフォルトは `'unknown`, は x_1での一階導関数です; もし `'unknown`なら、 x_1での二階導関数は 0に等しいとします(自然な三次スプライン); もし数字だったら二階導関数をこの数字に基づいて計算します。
  - `'dn`, デフォルトは `'unknown`, は x_nでの一階導関数です; もし `'unknown`なら、 x_nでの二階導関数は0に等しいとします(自然な三次スプライン); もし数字だったら二階導関数をこの数字に基づいて計算します。
  - `'varname`, デフォルトは `'x`, は独立変数の名前です。

  `lagrange`, `linearinterpol`, `ratinterpol`も参照して下さい。

  例:

      (%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) load(draw)$  /* load draw package */
      (%i7) /* Plotting interpolating function */
            draw2d(
              color      = red,
              key        = "Cubic splines",
              explicit(f(x),x,0,10),
              point_size = 3,
              color      = blue,
              key        = "Sample points",
              points(p))$
      (%i8) /* New call, but giving values at the derivatives */
            cspline(p,d1=0,dn=0);
                    3          2
              1949 x    11437 x    17027 x   1247
      (%o8)  (------- - -------- + ------- + ----) 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 */
            draw2d(
              color      = black,
              key        = "Cubic splines (default)",
              explicit(f(x),x,0,10),
              color      = red,
              key        = "Cubic splines (d1=0,dn=0)",
              explicit(g(x),x,0,10),
              point_size = 3,
              color      = blue,
              key        = "Sample points",
              points(p))$

  ·

  Categories: Package interpol

関数: ratinterpol (points, numdeg)
関数: ratinterpol (points, numdeg, option1, option2, ...)

  pointsで与えられたデータと numdegに等しい分子の次数の関して有理形内挿を生成します; 分子の次数は自動的に計算されます。 引数 pointsは以下のいずれかでなければいけません:

  - 2列行列, `p:matrix([2,4],[5,6],[9,3])`,
  - 対のリスト, `p: [[2,4],[5,6],[9,3]]`,
  - 数のリスト, `p: [4,6,3]`, この場合、横座標は自動的に1, 2, 3などに割り当てます。

  最初の2つの場合には、 計算を行う前に対を最初の座標に関して並び替えます。

  特定の必要性に合わせるため2つのオプションがあります:

  - `'denterm`, デフォルトは `1`, は分子の中の多項式の独立項です。
  - `'varname`, デフォルトは `'x`, は独立変数の名前です。

  例:

  `lagrange`, `linearinterpol`, `cspline`, `minpack_lsquares`, `lbfgs`も参照して下さい。

      (%i1) load(interpol)$
      (%i2) load(draw)$
      (%i3) p:[[7.2,2.5],[8.5,2.1],[1.6,5.1],[3.4,2.4],[6.7,7.9]]$
      (%i4) for k:0 thru length(p)-1 do
              draw2d(
                explicit(ratinterpol(p,k),x,0,9),
                point_size = 3,
                points(p),
                title = concat("Degree of numerator = ",k),
                yrange=[0,10])$

  ·

  Categories: Package interpol

[ << ] | [ >> ] |  |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

この文書は市川 雄二によって2012年12月月12日にtexi2html 1.82を用いて生成されました。