# lsq_splin

ajuste ponderado por spline cúbico de mínimos quadrados

## Seqüência de Chamamento

    [y, d] = lsq_splin(xd, yd [, wd], x)

## Parâmetros

xd, yd

  vetores de mesmo tamanho, dados a serem ajustados por um spline cúbico

wd

  (opcional) um vetor de mesmo formato que `xd` e `yd`, pesos dos ajustes de mínimos quadrados.

x

  vetor (linha ou coluna) estritamente crescente, pontos de interrupção do spline cúbico

y, d

  vetores de mesmo formato que `x`, a tripla(x,y,d) define o spline cúbico aproximado.

## Descrição

Esta função computa um spline cúbico aproximado s para os dados `xd, yd, wd` (a partir daqui m é suposto como o comprimento desses vetores) e, de uma escolha dos pontos de interrupção do spline, o vetor `x` (por exemplo, se você deseja n pontos de interrupção uniformemente escolhidos você pode usar `x=linspace(min(xd),max(xd),n))`). Se S é o espaço de todas as funções spline cúbicas com pontos de interrupção x1 < x2 < ... < xn então, o spline resultante s é tal que:

    _m_                               _m_
    \                           2     \                           2
    /   wd(k) (s(xd(k)) - yd(k))  <=  /   wd(k) (f(xd(k)) - yd(k))
    ---                               ---
    k=1                               k=1

para todo fem S, i.e., realiza o mínimo da soma de todos os erros quadrados sobre todas as funções de S.

O spline s é completamente definido pela tripla `(x,y,d)` (`y` e `d` são os vetores das ordenadas dos splines e das derivadas primeiras nos xi 's : yi=s(xi) e di=s'(xi)) e sua avaliação em alguns pontos deve ser feita pela função interp.

## Observações

Quando `wd` não é dado, todos os pontos têm o mesmo peso 1

Um ponto (xd(k),yd(k)) é considerado no ajuste se xd(k) em [x1,xn] e wd(k) > 0. Em particular, você pode colocar um peso nulo (ou mesmo negativo) a todos os pontos que você deseja que sejam ignorados no ajuste. Quando o número total de pontos levados em conta no "procedure" de ajuste é (estritamente) menor que 4, ocorre um erro.

O vetor `xd` não necessita estar em ordem crescente

Dependendo do número e das posições dos xd(k) 's e da escolha dos x(i) 's podem haver várias soluções, mas apenas uma é selecionada. Quando isso ocorre, um aviso é exibido na janela de comando do Scilab. Esta função foi feita para ser usada quando m é muito maior que n e neste caso, tal tipo de problema não ocorre.

## Exemplos

    // este é um exemplo artificial, onde os dados xd e yd
    // são contruídos a partir de uma função seno perturbada
    a = 0; b = 2*%pi;
    sigma = 0.1;  // desvio padrão do ruído gaussiano
    m = 200;       // número de pontos experimentais
    xd = linspace(a,b,m)';
    yd = sin(xd) + grand(xd,"nor",0,sigma);

    n = 6; // número de pontos de interrupção
    x = linspace(a,b,n)';

    // computando o spline
    [y, d] = lsq_splin(xd, yd, x);  // usando pesos iguais

    // plotando
    ye = sin(xd);
    ys = interp(xd, x, y, d);
    clf()
    plot2d(xd,[ye yd ys],style=[2 -2 3], ...
           leg="função exata@medidas experimentais (perturbação gaussiana)@spline ajustado")
    xtitle("Um spline de mínimos quadrados")
    show_window()

## Ver Também

- interp
- splin

## Autores

- C. De Boor, A.H. Morris (código da biblioteca FORTRAN NSWC)
- B. Pincon (interface Scilab e ligeiras modificações)