前回の解答を今後の講義で使うのでブログ本文に書いておきます。
先月載せたものと基本的に同じですが、引数の引き渡しだけが違っています。
Sub 前回の課題()
Dim x()
Sheets(1).Select
i = 1
Do While Cells(i, 1) <> ""
i = i + 1
Loop
p = i - 1
ReDim x(p, p + 1)
For i = 1 To p
For j = 1 To p
x(i, j) = Cells(i, j)
Next j
Next i
Sheets(2).Select
For i = 1 To p
x(i, p + 1) = Cells(i, 1)
Next i
Sheets(3).Select
場所 = 0
For i = 1 To p
For j = 1 To p
Cells(場所 + i, j) = x(i, j)
Next j
Next i
Call 連立一次方程式(x(), p)
場所 = 場所 + p + 1
For i = 1 To p
For j = 1 To p + 1
Cells(場所 + i, j) = x(i, j)
Next j
Next i
End Sub
Sub 連立一次方程式(係数行列(), r)
Rem (c) 2014 Kaoru Fueda
Dim 最大値()
ReDim 最大値(r)
For i = 1 To r
If i < r Then
最大比 = 0
最大行 = i
For j = i To r
最大値(j) = 0
For k = i To r + 1
If Abs(係数行列(j, k)) > 最大値(j) Then
最大値(j) = Abs(係数行列(j, k))
End If
Next k
If 最大値(j) > 0 Then
If 最大比 < Abs(係数行列(j, i) / 最大値(j)) Then
最大比 = Abs(係数行列(j, i) / 最大値(j))
最大行 = j
End If
End If
Next j
If 最大行 > i Then
For k = 1 To r + 1
temp = 係数行列(i, k)
係数行列(i, k) = 係数行列(最大行, k)
係数行列(最大行, k) = temp
Next k
End If
Rem ここは講義では説明していません。
Rem ピボットが0の場合は最も0=0に近い行を第i行に移動して、後に無視する
If 最大比 = 0 Then
最小値 = 最大値(i)
最小行 = i
For j = i + 1 To r
If 最小値 > 最大値(j) Then
最小値 = 最大値(j)
最小行 = j
End If
Next j
If 最小行 > i Then
For k = 1 To r + 1
temp = 係数行列(i, k)
係数行列(i, k) = 係数行列(最小行, k)
係数行列(最小行, k) = temp
Next k
End If
End If
End If
Rem ピボットを1に
If 係数行列(i, i) <> 0 Then
For k = i + 1 To r + 1
係数行列(i, k) = 係数行列(i, k) / 係数行列(i, i)
Next k
Else
Rem ここは講義では説明していません。
MsgBox ("解けないので解の一つを0とします。")
For k = i + 1 To r + 1
係数行列(i, k) = 0
Next k
End If
係数行列(i, i) = 1
Rem ピボット以外を0に
For j = 1 To r
If j <> i Then
For k = i + 1 To r + 1
係数行列(j, k) = 係数行列(j, k) - 係数行列(i, k) * 係数行列(j, i)
Next k
係数行列(j, i) = 0
End If
Next j
Next i
End Sub
今日使うデータです。
|
0 件のコメント:
コメントを投稿