2014-01-09

行列の計算

明けましておめでとうございます。
冬休みの間にgmailの仕様が変更されたので、ログインした時に次のような画面が表示されると思います。

ここに書かれているように、メールの中に画像を表示するときの安全性が向上したということですので、OKを押してください。

前回の解答

Sub 数えて足す()
Dim x() '配列xは、個数を指定せずにおきます。
j = 1
Do While Cells(j + 1, 2) <> ""
  j = j + 1
Loop
人数 = j - 1
'人数を数えたので配列を用意して身長のデータを読み込みます。
ReDim x(人数)
For j = 1 To 人数
  x(j) = Cells(j + 1, 2)
Next j
'全てのデータを足します。
wa = 0
For j = 1 To 人数
  wa = wa + x(j)
Next j
'合計と、人数で割った平均をシートに書き込みます。
Cells(人数 + 3, 1) = "合計"
Cells(人数 + 3, 2) = wa
身長の平均 = wa / 人数
Cells(人数 + 4, 1) = "平均"
Cells(人数 + 4, 2) = 身長の平均
End Sub

行列の計算

Excelには行列の掛け算をしたり、逆行列を求める機能があります。
マクロを使って行列の演算をしてみましょう。

行列の準備

次のように行列を入力してください。

エクセルのワークシートのどの部分が行列なのかを指定します。

Sub 行列()
Dim A As Range
Set A = Range(Cells(1, 1), Cells(2, 2))

最初に、Aはワークシートの範囲を指定するものだと宣言して
次にCells(1, 1)からCells(2, 2)までの長方形が行列Aの範囲だと指定します。

演算してみましょう。
行列一つだけで計算できる例として、転置と、行列式を求めてみます。

Dim B As Range
Set B = Range(Cells(4, 1), Cells(5, 2))
B = Application.Transpose(A)

これで、行列Bの場所であるCells(4, 1)からCells(5, 2)までの長方形に行列Aの転置が出力されます。

Cells(7, 1) = Application.MDeterm(A)

これで、行列Aの行列式がCells(7, 1)に出力されます。

行列の掛け算

今度は二つの行列を掛け算した行列を求めましょう。
エクセルのシート1とシート2の両方に先ほどの行列を書いてください。

Sub 掛け算()
Dim A As Range, B As Range, C As Range
Set A = Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2))
Set B = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2))
Set C = Range(Sheets(3).Cells(1, 1), Sheets(3).Cells(2, 2))
C = Application.MMult(A, B)
End Sub

これでシート3の行列Cに、行列の積ABが出力されます。
必ず「標準モジュール」にマクロを書いてください。

連立一次方程式

を解いてみましょう。
と置くと、連立一次方程式は
Ax=b
と書けます。
この式に左からAの逆行列を掛けて
x=A-1b
ですから、エクセルを使って計算するのは
Aの逆行列A-1
A-1とbの行列の積
です。
シート1のCells(1, 1)からこの連立一次方程式の係数行列と定数項を並べて

このように代入します。
この中のCells(1, 1)からCells(2, 2)までの長方形を行列A
Cells(1, 3)からCells(2, 3)までの長方形を行列B
シート2のCells(1, 1)からCells(2, 2)までの長方形にAの逆行列を代入するのでここを行列C
シート3のCells(1, 1)からCells(2, 1)までの長方形に、答えの行列行列を代入するのでここを行列D
とします。

Sub renritsu()
Dim A As Range, B As Range, C As Range, D As Range
Set A = Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2))
Set B = Range(Sheets(1).Cells(1, 3), Sheets(1).Cells(2, 3))
Set C = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2))
Set D = Range(Sheets(3).Cells(1, 1), Sheets(3).Cells(2, 1))
C = Application.MInverse(A)
D = Application.MMult(C, B)
End Sub

解けない場合の処理

は解くことが出来ません。
このような場合に対処するために、逆行列を求める前に行列式を計算して、行列式が0ではない場合だけ連立一次方程式を解くようにしましょう。
場合分けにはIf文を使います。

If 条件 Then
'ここに条件が成立した時に実行する文を書く
Else
'ここに条件が成立しなかった時に実行する文を書く
End If

このように書きます。
条件が成立しなかった時は何も実行しないなら

If 条件 Then
'ここに条件が成立した時に実行する文を書く
End If

練習

ここまでに説明したことを使って、解ける方程式は解く、解けない方程式は「解けません」と表示するマクロを書いてください。
解けないと表示するためには
msgbox("解けません")
と書きます。

出来た人は次の方程式を解いてください。

0 件のコメント: