|
|
◆ Zgetsls()
| Sub Zgetsls |
( |
Trans As |
String, |
|
|
M As |
Long, |
|
|
N As |
Long, |
|
|
A() As |
Complex, |
|
|
B() As |
Complex, |
|
|
Info As |
Long, |
|
|
Optional Nrhs As |
Long = 1 |
|
) |
| |
優決定または劣決定系連立一次方程式 Ax = b の解 (フルランク) (Tall skinny QR または Short wide LQ分解) (複素行列)
- 目的
- 本ルーチンは M x N 複素行列 A からなる優決定または劣決定系連立1次方程式を A の Tall skinny QR または Short wide LQ分解を用いて解く. A はフルランクであること.
下記オプションが提供される:
- Trans = "N" かつ M >= N の場合: 優決定系の最小二乗解を求める. すなわち, 次の最小二乗問題を解く.
- Trans = "N" かつ M < N の場合: 劣決定系 A * X = B の最小ノルム解を求める.
- Trans = "T" かつ M >= N の場合: 劣決定系 A^H * X = B の最小ノルム解を求める.
- Trans = "T" かつ M < N の場合: 優決定系の最小二乗解を求める. すなわち, 次の最小二乗問題を解く.
いくつかの右辺ベクトル b および解ベクトル x を1回の呼び出しで扱うことができる. これらのベクトルは, M x Nrhs 右辺行列 B および N x Nrhs 解行列 X の列として格納される.
- 引数
-
| [in] | Trans | = "N": 連立一次方程式は A からなる.
= "T": 連立一次方程式は A^H からなる. |
| [in] | M | 行列 A の行数. (M >= 0) (M = 0 の場合, 処理を行わずに戻る) |
| [in] | N | 行列 A の列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る) |
| [in,out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= M, LA2 >= N)
[in] M x N 行列 A.
[out] A() は Zgeqr または Zgelq が返す QR または LQ分解結果により上書きされる. |
| [in,out] | B() | 配列 B(LB1 - 1, LB2 - 1) (LB1 >= max(M, N), LB2 >= Nrhs) (2次元配列) または B(LB - 1) (LB >= max(M, N), Nrhs = 1) (1次元配列)
[in] 右辺ベクトルが列ごとに格納された行列 B. B は, M x Nrhs 行列(Trans = "N" の場合), または, N x Nrhs 行列(Trans = "T" の場合)である.
[out] Info = 0 の場合, B() は列ごとに格納された解ベクトルにより上書きされる:
Trans = "N" かつ M >= N: B() の行 0〜N-1 に最小二乗解ベクトルが入る.
Trans = "N" かつ M < N: B() の行 0〜N-1 に最小ノルム解ベクトルが入る.
Trans = "T" かつ M >= N: B() の行 0〜M-1 に最小ノルム解ベクトルが入る.
Trans = "T" かつ M < N: B() の行 0〜M-1 に最小二乗解ベクトルが入る. |
| [out] | Info | = 0: 正常終了
= -1: パラメータ Trans の誤り (Trans != "T" および "N")
= -2: パラメータ M の誤り (M < 0)
= -3: パラメータ N の誤り (N < 0)
= -4: パラメータ A() の誤り.
= -5: パラメータ B() の誤り.
= -7: パラメータ Nrhs の誤り. (Nrhs < 0)
= i > 0: A の分解結果の三角行列の i 番目の対角要素が 0 になった. 従って, A はフルランクではない. 最小二乗解は求めることができなかった. |
| [in] | Nrhs | (省略可)
右辺の数, すなわち, 行列 B および X の列数. (Nrhs >= 0) (Nrhs = 0 の場合, 処理を行わずに戻る) (省略時 = 1) |
- 出典
- LAPACK
- 使用例
- 優決定系連立1次方程式 Ax = B の最小二乗解を求める. また, 分散を求める. ただし,
( -0.82+0.83i 0.18-0.94i -0.18-0.12i )
A = ( -0.76-0.24i 0.57-0.16i -0.08-0.27i )
( 1.90+0.26i -0.98+0.54i 0.21+0.28i )
( 0.50-0.30i -0.31+0.37i 0.22+0.19i )
( 1.7126-0.6648i )
B = ( 0.8697+0.7604i )
( -2.1048-1.6171i )
( -0.9297+0.1252i )
とする. Sub Ex_Zgetsls()
Const M = 4, N = 3
Dim A(M - 1, N - 1) As Complex, B(M - 1) As Complex, Ci(N - 1) As Complex
Dim Info As Long
A(0, 0) = Cmplx(-0.82, 0.83): A(0, 1) = Cmplx(0.18, -0.94): A(0, 2) = Cmplx(-0.18, -0.12)
A(1, 0) = Cmplx(-0.76, -0.24): A(1, 1) = Cmplx(0.57, -0.16): A(1, 2) = Cmplx(-0.08, -0.27)
A(2, 0) = Cmplx(1.9, 0.26): A(2, 1) = Cmplx(-0.98, 0.54): A(2, 2) = Cmplx(0.21, 0.28)
A(3, 0) = Cmplx(0.5, -0.3): A(3, 1) = Cmplx(-0.31, 0.37): A(3, 2) = Cmplx(0.22, 0.19)
B(0) = Cmplx(1.7126, -0.6648): B(1) = Cmplx(0.8697, 0.7604)
B(2) = Cmplx(-2.1048, -1.6171): B(3) = Cmplx(-0.9297, 0.1252)
Call Zgetsls("N", M, N, A(), B(), Info)
If Info <> 0 Then
Debug.Print "Error in Zgels: Info =", Info
Exit Sub
End If
Debug.Print "X ="
Debug.Print "Var ="
Debug.Print "Info =", Info
End Sub
Function Cmplx(R As Double, Optional I As Double=0) As Complex 複素数の作成
Function Cimag(A As Complex) As Double 複素数の虚数部
Function Creal(A As Complex) As Double 複素数の実数部
Function Ci(X As Double, Optional Info As Long) As Double 余弦積分 Ci(x)
Sub Zgecov(Job As Long, N As Long, A() As Complex, Ci() As Complex, Info As Long) 線形最小二乗問題の分散・共分散行列 (Zgels用)
Sub Zgels(Trans As String, M As Long, N As Long, A() As Complex, B() As Complex, Info As Long, Optional Nrhs As Long=1) 優決定または劣決定系連立一次方程式 Ax = b の解 (フルランク) (複素行列)
Sub Zgetsls(Trans As String, M As Long, N As Long, A() As Complex, B() As Complex, Info As Long, Optional Nrhs As Long=1) 優決定または劣決定系連立一次方程式 Ax = b の解 (フルランク) (Tall skinny QR または Short wide LQ分解) (複素行列)
- 実行結果
X =
-0.820000000000001 -0.940000000000001 0.74 0.199999999999997
0.479999999999997 0.21
Var =
5.46169501938982 15.1880504061464 21.4241290120714
Info = 0
|