本文介紹 MyMathLib 中的核心算法:基於高斯消元法的行列式計算、方程組求解、矩陣秩計算,以及向量組的極大線性無關組判定。
將增廣矩陣轉化為階梯形矩陣,通過行變換消去下三角元素。改進點:使用整數乘法避免浮點誤差,即對第 j 行執行 Row_j = Row_j * a_{j-1,i} - Row_{j-1} * a_{j,i},保持數值精度。
public static void EquationsElimination(decimal[,] CoefficientDeterminant) {
int rowCount = CoefficientDeterminant.GetLength(0);
int colCount = CoefficientDeterminant.GetLength(1);
int theE = colCount - 1; // 最後一列為常數項
for (int i = 0; i < theE; i++) {
for (int j = rowCount - 1; j > 0; j--) {
if (CoefficientDeterminant[j, i] == 0) continue;
// 檢查上一行左側是否全零,決定是否交換行
bool canSwap = true;
for (int s = i - 1; s >= 0; s--) {
if (CoefficientDeterminant[j-1, s] != 0) { canSwap = false; break; }
}
if (canSwap && CoefficientDeterminant[j-1, i] == 0) {
// 交換整行(含常數項)
for (int k = 0; k <= theE; k++) {
var tmp = CoefficientDeterminant[j, k];
CoefficientDeterminant[j, k] = CoefficientDeterminant[j-1, k];
CoefficientDeterminant[j-1, k] = tmp;
}
} else {
// 整數乘法消元
var rate1 = CoefficientDeterminant[j-1, i];
var rate2 = CoefficientDeterminant[j, i];
for (int k = 0; k <= theE; k++) {
CoefficientDeterminant[j, k] = CoefficientDeterminant[j, k] * rate1 - CoefficientDeterminant[j-1, k] * rate2;
}
}
}
}
}
利用消元法判斷向量線性相關:構造方程組,若係數矩陣秩等於增廣矩陣秩,則線性相關。依次檢查每個向量是否能由前面的極大線性無關組線性表出,若不能則加入極大組。
public static ListGetMaxLinearIndependentGroup(decimal[,] Vectors) { List result = new List (); for (int i = 0; i < Vectors.GetLength(0); i++) { var vec = GetRowVector(Vectors, i); if (!IsLinearCorrelation(vec, result)) { result.Add(vec); } } return result; }
完整代碼包含矩陣操作、向量判零、線性相關判定等輔助方法,採用 C# 實現,註釋詳細,適合學習參考。