|
|
◆ Pchid()
| Function Pchid |
( |
N As |
Long, |
|
|
X() As |
Double, |
|
|
F() As |
Double, |
|
|
D() As |
Double, |
|
|
IA As |
Long, |
|
|
IB As |
Long, |
|
|
Info As |
Long, |
|
|
Optional Skip As |
Boolean = False, |
|
|
Optional Idxfd As |
Long = 0, |
|
|
Optional Incfd As |
Long = 1 |
|
) |
| |
区分3次エルミート(または3次スプライン)補間関数の積分値 (積分区間の上下限がデータ点に一致する場合)
- 目的
- 本ルーチンは区分3次エルミート補間関数のデータ点で指定された区間における積分値を求める. 補間関数は Pchim, Pchic, Pchsp または Pchseにより求められた N, X(), F() および D()により定められる.
- 戻り値
- Double
求められた積分値.
- 引数
-
| [in] | N | データ点数. (N >= 2) |
| [in] | X() | 配列 X(LX - 1) (LX >= N)
独立変数値. X()の要素は昇順でなければならない. |
| [in] | F() | 配列 F(LF - 1) (LF >= Incfd*(N - 1) + 1)
関数の値. F(Idxfd + I*Incfd)がX(I)に対応する値である (I = 0〜N-1). |
| [in] | D() | 配列 D(LD - 1) (LD >= Incfd*(N - 1) + 1)
微分係数の値. D(Idxfd + I*Incfd)がX(I)に対応する値である (I = 0〜N-1). |
| [in] | IA | X()の中の積分区間の下限のインデックス値. (0 <= IA < IB <= N - 1) |
| [in] | IB | X()の中の積分区間の上限のインデックス値. (0 <= IA < IB <= N - 1) |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ N の誤り. (N < 2)
= -2: パラメータ X() の誤り. (X()が昇順でない)
= -3: パラメータ F() の誤り.
= -4: パラメータ D() の誤り.
= -7: パラメータ IA の誤り. (IA < 0 or IA > N-1)
= -8: パラメータ IB の誤り. (IB < 0 or IB > N-1)
= -10: パラメータ Incfd の誤り. (Incfd < 1) |
| [in] | Skip | (省略可)
論理変数で, パラメータチェックを省略したいならばTrueを、そうでなければFalseを設定する. これにより, チェックが(Pchim, Pchic, Pchsp あるいは Pchseで)すでに終わっている場合に計算時間を節約することができる. (省略時 = False) |
| [in] | Idxfd | (省略可)
F()およびD()の先頭データのインデックス値. (省略時 = 0) |
| [in] | Incfd | (省略可)
F()およびD()の要素間隔. (incfd >= 1) (省略時 = 1) |
- 出典
- SLATEC (PCHIP)
- 使用例
- 次の数表を用いて S = ∫ 1/(1 + x^2) dx [0, 4] (= atan(4)) を求める.
x 1/(1 + x^2)
----- -------------
-1 0.5
0 1
1 0.5
2 0.2
3 0.1
4 0.05882
5 0.03846
----- -------------
Sub Ex_Pchid()
Const N = 7, IA = 1, IB = 5
Dim X(N - 1) As Double, Y(N - 1) As Double, D(N - 1) As Double, S As Double
Dim Info As Long, I As Long
'-- Data
X(0) = -1: Y(0) = 0.5
X(1) = 0: Y(1) = 1
X(2) = 1: Y(2) = 0.5
X(3) = 2: Y(3) = 0.2
X(4) = 3: Y(4) = 0.1
X(5) = 4: Y(5) = 0.05882
X(6) = 5: Y(6) = 0.03846
'-- Spline interpolation
Call Pchse(N, X(), Y(), D(), Info)
If Info <> 0 Then
Debug.Print "Error in Pchse: Info =", Info
Exit Sub
End If
'-- Compute integral 1/(1 + x^2) dx [0, 4] (= atan(4))
S = Pchid(N, X(), Y(), D(), IA, IB, Info)
Debug.Print "S =", S, "S(true) =", Atn(4)
Debug.Print "Info =", Info
End Sub
Function Pchid(N As Long, X() As Double, F() As Double, D() As Double, IA As Long, IB As Long, Info As Long, Optional Skip As Boolean=False, Optional Idxfd As Long=0, Optional Incfd As Long=1) As Double 区分3次エルミート(または3次スプライン)補間関数の積分値 (積分区間の上下限がデータ点に一致する場合)
Sub Pchse(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次スプライン補間 ("not a knot"境界条件)
- 実行結果
S = 1.31070738095238 S(true) = 1.32581766366803
Info = 0
|