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 |
以下, ワークシート関数 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 プログラムを実行してやる必要があります.