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

◆ Pchim()

Sub Pchim ( 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次エルミート補間のための微分係数を計算する. Pchimでは単調関数用の既定の境界条件が与えられる. ユーザーによる境界条件の制御が必要であればPchicを使用せよ.

得られた区分3次エルミート関数の値はPchfeまたはPchfdにより求めることができる.
引数
[in]Nデータ点数. (N >= 2)
N = 2のときは単純な線形補間を行う.
[in]X()配列 X(LX - 1) (LX >= N)
独立変数値. (昇順であること)
[in]F()配列 F(LF - 1) (LF >= Incfd*(N - 1) + 1)
補間する従属変数値.
[out]D()配列 D(LD - 1) (LD >= Incfd*(N - 1) + 1)
各x座標における微分値.
[out]Info= 0: 正常終了.
= -1: パラメータ N の誤り. (N < 2)
= -2: パラメータ X() の誤り. (X()が昇順でない)
= -3: パラメータ F() の誤り.
= -4: パラメータ D() の誤り.
= -7: パラメータ Incfd の誤り. (Incfd < 1)
= i > 0: 単調増加/減少の切り替えがi回検出された.
[in]Idxfd(省略可)
F()およびD()の先頭データのインデックス値. (省略時 = 0)
[in]Incfd(省略可)
F()およびD()の要素間隔. (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_Pchim()
Const N = 4, Ne = 2
Dim X(N - 1) As Double, Y(N - 1) As Double, D(N - 1) As Double
Dim Xe(Ne - 1) As Double, Ye(Ne - 1) As Double
Dim Info As Long, I 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
'-- Cubic Hermite interpolation
Call Pchim(N, X(), Y(), D(), Info)
If Info <> 0 Then
Debug.Print "Error in Pchim: 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
Function Hermite(N As Long, X As Double, Optional Info As Long) As Double
エルミート多項式 Hn(x)
Sub Pchim(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次エルミート補間 (デフォルト境界条件)
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次スプライン)補間関数値
実行結果
ln(0.115) = -2.16285581089825
ln(0.125) = -2.07940530745063
Info = 0