# interp

função de avaliação de spline cúbico

## Seqüência de Chamamento

    [yp [,yp1 [,yp2 [,yp3]]]]=interp(xp, x, y, d [, out_mode])

## Parâmetros

xp

  vetor ou matriz de reais

x,y,d

  vetores de reais de mesmo tamanho definindo uma função de spline cúbico ou sub-spline (chamado `s` a partir daqui)

out_mode

  (opcional) string definido a avaliação de `s` fora do intervalo [x1,xn]

yp

  vetor ou matriz de mesmo tamanho que `xp`, avaliação elemento a elemento de `s` em `xp` (yp(i)=s(xp(i) ou yp(i,j)=s(xp(i,j))

yp1, yp2, yp3

  vetores (ou matrizes) de mesmo tamanho que `xp`, avaliação elemento a elemento das derivadas sucessivas de `s` em `xp`

## Descrição

Dados três vetores `(x,y,d)` ddefinindo uma função de spline cúbico ou sup-spline (ver splin) com `yi=s(xi), di = s'(xi)` esta função avalia `s` (e `s', s'', s'''` se necessário) em `xp(i)` :

    yp(i) = s(xp(i))    ou  yp(i,j) = s(xp(i,j))
    yp1(i) = s'(xp(i))   ou  yp1(i,j) = s'(xp(i,j))
    yp2(i) = s''(xp(i))   ou  yp2(i,j) = s''(xp(i,j))
    yp3(i) = s'''(xp(i))   ou  yp3(i,j) = s'''(xp(i,j))

O parâmetro `out_mode` ajusta a regra de avaliação para extrapolação, i.e., para `xp(i)` fora de [x1,xn] :

"by_zero"

  uma extrapolação por zero é feita

"by_nan"

  extrapolação por NaN

"C0"

  a extrapolação é definida como segue :

      s(x) = y1  para  x < x1
      s(x) = yn  para  x > xn

"natural"

  a extrapolação é definida como segue (p_i sendo o polinômio que define `s` em [x_i,x_{i+1}]) :

      s(x) = p_1(x)      para  x < x1
      s(x) = p_{n-1}(x)  para  x > xn

"linear"

  a extrapolação é definida como segue :

      s(x) = y1 + s'(x1)(x-x1)  para  x < x1
      s(x) = yn + s'(xn)(x-xn)  para  x > xn

"periodic"

  `s` é estendido por periodicidade.

## Exemplos

    // veja os exemplos de splin e lsq_splin

    // um exemplo exibindo as continuidades C2 e C1 de um spline e um sub-spline
    a = -8; b = 8;
    x = linspace(a,b,20)';
    y = sinc(x);
    dk = splin(x,y);  // not_a_knot
    df = splin(x,y, "fast");
    xx = linspace(a,b,800)';
    [yyk, yy1k, yy2k] = interp(xx, x, y, dk);
    [yyf, yy1f, yy2f] = interp(xx, x, y, df);
    clf()
    subplot(3,1,1)
    plot2d(xx, [yyk yyf])
    plot2d(x, y, style=-9)
    legends(["spline não é um nó","sub-spline rápido","pontos de interpolação"],...
            [1 2 -9], "ur",%f)
    xtitle("interpolação por spline")
    subplot(3,1,2)
    plot2d(xx, [yy1k yy1f])
    legends(["spline não é um nó","sub-spline rápido"], [1 2], "ur",%f)
    xtitle("interpolação por spline (derivadas)")
    subplot(3,1,3)
    plot2d(xx, [yy2k yy2f])
    legends(["spline não é um nó","sub-spline rápido"], [1 2], "lr",%f)
    xtitle("interpolação por splines (segundas derivadas)")

    // aqui está um exemplo mostrando as diferentes possibilidades de extrapolação
    x = linspace(0,1,11)';
    y = cosh(x-0.5);
    d = splin(x,y);
    xx = linspace(-0.5,1.5,401)';
    yy0 = interp(xx,x,y,d,"C0");
    yy1 = interp(xx,x,y,d,"linear");
    yy2 = interp(xx,x,y,d,"natural");
    yy3 = interp(xx,x,y,d,"periodic");
    clf()
    plot2d(xx,[yy0 yy1 yy2 yy3],style=2:5,frameflag=2,leg="C0@linear@natural@periodic")
    xtitle(" Modos diferentes de avaliar um spline fora de seu domínio")

## Ver Também

- splin
- lsq_splin