9.スケーリング/ピボッティング
12.連立方程式の解法(反復法)
LU分解 | ||
---|---|---|
FuncMatLUCrout(mat1, Optional pivFlag, Optional plim, Optional rlim, Optional outFlag) | LU分解:クラウト法 | |
FuncMatLUGE(mat1, Optional pivFlag, Optional plim, Optional rlim, Optional outFlag) | LU分解:ガウス消去法 | |
FuncMatCholesky(mat1, Optional rlim) | LU分解:修正コレスキー分解 | |
FuncMatIcCholesky(mat1, Optional slim) | LU分解:不完全コレスキー分解 |
戻り値 |
ジャグ配列または二次配列で結果を出力。 二次配列の場合、上から下三角行列L、上三角行列U、行前処理行列Pr、列前処理行列Pc。 ジャグ配列の場合、(0)(行,列)=下三角行列、(1)(行,列)=上三角行列、(2)(行,列)=行前処理行列、(3)(行,列)=列前処理行列 |
---|---|
mat1 |
LU分解対象行列(行,列)。 正方行列以外にも対応しています。 |
pivFlag |
前処理フラグ(省略可)。 0=部分行ピボット、1=行ピボット、2=行スケーリング+ピボット、3=完全ピボット、4=スケーリング+完全ピボット |
plim | ピボット処理閾値(省略可)。デフォルト値=2e-12。 |
rlim | 数値丸め閾値(省略可)。デフォルト値=2e-12。 |
aryFlag |
前処理行列の出力方法。 0=ジャグ配列 + 変換行列連立方程式用(デフォルト)。 1=ジャグ配列 + 変換行列分解確認用。 2=1つの配列にまとめて出力 + 変換行列連立方程式用。 3=1つの配列にまとめて出力 + 変換行列分解確認用。 |
Sub test2() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’クラウト法によるLU分解 tmp = FuncMatLUCrout(matA, 1, , , 3) ’結果出力(ジャグ配列) cntR1 = 3 cntC1 = 11 For cnt1 = 0 To UBound(tmp) cntR2 = cntR1 + UBound(tmp(cnt1), 1) cntC2 = cntC1 + UBound(tmp(cnt1), 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp(cnt1) cntR1 = cntR2 + 2 Next cnt1 End Sub
Sub test3() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’クラウト法によるLU分解 tmp = FuncMatLUCrout(matA, 1, , , 3) ’結果出力(二次配列) cntR1 = 3 cntC1 = 11 cntR2 = cntR1 + UBound(tmp, 1) cntC2 = cntC1 + UBound(tmp, 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp End Sub
戻り値 |
ジャグ配列または二次配列で結果を出力。 二次配列の場合、上から下三角行列L、上三角行列U、行前処理行列Pr、列前処理行列Pc。 ジャグ配列の場合、(0)(行,列)=下三角行列、(1)(行,列)=上三角行列、(2)(行,列)=行前処理行列、(3)(行,列)=列前処理行列 |
---|---|
mat1 |
LU分解対象行列(行,列)。 正方行列以外にも対応しています。 |
pivFlag |
前処理フラグ(省略可)。 0=部分行ピボット、1=行ピボット、2=行スケーリング+ピボット、3=完全ピボット、4=スケーリング+完全ピボット |
plim | ピボット処理閾値(省略可)。デフォルト値=2e-12。 |
rlim | 数値丸め閾値(省略可)。デフォルト値=2e-12。 |
aryFlag |
前処理行列の出力方法。 0=ジャグ配列 + 変換行列連立方程式用(デフォルト)。 1=ジャグ配列 + 変換行列分解確認用。 2=1つの配列にまとめて出力 + 変換行列連立方程式用。 3=1つの配列にまとめて出力 + 変換行列分解確認用。 |
Sub test2() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’ガウス消去法によるLU分解 tmp = FuncMatLUGE(matA, 1, , , 1) ’結果出力(ジャグ配列) cntR1 = 3 cntC1 = 11 For cnt1 = 0 To UBound(tmp) cntR2 = cntR1 + UBound(tmp(cnt1), 1) cntC2 = cntC1 + UBound(tmp(cnt1), 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp(cnt1) cntR1 = cntR2 + 2 Next cnt1 End Sub
Sub test3() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’ガウス消去法によるLU分解 tmp = FuncMatLUGE(matA, 1, , , 3) ’結果出力(二次配列) cntR1 = 3 cntC1 = 11 cntR2 = cntR1 + UBound(tmp, 1) cntC2 = cntC1 + UBound(tmp, 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp End Sub
戻り値 |
ジャグ配列または二次配列で結果を出力。 二次配列の場合、上からユニタリ行列Q、上三角行列R。 ジャグ配列の場合、(0)(行,列)=ユニタリ行列Q、(1)(行,列)=上三角行列R。 |
---|---|
mat1 | QR分解対象行列(二次配列)。 |
aryFlag |
前処理行列の出力方法。 0=ジャグ配列。 2=1つの配列にまとめて出力。 |
Sub test2() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’グラムシュミット法によるQR分解 tmp = FuncMatQRGS(matA, 0) ’結果出力(ジャグ配列) cntR1 = 3 cntC1 = 7 For cnt1 = 0 To UBound(tmp) cntR2 = cntR1 + UBound(tmp(cnt1), 1) cntC2 = cntC1 + UBound(tmp(cnt1), 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp(cnt1) cntR1 = cntR2 + 2 Next cnt1 End Sub
Sub test3() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’グラムシュミット法によるQR分解 tmp = FuncMatQRGS(matA, 2) ’結果出力(二次配列) cntR1 = 3 cntC1 = 7 cntR2 = cntR1 + UBound(tmp, 1) cntC2 = cntC1 + UBound(tmp, 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp End Sub
戻り値 |
ジャグ配列または二次配列で結果を出力。 二次配列の場合、上からユニタリ行列Q、上三角行列R、列前処理行列Pc。 ジャグ配列の場合、(0)(行,列)=ユニタリ行列Q、(1)(行,列)=上三角行列R、(2)(行,列)=列前処理行列Pc。 |
---|---|
mat1 |
QR分解対象行列(二次配列)。 行数≧列数を満たせば、正方行列でなくても構いません。 |
pivFlag |
前処理フラグ(省略可)。 0=部分列ピボット、1=列スケーリング+ピボット |
plim | ピボット処理閾値(省略可)。デフォルト値=2e-12。 |
rlim | 数値丸め閾値(省略可)。デフォルト値=2e-12。 |
aryFlag |
前処理行列の出力方法。 0=ジャグ配列 + 変換行列連立方程式用(デフォルト)。 1=ジャグ配列 + 変換行列分解確認用。 2=1つの配列にまとめて出力 + 変換行列連立方程式用。 3=1つの配列にまとめて出力 + 変換行列分解確認用。 |
Sub test2() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’ハウスホルダー法によるQR分解 tmp = FuncMatQRHH(matA, , , , 1) ’結果出力(ジャグ配列) cntR1 = 3 cntC1 = 7 For cnt1 = 0 To UBound(tmp) cntR2 = cntR1 + UBound(tmp(cnt1), 1) cntC2 = cntC1 + UBound(tmp(cnt1), 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp(cnt1) cntR1 = cntR2 + 2 Next cnt1 End Sub
Sub test3() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’ハウスホルダー法によるQR分解 tmp = FuncMatQRHH(matA, , , , 3) ’結果出力(二次配列) cntR1 = 3 cntC1 = 7 cntR2 = cntR1 + UBound(tmp, 1) cntC2 = cntC1 + UBound(tmp, 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp End Sub