|
|
◆ Ppqad()
| Sub Ppqad |
( |
C() As |
Double, |
|
|
Xi() As |
Double, |
|
|
Lxi As |
Long, |
|
|
K As |
Long, |
|
|
X1 As |
Double, |
|
|
X2 As |
Double, |
|
|
Pquad As |
Double, |
|
|
Info As |
Long |
|
) |
| |
B-スプラインの積分値 (PP(区分多項式)形式)
- 目的
- 本ルーチンは区分多項式(PP)形式(C(), Xi(), Lxi, K)のK次B-スプラインの, 区間[x1, x2]における積分を求める. j番目の区間の左端点Xi(j-1)のまわりのテイラー展開を積分することにより, 区間内に含まれる区切り点より構成される部分区間[X1, X2]の積分を求める. 区間[Xi(0), Xi(Lxi)]外の積分も可能である.
- 引数
-
| [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] | X1 | 積分区間の下限値. (通常は Xi(0) <= X1 <= Xi(Lxi)) |
| [in] | X2 | 積分区間の上限値. (通常は Xi(0) <= X2 <= Xi(Lxi)) |
| [out] | Pquad | B-スプラインの区間[X1, X2]における積分値. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ C() の誤り.
= -2: パラメータ Xi() の誤り.
= -3: パラメータ Lxi の誤り. (Lxi < 1)
= -4: パラメータ K の誤り. (K < 1) |
- 出典
- SLATEC
- 使用例
- 次の数表を用いて 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_Ppqad()
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 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))
Call Ppqad(C(), Xi(), Lxi, K, A, B, S, Info)
Debug.Print "S =", S, "S(true) =", Atn(4)
Debug.Print "Info =", Info
End Sub
Sub Ppqad(C() As Double, Xi() As Double, Lxi As Long, K As Long, X1 As Double, X2 As Double, Pquad 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
|