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

◆ Pchic()

Sub Pchic ( Ic() As  Long,
Vc() As  Double,
Switch 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次エルミート補間のための微分係数を計算する. Pchicでは境界条件, および, 単調増加/減少の切り替えが起きる点の取り扱いをユーザー制御可能である.

得られた区分3次エルミート関数の値はPchfeまたはPchfdにより求めることができる.
引数
[in]Ic()配列 Ic(LIc - 1) (LIc >= 2)
境界条件の取り扱いを指定.
Ic(0) = データの始点における条件.
  = 0: 既定の境界条件 (Pchimで使われるものと同じ).
  > 0: 境界における微分係数の単調性のための調整を行わない.
  < 0: 境界における微分係数は単調性のために調整される.
  Ic(0)に許される数値の絶対値は次のとおり.
  = 1: X(0)における1次微分係数がVc(0)で与えられる.
  = 2: X(0)における2次微分係数がVc(0)で与えられる.
  = 3: D(0)に3点差分を使用 (N < 3ならば既定の境界条件に戻す).
  = 4: D(0)に4点差分を使用 (N < 4ならば既定の境界条件に戻す).
  = 5: 2次微分係数がX(1)において連続となるようにD(0)を設定する (N < 4ならば既定の境界条件に戻す).
Ic(1) = データの終点における条件.
  Ic(0)と同様の値をとるが, X(N-1)における微分に適用される. Ic(1) = 1 または 2の場合, 値はVc(1)で与えられる.
[in]Vc()配列 Vc(LVc - 1) (LVc >= 2)
境界値を指定する.
Vc(0)は Ic(0) = 1 または 2 の場合だけ設定すればよい.
Vc(1)は Ic(1) = 1 または 2 の場合だけ設定すればよい.
[in]Switch単調増加/減少の切り替えが起きる点の取り扱いを指定する.
= 0: データの単調性を無視して単調なものとして扱う.
<> 0: 切り替え点の近傍で3点差分を使う.
> 0: 極値を含む区間における補間式はデータからSwitch*Dfloc以下のずれになるように制御される. ここで, Dflocはこの区間および両隣の区間におけるF()の値の最大変化である.
< 0: 特別な制御は行わない.
[in]Nデータ点数. (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: パラメータ Ic() の誤り. (Abs(Ic(0)) > 5 および/または Abs(Ic(1)) > 5)
= -2: パラメータ Vc() の誤り.
= -4: パラメータ N の誤り. (N < 2)
= -5: パラメータ X() の誤り. (X()が昇順でない)
= -6: パラメータ F() の誤り.
= -7: パラメータ D() の誤り.
= -11: パラメータ Incfd の誤り. (Incfd < 1)
= 1 Ic(0) < 0で D(0)を単調性のために調節する必要がある.
= 2 Ic(1) < 0で D((N-1)*Incfd)を単調性のために調節する必要がある.
= 3 上の2つ共起こった
[in]Idxfd(省略可)
F()およびD()の先頭データのインデックス値. (省略時 = 0)
[in]Incfd(省略可)
F()およびD()の要素間隔. (Incfd >= 1) (省略時 = 1)
出典
SLATEC (PCHIP)
使用例
次の自然対数表を区分3次エルミート補間して, ln(0.115) および ln(0.125) を求める.
この例では補間値の計算にPchfeの代わりにPchfdを使い, 微分値 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_Pchic()
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, Yep(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
Ic(0) = 1: Ic(1) = 1
Vc(0) = 1 / X(0): Vc(1) = 1 / X(3)
Call Pchic(Ic(), Vc(), 0, N, X(), Y(), D(), Info)
If Info <> 0 Then
Debug.Print "Error in Pchic: Info =", Info
Exit Sub
End If
'-- Compute interpolated values
Xe(0) = 0.115: Xe(1) = 0.125
Call Pchfd(N, X(), Y(), D(), Ne, Xe(), Ye(), Yep(), Info)
Debug.Print "ln(" + CStr(Xe(0)) + ") =", Ye(0)
Debug.Print "ln(" + CStr(Xe(1)) + ") =", Ye(1)
Debug.Print "ln'(" + CStr(Xe(0)) + ") =", Yep(0)
Debug.Print "ln'(" + CStr(Xe(1)) + ") =", Yep(1)
Debug.Print "Info =", Info
End Sub
実行結果
ln(0.115) = -2.16285581089825
ln(0.125) = -2.07943944206601
ln'(0.115) = 8.6907851599008
ln'(0.125) = 8.00673456704872
Info = 0