@c Language=Russian
@c Encoding=CP1251
@c File=interpol.texi 
@c OriginalRevision=1.8
@c TranslatedBy: (c) 2008-03 Vadim V. Zhytnikov <vvzhyt@gmail.com>


@menu
* Введение в пакет interpol::
* Функции и переменные пакета interpol::
@end menu

@node Введение в пакет interpol, Функции и переменные пакета interpol, Пакет interpol, Пакет interpol
@section Введение в пакет interpol

Пакет @code{interpol} определяет методы Лагранжа, линейный и и метод кубических сплайнов для
полиномиальной интерполяции.

С комментариями, сообщениями об ошибках и предложениями, пожалуйста
обращайтесь ко мне по адресу @var{'mario AT edu DOT xunta DOT es'}.

@opencatbox
@category{Численные методы} @category{Пакеты библиотеки share} @category{Пакет interpol}
@closecatbox

@node Функции и переменные пакета interpol,  , Введение в пакет interpol, Пакет interpol
@section Функции и переменные пакета interpol


@deffn {Функция} lagrange (@var{points})
@deffnx {Функция} lagrange (@var{points}, @var{option})
Вычисляет полиномиальную интерполяцию методом Лагранжа. Аргумент @var{points} должен быть либо:

@itemize @bullet
@item
матрицей из двух колонок, @code{p:matrix([2,4],[5,6],[9,3])},
@item
списком пар, @code{p: [[2,4],[5,6],[9,3]]},
@item
списком чисел @code{p: [4,6,3]}, в этом случае абсцисса будет назначена автоматически равной 1, 2, 3 и т.д.
@end itemize

В первых двух случаях, перед проведением вычислений, пары упорядочиваются в соответствии 
со значением первой координаты.

Аргумент @var{option} позволяет выбрать имя независимой переменной, по умолчанию равной @code{'x}.
Чтобы задать другую переменную напишите @code{varname='z}. 

Отметим, что при работе с многочленами высокого порядка, вычисления с плавающей точкой 
нестабильны.

Примеры:

@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) 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);
                 4        3         2
             73 w    701 w    8957 w    5288 w   186
(%o9)        ----- - ------ + ------- - ------ + ---
              420     210       420      105      5
@end example

@opencatbox
@category{Пакет interpol}
@closecatbox

@end deffn


@deffn {Функция} charfun2 (@var{x}, @var{a}, @var{b})
Возвращает @code{true} если число @var{x} принадлежит интервалу @math{[a, b)}, и @code{false} в противном случае.

@opencatbox
@category{Пакет interpol}
@closecatbox

@end deffn


@deffn {Функция} linearinterpol (@var{points})
@deffnx {Функция} linearinterpol (@var{points}, @var{option})
Вычисляет полиномиальную интерполяцию линейным методом. Аргумент @var{points} должен быть либо:

@itemize @bullet
@item
матрицей из двух колонок, @code{p:matrix([2,4],[5,6],[9,3])},
@item
списком пар, @code{p: [[2,4],[5,6],[9,3]]},
@item
списком чисел @code{p: [4,6,3]}, в этом случае абсцисса будет назначена автоматически равной 1, 2, 3 и т.д.
@end itemize

В первых двух случаях, перед проведением вычислений, пары упорядочиваются в соответствии 
со значением первой координаты.

Аргумент @var{option} позволяет выбрать имя независимой переменной, по умолчанию равной @code{'x}.
Чтобы задать другую переменную напишите @code{varname='z}. 

Примеры:
@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) 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
@end example

@opencatbox
@category{Пакет interpol}
@closecatbox

@end deffn



@deffn {Функция} cspline (@var{points})
@deffnx {Функция} cspline (@var{points}, @var{option1}, @var{option2}, ...)
Вычисляет полиномиальную интерполяцию методом кубических сплайнов. Аргумент @var{points} должен быть либо:

@itemize @bullet
@item
матрицей из двух колонок, @code{p:matrix([2,4],[5,6],[9,3])},
@item
списком пар, @code{p: [[2,4],[5,6],[9,3]]},
@item
списком чисел @code{p: [4,6,3]}, в этом случае абсцисса будет назначена автоматически равной 1, 2, 3 и т.д.
@end itemize

В первых двух случаях, перед проведением вычислений, пары упорядочиваются в соответствии 
со значением первой координаты.

Существует три специальные опции:
@itemize @bullet
@item
@code{'d1}, по умолчанию @code{'unknown}, -- первая производная в точке @math{x_1}. Если @code{'unknown}, 
то вторая производная в точке @math{x_1} предполагается равной 0 (натуральный кубический сплайн). 
Если задана, то вторая производная вычисляется исходя из этого числа.

@item
@code{'dn}, по умолчанию @code{'unknown}, -- первая производная в точке @math{x_n}. Если @code{'unknown}, 
то вторая производная в точке @math{x_n} предполагается равной 0 (натуральный кубический сплайн). 
Если задана, то вторая производная вычисляется исходя из этого числа.

@item
@code{'varname}, по умолчанию @code{'x}, -- имя независимой переменной.
@end itemize

Примеры:
@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) 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))$
@end example

@opencatbox
@category{Пакет interpol}
@closecatbox

@end deffn
