5. 補間

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) を入力します. ここで, xiは昇順になっていなければなりません. WPchse関数を使用してスプライン補間に必要な係数dを求めるためにN(= データ点数)個のセルを選択します.

ここで, 数式バーのfxをクリックすると使用する関数を聞かれるので, 関数の分類XLPackよりWPchseを選択します.

必要なパラメータ(ここでは, N, X(), Y())の入力を要求されるので, それぞれに適切な値を入力します. Nはデータ数(この例では8), X()はデータ点xの範囲, Y()はデータ点yの範囲です.

入力が終了したらCtrl+Shift+Enterを押します.

次に, 別の場所に求めたい点のデータ(この場合, n=1.55~2.15)を入力しておき, そこにおける関数値をWPchfe関数を使って求めます. WPchfeは, 求めたい点のデータ点数 Ne (この例では7), 求めたい点のデータの値の範囲 Xe(), スプライン係数を求めた時のデータ点数 N (この例では8), xの範囲 X(), yの範囲 Y(), および, WPchseにより求められたスプライン係数の範囲 D()を入力として, 求めたい点における関数値を計算します.

以上で, 表にない点の値を求めることができました.

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

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(4 + I, 1)
        Y(I) = Cells(4 + 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(4 + 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(4 + I, 5) = Fe(I)
    Next
End Sub

所定の位置にデータを入力し, マクロStartとしてプログラムを実行すると次の結果が得られます.