|
|
◆ 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 の解 (フルランク) (複素行列)
- 目的
- 本ルーチンはM×N複素行列Aあるいはその共役転置からなる優決定または劣決定系連立1次方程式をAのQRあるいは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×Nrhs右辺行列BおよびN×Nrhs解行列Xの列として格納される.
- 引数
-
| [in] | Trans | = "N": 連立一次方程式はAからなる.
= "T": 連立一次方程式はA^Hからなる. |
| [in] | M | 行列 A の行数. (M >= 0) (M = 0 の場合, B()にゼロベクトルを返す) |
| [in] | N | 行列 A の列数. (N >= 0) (N = 0 の場合, B()にゼロベクトルを返す) |
| [in,out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= M, LA2 >= N)
[in] M×N行列 A.
[out] M >= N: A()はZgeqrfが返すQR分解結果により上書きされる.
M < N: A()はZgelqfが返す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×Nrhs行列(Trans = "N"の場合), または, N×Nrhs行列(Trans = "T"の場合)である.
[out] Info = 0の場合、B()は列ごとに格納された解ベクトルにより上書きされる:
Trans = "N"かつM >= N: B()の行0〜N-1に最小二乗解ベクトルが入る. 各列の解の残差二乗和はその列の行N〜M-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に最小二乗解ベクトルが入る. 各列の解の残差二乗和はその列の行M〜N-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_Zgels()
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 Zgels("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 の解 (フルランク) (複素行列)
- 実行結果
X =
-0.819999999999999 -0.939999999999999 0.740000000000001 0.200000000000002
0.480000000000002 0.21
Var =
5.46169501938982 15.1880504061464 21.4241290120714
Info = 0
|