2. 連立一次方程式
注 – 例題ワークシートをダウンロードすることができます. 1. 例題ワークシートの入手と使用方法 をご覧ください.
連立一次方程式の XLPack による解き方の例を説明します.
例題
次の連立一次方程式を解く.
10x1 - 7x2 = 7 -3x1 + 2x2 + 6x3 = 4 5x1 - x2 + 5x3 = 6
これは, 行列で表すと次のようになります.
Ax = b
ただし,
( 10 -7 0 ) ( 7 ) ( x1 ) A = ( -3 2 6 ), b = ( 4 ), x = ( x2 ) ( 5 -1 5 ) ( 6 ) ( x3 )
ここで, A は係数行列, b は右辺ベクトル, x は解ベクトルです.
ここでは, ワークシート関数 WDgesv を使う方法と VBA サブルーチン Dgesv を使う方法の2種類の解き方について説明します.
ワークシート関数を使用した解き方
まず, ワークシートの適当な場所に係数行列 A と右辺ベクトル b のデータを入力します(オレンジ色のセル). そして, 解ベクトルを入れる場所として(解の要素数 + 2)個のセルを選択してワークシート関数 WDgesv を入力します(緑色のセル).
WDgesv の必要なパラメータは N, A, B, Nrhs です. N は要素数(この例では 3), A は係数行列 A のセル範囲, B は右辺ベクトル b のセル範囲です. 右辺ベクトルは通常は 1 本ですが, 複数本入力することもでき, Nrhs にはその本数を入力します. Nrhs は入力を省略することができ, その場合は 1 とみなされます.
入力が終了したら Ctrl + Shift + Enter を押します.
これで, 解 X = (0 -1 1)T が求められました. なお, 表示されている 0.078283 は条件数の推定値の逆数, 一番下の 0 はリターンコード(正常終了を示す)です.
VBA プログラムを使用した解き方
上と同じ例を VBA プログラムにより解いてみます. VBA サブルーチン Dgesv を使った VBA プログラム例を以下に示します.
Sub Start()
Const NMax = 10
Dim N As Long, A(NMax, NMax) As Double, B(NMax) As Double
Dim Anorm As Double, RCond As Double
Dim Ipiv(NMax) As Long, Info As Long, I As Long, J As Long
'--- Input data
N = 3
For I = 0 To N - 1
For J = 0 To N - 1
A(I, J) = Cells(5 + I, 1 + J)
Next
B(I) = Cells(5 + I, 4)
Next
'--- Solve equation and compute condition number
Anorm = Dlange("1", N, N, A())
Call Dgesv(N, A(), Ipiv(), B(), Info)
If Info = 0 Then
Call Dgecon("1", N, A(), Anorm, RCond, Info)
End If
'--- Output solution
For I = 0 To N - 1
Cells(5 + I, 5) = B(I)
Next
Cells(8, 5) = RCond
Cells(9, 5) = Info
End Sub
プログラム中, Dlange と Dgecon は条件数を求めるためのもので方程式を解くだけならば不要です.
所定の位置(下のオレンジ色のセル)に係数行列 A と右辺ベクトル b の値を入力し, マクロ Start としてプログラムを実行すると次の結果が得られます. ワークシート関数を使用したときと異なり, 係数行列 A と右辺ベクトル b の値を入力しただけでは結果が得られず, VBA プログラムを実行してやる必要があります.
係数行列が対称な場合
係数行列 A が対称行列の場合には WDposv と Dposv を使うことができます. 手順は上と同様ですが, A のデータは上または下三角部分(対角要素を含む)だけ設定すればよくなります. 残りの部分は参照されません.