XLPack 7.0
XLPack 数値計算ライブラリ (Excel VBA) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ Pchsp()

Sub Pchsp ( Ic() As  Long,
Vc() As  Double,
N As  Long,
X() As  Double,
F() As  Double,
D() As  Double,
Info As  Long,
Optional Idxfd As  Long = 0,
Optional Incfd As  Long = 1 
)

区分3次スプライン補間

目的
本ルーチンは, 区分的エルミート補間式による3次スプライン補間のために, 指定された境界条件を用いて与えられたデータの微分係数値を計算する.

得られた係数を使った3次スプライン補間関数値はPchfeまたはPchfdにより求めることができる.
引数
[in]Ic()配列 Ic(LIc - 1) (LIc >= 2)
境界条件の取り扱いを指定.
Ic(0) = Ibeg, データの始点における条件.
Ic(1) = Iend, データの終点における条件.

Ibeg = 0: x(1)における3次微分係数が連続になるようにD(0)を設定する. "not a knot" 条件とよばれ, 既定の境界条件である.
Ibeg = 1: X(0)における1次微分係数をVc(0)で与える.
Ibeg = 2: X(0)における2次微分係数をVc(0)で与える. "自然"境界条件とするためには, Ibeg = 2, Vc(0) = 0とせよ.
Ibeg = 3: D(0)に3点差分を使用(n < 3ならば既定の境界条件に戻す).
Ibeg = 4: D(0)に4点差分を使用(n < 4ならば既定の境界条件に戻す).

IendはIbegと同じ値でよいが, X(N-1)における微分値に適用される. Iend = 1 または 2の場合, 値はVc(1)で与える. "自然"境界条件とするためには, Iend = 2, Vc(1) = 0とせよ.
[in]Vc()配列 Vc(LVc - 1) (LVc >= 2)
境界値を指定する
Vc(0)は Ic(0) = 1 または 2 の場合だけ設定すればよい.
Vc(1)は Ic(1) = 1 または 2 の場合だけ設定すればよい.
[in]Nデータ点数. (N >= 2)
[in]X()配列 X(LX - 1) (LX >= N)
独立変数値. X()の要素は昇順でなければならない.
[in]F()配列 F(LF - 1) (LF >= Incfd*(N - 1) + 1)
補間される従属変数値. F(Idxfd + I*Incfd)がX(I)に対応する値である (I = 0〜N-1).
[out]D()配列 D(LD - 1) (LD >= Incfd*(N - 1) + 1)
各データ点における微分係数値. これらの値により, 要求された境界条件による3次スプライン補間式が決定される. X(I)に対応する値はD(Idxfd + I*Incfd)に格納される (I = 0〜N-1). D()のその他の場所は変更されない.
[out]Info= 0: 正常終了.
= -1: パラメータ Ic() の誤り. (Ic(0) < 0 または Ic(0) > 4, Ic(1) < 0 または Ic(1) > 4)
= -2: パラメータ Vc() の誤り.
= -3: パラメータ N の誤り. (N < 2)
= -4: パラメータ X() の誤り. (X()が昇順でないなど)
= -5: パラメータ F() の誤り.
= -6: パラメータ D() の誤り.
= -9: パラメータ Incfd の誤り. (Incfd < 1)
[in]Idxfd(省略可)
F()およびD()の先頭データのインデックス値. (省略時 = 0)
[in]Incfd(省略可)
F()およびD()の要素間隔. このパラメータは主として2次元アプリケーションのために提供される. (incfd >= 1) (省略時 = 1)
出典
SLATEC (PCHIP)
使用例
次の自然対数表を3次スプライン補間(自然スプライン)して, ln(0.115) および ln(0.125) を求める.
  x       ln(x)
------ ---------
 0.10   -2.3026
 0.11   -2.2073
 0.12   -2.1203
 0.13   -2.0402
------ ---------
Sub Ex_Pchsp()
Const N = 4, Ne = 2
Dim X(N - 1) As Double, Y(N - 1) As Double, D(N - 1) As Double
Dim Ic(1) As Long, Vc(1) As Double
Dim Xe(Ne - 1) As Double, Ye(Ne - 1) As Double
Dim Info As Long
'-- Data
X(0) = 0.1: Y(0) = -2.3026
X(1) = 0.11: Y(1) = -2.2073
X(2) = 0.12: Y(2) = -2.1203
X(3) = 0.13: Y(3) = -2.0402
'-- Spline interpolation (Natural spline)
Ic(0) = 2: Ic(1) = 2
Vc(0) = 0: Vc(1) = 0
Call Pchsp(Ic(), Vc(), N, X(), Y(), D(), Info)
If Info <> 0 Then
Debug.Print "Error in Pchsp: Info =", Info
Exit Sub
End If
'-- Compute interpolated values
Xe(0) = 0.115: Xe(1) = 0.125
Call Pchfe(N, X(), Y(), D(), Ne, Xe(), Ye(), Info)
Debug.Print "ln(" + CStr(Xe(0)) + ") =", Ye(0)
Debug.Print "ln(" + CStr(Xe(1)) + ") =", Ye(1)
Debug.Print "Info =", Info
End Sub
Sub Pchfe(N As Long, X() As Double, F() As Double, D() As Double, Ne As Long, Xe() As Double, Fe() As Double, Info As Long, Optional Skip As Boolean=False, Optional Idxfd As Long=0, Optional Incfd As Long=1)
区分3次エルミート(または3次スプライン)補間関数値
Sub Pchsp(Ic() As Long, Vc() As Double, N As Long, X() As Double, F() As Double, D() As Double, Info As Long, Optional Idxfd As Long=0, Optional Incfd As Long=1)
区分3次スプライン補間
実行結果
ln(0.115) = -2.16266
ln(0.125) = -2.0797675
Info = 0