XLPack 7.0
XLPack 数値計算ライブラリ (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
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 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次エルミート関数値および微分値
実行結果
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