|
|
◆ Pfqad()
| Sub Pfqad |
( |
F As |
LongPtr, |
|
|
C() As |
Double, |
|
|
Xi() As |
Double, |
|
|
Lxi As |
Long, |
|
|
K As |
Long, |
|
|
Id As |
Long, |
|
|
X1 As |
Double, |
|
|
X2 As |
Double, |
|
|
Tol As |
Double, |
|
|
Quad As |
Double, |
|
|
Info As |
Long |
|
) |
| |
任意関数×B-スプラインの積分値 (PP(区分多項式)形式)
- 目的
- 本ルーチンは任意の関数f(x)とPP(区分多項式)形式(C(), Xi(), Lxi, K)のK次B-スプラインのId次微分値の積の区間[X1, X2]における積分を求める. [X1, X2]は通常は[Xi(0), Xi(Lxi)]の部分区間である.
8点ガウス公式を使用した適応求積ルーチンにより, 区間内に含まれる区切り点により構成される部分区間[X1, X2]の積分を求める. fが定義されていれば区間[Xi(0), Xi(Lxi)]外の積分も可能である.
- 引数
-
| [in] | F | 被積分関数 f(x) を求めるユーザーサブルーチンで, 次のように定義すること. Function F(X As Double) As Double
F = f(X)の値
End Function
Xを変更してはならない. |
| [in] | C() | 配列 C(LC1 - 1, LC2 - 1) (LC1 >= K, LC2 >= Lxi)
区分多項式の区切り点における右微分係数. |
| [in] | Xi() | 配列 Xi(LXi - 1) (LXi >= Lxi + 1)
区分多項式の区切り点. |
| [in] | Lxi | 区分多項式の小区間数. |
| [in] | K | B-スプラインの次数. (K >= 1) |
| [in] | Id | スプラインの微分係数の次数. (0 <= Id <= K - 1)
Id = 0の場合, 関数値となる. |
| [in] | X1 | 積分区間の下限値. (通常は Xi(0) <= X1 <= Xi(Lxi)) |
| [in] | X2 | 積分区間の上限値. (通常は Xi(0) <= X2 <= Xi(Lxi)) |
| [in] | Tol | 積分の要求精度. (Eps < Tol <= 0.1) (ただし, Epsは単位丸め誤差(= D1mach(4))である) |
| [out] | Quad | f(X)*(K次B-スプラインのId次微分係数) の区間[X1, X2]における積分値. |
| [out] | Info | = 0: 正常終了.
= -2: パラメータ C() の誤り.
= -3: パラメータ Xi() の誤り.
= -4: パラメータ Lxi の誤り. (Lxi < 1)
= -5: パラメータ K の誤り. (K < 1)
= -6: パラメータ Id の誤り. (Id < 0 or Id >= K)
= -9: パラメータ Tol の誤り. (Tol < Eps or Tol > 0.1)
= 1: 区間(X1, X2)におけるいくつかの積分値が要求精度を満たさなかった. |
- 出典
- SLATEC
- 使用例
- 次の数表を用いて S = ∫ 1/(1 + x^2) dx [0, 4] (= atan(4)) を求める. (f(X) = 1)
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
----- -------------
Function Pf(X As Double) As Double
Pf = 1
End Function
Sub Ex_Pfqad()
Const Ndata = 7, A = 0, B = 4
Dim X(Ndata - 1) As Double, Y(Ndata - 1) As Double, D(Ndata - 1) As Double
Dim Ibcl As Long, Ibcr As Long, Fbcl As Double, Fbcr As Double, Kntopt As Long
Dim T(Ndata + 5) As Double, Bcoef(Ndata + 1) As Double, N As Long, K As Long
Dim Lxi As Long, C(3, Ndata - 2) As Double, Xi(Ndata - 1) As Double
Dim Id As Long, Tol As Double, Info As Long, S As Double
'-- 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
'-- B-spline interpolation
Ibcl = 2: Fbcl = 0: Ibcr = 2: Fbcr = 0 '-- Natural spline
Kntopt = 1
Call Bint4(X(), Y(), Ndata, Ibcl, Ibcr, Fbcl, Fbcr, Kntopt, T(), Bcoef(), N, K, Info)
If Info <> 0 Then
Debug.Print "Error in Bint4: Info =", Info
Exit Sub
End If
'-- Convert to PP form
Call Bsplpp(T(), Bcoef(), N, K, C(), Xi(), Lxi, Info)
If Info <> 0 Then
Debug.Print "Error in Bsplpp: Info =", Info
Exit Sub
End If
'-- Compute integral 1/(1 + x^2) dx [0, 4] (= atan(4))
Id = 0: Tol = 0.0000000001 '1.0e-10
Call Pfqad(AddressOf Pf, C(), Xi(), Lxi, K, Id, A, B, Tol, S, Info)
Debug.Print "S =", S, "S(true) =", Atn(4)
Debug.Print "Info =", Info
End Sub
Sub Pfqad(F As LongPtr, C() As Double, Xi() As Double, Lxi As Long, K As Long, Id As Long, X1 As Double, X2 As Double, Tol As Double, Quad As Double, Info As Long) 任意関数×B-スプラインの積分値 (PP(区分多項式)形式)
Sub Bint4(X() As Double, Y() As Double, Ndata As Long, Ibcl As Long, Ibcr As Long, Fbcl As Double, Fbcr As Double, Kntopt As Long, T() As Double, Bcoef() As Double, N As Long, K As Long, Info As Long) 3次B-スプライン補間
Sub Bsplpp(T() As Double, A() As Double, N As Long, K As Long, C() As Double, Xi() As Double, Lxi As Long, Info As Long) B-形式のB-スプラインからPP(区分多項式)形式への変換
- 実行結果
S = 1.32679961538462 S(true) = 1.32581766366803
Info = 0
|