|
本帖最后由 hubulwm 于 2014-7-6 22:42 编辑
线性代数中的的消元法解一般线性方程组的小代码,大用处,代码奉上,供您学习线性代数求解行列式、解线性方程组等使用:- Option Explicit
- '初等变换化矩阵为阶梯形矩阵(Echelon matrix)
- Sub Echelon_matrix()
- Dim UserRange As Range
- Dim RowMax As Long
- Dim ColMax As Long
- Dim i As Long, j As Long, t As Long, s As Long
- Dim temp
- Dim fg As Boolean
- Dim Arr()
- '提示选择区域
- On Error GoTo Canceled
- Set UserRange = Application.InputBox(Prompt:="请选择矩阵区域:", Title:="获取矩阵", Default:=Selection.Address, Type:=8)
- RowMax = UserRange.Rows.Count
- ColMax = UserRange.Columns.Count
- ReDim Arr(1 To RowMax, 1 To ColMax)
- For i = 1 To RowMax
- For j = 1 To ColMax
- If IsNumeric(UserRange.Cells(i, j)) = True Or UserRange.Cells(i, j) = "" Then
- Arr(i, j) = UserRange.Cells(i, j)
- Else
- UserRange.Cells(i, j).Activate
- MsgBox "这个单元格内不是数字!"
- Exit Sub
- End If
- Next j
- Next i
- '化获取的矩阵为阶梯形矩阵
- For i = 1 To RowMax - 1
- '第一步:对角搜寻
- If i <= ColMax Then
- If Arr(i, i) = 0 Then
- '第3种初等变换——互换矩阵中两行的位置
- fg = False
- For t = i + 1 To RowMax
- If Arr(t, i) <> 0 Then
- If i <= ColMax Then
- For s = i To ColMax
- temp = Arr(i, s)
- Arr(i, s) = Arr(t, s)
- Arr(t, s) = temp
- Next s
- fg = True
- End If
- End If
- If fg = True Then Exit For
- Next t
- End If
- '如果
- If Arr(i, i) <> 0 Then
- '第2种初等变换——把矩阵中的第i行的-arr(t,i)/arr(i,i)倍加到以后的每一行
- For t = i + 1 To RowMax
- If i < ColMax Then
- temp = Arr(t, i) / Arr(i, i)
- For s = i To ColMax
- Arr(t, s) = Arr(t, s) - temp * Arr(i, s)
- Next s
- End If
- Next t
- Else
- '第二步:如果已搜寻的一列都为0,则向右缩小范围搜寻
- '第2种初等变换——把矩阵中的第i行的-arr(t,i+1)/arr(i,i+1)倍加到以后的每一行
- If i < ColMax Then
- If Arr(i, i + 1) <> 0 Then
- For t = i + 1 To RowMax
- If i < ColMax Then
- temp = Arr(t, i + 1) / Arr(i, i + 1)
- For s = i + 1 To ColMax
- Arr(t, s) = Arr(t, s) - temp * Arr(i, s)
- Next s
- End If
- Next t
- End If
- End If
- End If
- End If
- Next i
- '提示选择方程组结果输出区域
- Set UserRange = Application.InputBox(Prompt:="请选择输出区域:", Title:="输出区域", Default:=Selection.Address, Type:=8)
- UserRange.Range("A1").Resize(RowMax, ColMax) = Arr
- '设置小数显示为分数
- For i = 1 To RowMax
- For j = 1 To ColMax
- If Int(Arr(i, j)) <> Arr(i, j) Then UserRange.Range("A1").Offset(i - 1, j - 1).NumberFormatLocal = "????/????"
- Next j
- Next i
- Canceled:
- End Sub
复制代码 |
|