ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュの誰か助けてください。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
逆行列を作るソースを作ったつもりが1列目しか出来ません。
初心者なので迷走中です。
至急助けてください。



Sub gyaku()
Dim n As Integer
Dim a() As Double, d() As Double
Dim i As Integer, j As Integer, k As Integer, l As Integer
Dim ip As Integer
Dim p As Double, r As Double

With Worksheets("Sheet1")
n = .Cells(2, 3)
End With
ReDim d(n, n) As Double

With Worksheets("Sheet2")
For i = 1 To n
For l = 1 To n
If i = l Then
d(i, l) = 1
.Cells(i, 2 * n + j) = d(i, l)
Else
d(i, l) = 0
.Cells(i, 2 * n + j) = d(i, l)
End If
Next l
Next i
End With

ReDim a(n, n) As Double
ReDim d(n, n) As Double

MsgBox "計算開始。行列サイズは" & n & "だす。"

With Worksheets("Sheet2")
For i = 1 To n
For j = 1 To n
a(i, j) = .Cells(i, j).Value
Next j
Next i
End With

With Worksheets("Sheet2")
For i = 1 To n
For l = 1 To n
d(i, l) = .Cells(i, 2 * n + l).Value
Next l
Next i
End With


For l = 1 To n
For k = 1 To n
p = 0
ip = 0
For i = k To n
If p < Abs(a(i, k)) Then
p = Abs(a(i, k))
ip = i
Exit For
End If
Next i
If ip = 0 Then
MsgBox "行列が得意である(PIVOT=0)", vbCritical
Exit For
End If

If ip > k Then
For j = k To n
swap a(k, j), a(ip, j)
Next j
swap d(k, l), d(ip, l)
End If

r = a(k, k)
For j = k To n
a(k, j) = a(k, j) / r
Next j
d(k, l) = d(k, l) / r

For i = 1 To n
If i <> k Then
r = a(i, k)
For j = k To n
a(i, j) = a(i, j) - r * a(k, j)
Next j
d(i, l) = d(i, l) - r * d(k, l)
End If
Next i
Next k
Next l
With Worksheets("Sheet2")
For i = 1 To n
For l = 1 To n
.Cells(i, n + l) = d(i, l)
Next l
Next i
End With

MsgBox "計算終了。結果はシート2だす。"
End Sub

Sub swap(ByRef a As Double, ByRef d As Double)
Dim c
c = a
a = d
d = c
End Sub

コメント(8)

一口ヒント。

2番目のWith Worksheets("Sheet2") ブロックの中に
本来の意図とは違うであろう変数が入っています。
本来ループが回る度に増える物が初期値のままですよ。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=32646;id=excel
こちらに参考となるプログラム(C)のリンクを貼り付けておいたので、一度見て下さい。
普通に関数つかうのはダメなんですか?
リンク先の方は「宿題見たいなもの」とおっしゃってましたが、
自分がやらなきゃならない宿題か、
生徒に出す宿題を作ってみたけどうまく動いていないのか、
少し気になっています。
私は数学的なことは得意ではないですが、わからないからといって丸投げはよくはありませんよ。
1 変数の名前の付け方

2 処理ごとのコメント追加

3 ブレイクポイントの使用

以上の点をまず自分でやってみてください。
ちなみに行列が1行しか作成されないのは、上記のヒントで解決します。
気になるのは、シート2に、元の行列と逆行列、そして一番左端にもう一個行列があるはずなんですが、こいつは一体どこから???
ソース見てると左から「謎の行列」-「元の行列」-「逆行列」といった具合で表示されるのを狙ってらっしゃるみたいですけども。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。