5. 補間

注 – 例題ワークシートをダウンロードすることができます. 1. 例題ワークシートの入手と使用方法 をご覧ください.


3 次スプライン関数による補間値の XLPack による求め方を説明します.

例題: 対数表

最近では使用されなくなりましたが, かつては対数表などの数表が使われていました.

下表は自然対数表の一部を抜き出したものです.

n ln(n)
1.5 0.405465108108164
1.6 0.470003629245736
1.7 0.53062825106217
1.8 0.587786664902119
1.9 0.641853886172395
2.0 0.693147180559945
2.1 0.741937344729377
2.2 0.78845736036427
ここで, 数表に載っていない値, 例えば ln(1.85)などを求めたいものとします.

以下, ワークシート関数 WPchse および WPchfe, また, VBAサブルーチン Pchse および Pchfe を使った 2 種類の解き方を説明します.

ワークシート関数を使用した解き方

ワークシートの適当な場所にデータ (xi, yi = ln(xi)) を入力します(左のオレンジ色のセル). ここで, xi は昇順になっていなければなりません. スプライン補間に必要な係数 di を求めるためにデータ数個のセルを選択してワークシート関数 WPchse を入力します(左の緑色のセル).

WPchse の必要なパラメータは N, X, Y です. N はデータ数(この例では 8), X と Y は補間するデータ (xi, yi) のセル範囲です.

入力が終了したら Ctrl + Shift + Enter を押します. これで, スプライン補間係数が求められました.

次に, 別の場所に求めたい点のデータ(この場合, n = 1.55 ~ 2.15)を入力しておき(右のオレンジ色のセル), そこにおける関数値を WPchfe 関数を使って求めます(右の緑色のセル).

WPchfe の必要なパラメータは Ne, Xe, N, X, Y, D です. Ne は求めたい点のデータ数(この例では 7), Xe は求めたい点のデータのセル範囲です. N, X, Y は補間係数を求めたときの WPchse の入力データと同じです. D は求められた補間係数です.

Ctrl + Shift + Enter を押すと, 表に載っていない点における自然対数の値が求められます. ここでは, 表に載っていない点を丸で, 数表の値を直線で表すグラフも作成してみました.

この例では, データ点は等間隔でしたが, 必ずしも等間隔である必要はありません. ただし, 間隔が大きく空いている区間の補間値は精度が悪くなります. また, データ点の範囲外での値(外挿値)を計算することもできますが精度は落ちます.

VBAプログラムを使用した解き方

上と同じ例を VBA プログラムにより解いてみます. VBA サブルーチン Pchse および Pchfe を使ったプログラム例を以下に示します.

Sub Start()
    Const NMax = 10
    Dim N As Long, Ne As Long, I As Long, Info As Long
    Dim X(NMax) As Double, Y(NMax) As Double, D(NMax) As Double
    Dim Xe(NMax) As Double, Fe(NMax) As Double
    '--- Input data
    N = 8
    For I = 0 To N - 1
        X(I) = Cells(5 + I, 1)
        Y(I) = Cells(5 + I, 2)
    Next
    '--- Compute coefficients of a cubic spline
    Call Pchse(N, X(), Y(), D(), Info)
    If Info <> 0 Then
        MsgBox "** Error in Pchse **  Info = " + Str(Info)
        Exit Sub
    End If
    '--- Compute interporated values
    Ne = N - 1
    For I = 0 To Ne - 1
        Xe(I) = Cells(5 + I, 4)
    Next
    Call Pchfe(N, X(), Y(), D(), Ne, Xe(), Fe(), Info)
    If Info <> 0 Then
        MsgBox "** Error in Pchfe **  Info = " + Str(Info)
        Exit Sub
    End If
    '--- Output result
    For I = 0 To Ne - 1
        Cells(5 + I, 5) = Fe(I)
    Next
End Sub

所定の位置(下のオレンジ色のセル)にデータを入力し, マクロ Start としてプログラムを実行すると次の結果が得られます. ワークシート関数を使用したときと異なり, 補間データを入力しただけでは結果が得られず, VBA プログラムを実行してやる必要があります.