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

◆ Chfdv()

Sub Chfdv ( X1 As  Double,
X2 As  Double,
F1 As  Double,
F2 As  Double,
D1 As  Double,
D2 As  Double,
Ne As  Long,
Xe() As  Double,
Fe() As  Double,
De() As  Double,
Nex() As  Long,
Info As  Long 
)

3次エルミート関数値および微分値

目的
本ルーチンはエルミート形式の3次関数値および微分値を計算する. すなわち, 区間[x1, x2]において関数値 f1, f2および微分値 d1, d2によって定められる3次多項式の点Xe(j) (j = 1〜Ne)における関数値および微分値を求める.

本ルーチンはPchfeの補助ルーチンとして設計されているが, グラフを描くなど区間があらかじめわかっているアプリケーションにおいて, 区分3次エルミート関数を直接計算する際に使うことができる.

関数値だけが必要な場合には, 本ルーチンのかわりにChfevを使用するとよい.
引数
[in]X13次曲線を定義する区間の端点. (X1 <> X2)
[in]X23次曲線を定義する区間の端点. (X1 <> X2)
[in]F1X1における関数値.
[in]F2X2における関数値.
[in]D1X1における微分値.
[in]D2X2における微分値.
[in]Ne関数値を計算する点の数. (Ne >= 1)
[in]Xe()配列 Xe(LXe - 1) (LXe >= Ne)
関数値を計算する点の値. Xe()の点のどれかが区間[X1, X2]外にあればNex()に警告エラーを返す.
[out]Fe()配列 Fe(LFe - 1) (LFe >= Ne)
Xe()の各点において計算されたX1, X2, F1, F2, D1, D2で定義される3次関数の値.
[out]De()配列 De(LDe - 1) (LDe >= Ne)
Xe()の各点において計算されたX1, X2, F1, F2, D1, D2で定義される3次関数の1次微分値.
[out]Nex()配列 Nex(LNex - 1) (LNex >= 2)
外挿点の数.
Nex(0) = 区間外(左)の評価点数.
Nex(1) = 区間外(右)の評価点数.
[out]Info= 0: 正常終了.
= -2: パラメータ X2 の誤り. (X2 = X1)
= -7: パラメータ Ne の誤り. (Ne < 1)
= -8: パラメータ Xe() の誤り.
= -9: パラメータ Fe() の誤り.
= -10: パラメータ De() の誤り.
= -11: パラメータ Nex() の誤り.
出典
SLATEC (PCHIP)
使用例
次の自然対数表を3次スプライン補間して, 0.11と0.12を端点とする3次関数を用いて ln(0.115) および ln(0.125) とそれらの微分値を求める. Nex(1) = 1 により区間外の評価点があることがわかる(0.125は区間外である).
  x       ln(x)
------ ---------
 0.10   -2.3026
 0.11   -2.2073
 0.12   -2.1203
 0.13   -2.0402
------ ---------
Sub Ex_Chfdv()
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, Nex(1) As Long
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
'-- 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 Chfdv(X(1), X(2), Y(1), Y(2), D(1), D(2), Ne, Xe(), Ye(), Yep(), Nex(), Info)
Debug.Print "ln(" + CStr(Xe(0)) + ") =", Ye(0), "ln'(" + CStr(Xe(0)) + ") =", Yep(0)
Debug.Print "ln(" + CStr(Xe(1)) + ") =", Ye(1), "ln'(" + CStr(Xe(1)) + ") =", Yep(1)
Debug.Print "Info =", Info, "Nex(0) =", Nex(0), "Nex(1) =", Nex(1)
End Sub
実行結果
ln(0.115) = -2.16285581089825 ln'(0.115) = 8.6907851599008
ln(0.125) = -2.07935612210228 ln'(0.125) = 8.04601195968914
Info = 0 Nex(0) = 0 Nex(1) = 1