|
|
◆ Chfev()
| Sub Chfev |
( |
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, |
|
|
Nex() As |
Long, |
|
|
Info As |
Long |
|
) |
| |
3次エルミート関数値
- 目的
- 本ルーチンはエルミート形式の3次関数値を計算する. すなわち, 区間[x1, x2]において関数値 f1, f2および微分値 d1, d2によって定められる3次多項式の点Xe(j) (j = 1〜Ne)における関数値を求める.
本ルーチンはPchfeの補助ルーチンとして設計されているが, グラフを描くなど区間があらかじめわかっているアプリケーションにおいて, 区分3次エルミート関数を直接計算する際に使うことができる.
- 引数
-
| [in] | X1 | 3次曲線を定義する区間の端点. (X1 <> X2) |
| [in] | X2 | 3次曲線を定義する区間の端点. (X1 <> X2) |
| [in] | F1 | X1における関数値. |
| [in] | F2 | X2における関数値. |
| [in] | D1 | X1における微分値. |
| [in] | D2 | X2における微分値. |
| [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] | 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: パラメータ 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_Chfev()
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, 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
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 Chfev(X(1), X(2), Y(1), Y(2), D(1), D(2), Ne, Xe(), Ye(), Nex(), Info)
Debug.Print "ln(" + CStr(Xe(0)) + ") =", Ye(0)
Debug.Print "ln(" + CStr(Xe(1)) + ") =", Ye(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 Chfev(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, Nex() As Long, Info As Long) 3次エルミート関数値
- 実行結果
ln(0.115) = -2.16285581089825
ln(0.125) = -2.07935612210228
Info = 0 Nex(0) = 0 Nex(1) = 1
|