XLPack 7.0
XLPack 数値計算ライブラリ (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
Function Hermite(N As Long, X As Double, Optional Info As Long) As Double
エルミート多項式 Hn(x)
Sub Pchfd(N As Long, X() As Double, F() As Double, D() As Double, Ne As Long, Xe() As Double, Fe() As Double, De() As Double, Info As Long, Optional Skip As Boolean=False, Optional Idxfd As Long=0, Optional Incfd As Long=1)
区分3次エルミート(または3次スプライン)補間関数値および微分値
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次エルミート補間
実行結果
ln(0.115) = -2.16285581089825
ln(0.125) = -2.07943944206601
ln'(0.115) = 8.6907851599008
ln'(0.125) = 8.00673456704872
Info = 0