XLPack 7.0
XLPack 数値計算ライブラリ (Excel VBA) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ 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 はフルランクであること.

下記オプションが提供される:

  1. Trans = "N" かつ M >= N の場合: 優決定系の最小二乗解を求める. すなわち, 次の最小二乗問題を解く.
    || B - A*X || を最小化する.
  2. Trans = "N" かつ M < N の場合: 劣決定系 A * X = B の最小ノルム解を求める.
  3. Trans = "T" かつ M >= N の場合: 劣決定系 A^H * X = B の最小ノルム解を求める.
  4. Trans = "T" かつ M < N の場合: 優決定系の最小二乗解を求める. すなわち, 次の最小二乗問題を解く.
    || B - A^H*X || を最小化する.

いくつかの右辺ベクトル 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 Creal(B(0)), Cimag(B(0)), Creal(B(1)), Cimag(B(1))
Debug.Print Creal(B(2)), Cimag(B(2))
Call Zgecov(0, N, A(), Ci(), Info)
Debug.Print "Var ="
Debug.Print Creal(Ci(0)), Creal(Ci(1)), Creal(Ci(2))
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