2016-06-06

call文

これまでの連立一次方程式の解法をまとめ、Subプログラムとして独立させました。

Sub 連立一次方程式(係数行列(), r)
Rem (c) 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 件のコメント: