lsq_splin 重み付き最小二乗三次スプラインフィッティング

## 呼び出し手順

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

## パラメータ

xd, yd

  同じ大きさのベクトル, 3次スプラインによりフィッティング するデータ

wd

  (オプション) `xd` および `yd`の形式のベクトルで, 最小二乗フィッティングの重み.

x

  単調増加の (行または列) ベクトル, 3次スプラインの折点

y, d

  `x`と同じ大きさのベクトル, 近似3次スプラインを定義する組(x,y,d).

## 説明

この関数は,データ`xd, yd, wd` (以下では,mをこれらのベクトルの長さと 仮定します)および スプライン折点`x` (例えばn個の等間隔折点を選択したい場合には `x=linspace(min(xd),max(xd),n))`とする ことができます) に関して 近似3次スプラインsを計算します. Sを折点 x1 < x2 < ... < xnを指定する あらゆる3次スプライン関数の空間とする場合, 得られるスプライン sは次のようになります:

\sum_{k=1}^m wd(k)\left(s(xd(k))-yd(k)\right)^2 \,\leftarrow\, \sum_{k=1}^m wd(k)\left(f(xd(k))-yd(k)\right)^2

ただし,fはSの中の任意の値. すなわち,Sの任意の関数について, 二乗誤差の合計を最小化します.

スプラインsは 組`(x,y,d)`により完全に定義されます (`y` および `d` は,xiにおけるスプライン座標および1階微分のベクトル です : yi=s(xi) および di=s'(xi)) . 何らかの点における評価は, interp関数で行います.

## 注意

`wd`が指定されない場合, 全ての点は 同じ重み1を有します.

xd(k) が [x1,xn] の範囲で,wd(k) > 0の場合, 点 (xd(k),yd(k)) は, フィットの範囲にあるとみなされます. 特に, フィッティングにおいて無視したいデータ点に重み0 (または負の重み) を設定することができます. フィット処理が適用される点の総数が4個未満の場合, エラーが発生します.

ベクトル `xd` は昇順である必要は ありません.

数,xd(k)の位置, x(i)の選択に基づき いくつかの解が存在しますが, 選択できるのは1つだけです. この場合,Scilabコマンドウインドウに警告メッセージが 発生します. この関数は,mがnよりも はるかに大きい場合に使用されることを意図しています. このような場合,このような問題は発生しません.

## 例

    // これは人工的な例で,データxdおよびydは
    // 外乱付きのsin関数から構築されます
    a = 0; b = 2*%pi;
    sigma = 0.1;  // ガウスノイズの標準偏差
    m = 200;       // 試行点の数
    xd = linspace(a,b,m)';
    yd = sin(xd) + grand(xd,"nor",0,sigma);
    n = 6; // 折点の数
    x = linspace(a,b,n)';
    // スプラインを計算
    [y, d] = lsq_splin(xd, yd, x);  // 等しい重みを使用
    // プロット
    ye = sin(xd);
    ys = interp(xd, x, y, d);
    clf()
    plot2d(xd,[ye yd ys],style=[2 -2 3], ...
           leg="exact function@experimental measures (gaussian perturbation)@fitted spline")
    xtitle("a least square spline")
    show_window()

## 参照

- backslash
- datafit
- interp
- splin