已知方程組:
`x + y = 5`
`x - y = 1`
求 `x, y` 值。編程實現求解。
兩式相加:`2x = 6` → `x = 3`
代入第一式:`3 + y = 5` → `y = 2`
#include <stdio.h>
int main() {
// 方程組: a1*x + b1*y = c1; a2*x + b2*y = c2
double a1=1, b1=1, c1=5;
double a2=1, b2=-1, c2=1;
double det = a1*b2 - a2*b1; // 行列式
if (det == 0) {
printf("無唯一解\n");
return 0;
}
double x = (c1*b2 - c2*b1) / det; // 克拉默法則
double y = (a1*c2 - a2*c1) / det;
printf("x = %.2f, y = %.2f\n", x, y); // x=3.00, y=2.00
return 0;
}
void gaussian_elimination(double a[][3], int n) { // 增廣矩陣 n x (n+1)
for (int col = 0; col < n; ++col) {
// 1. 選主元 (部分樞軸)
int pivot = col;
for (int row = col+1; row < n; ++row)
if (fabs(a[row][col]) > fabs(a[pivot][col])) pivot = row;
if (fabs(a[pivot][col]) < 1e-9) continue; // 奇異
if (pivot != col) for (int j=col; j<=n; ++j) swap(a[pivot][j], a[col][j]);
// 2. 歸一化當前行
double div = a[col][col];
for (int j=col; j<=n; ++j) a[col][j] /= div;
// 3. 消去其他行
for (int row=0; row
// 僅適用於小範圍整數解
for (int x = -100; x <= 100; ++x) {
for (int y = -100; y <= 100; ++y) {
if (x + y == 5 && x - y == 1) {
printf("x=%d, y=%d\n", x, y);
return 0;
}
}
}
| 方法 | 時間複雜度 | 適用場景 | 精度 |
|---|---|---|---|
| 解析公式 (克拉默) | O(1) | 2-3 元線性方程組、固定係數 | 浮點數誤差 |
| 高斯消元 | O(n³) | 通用 n 元線性方程組、矩陣求逆 | 可控 (選主元) |
| 暴力枚舉 | O(range²) | 整數解、範圍極小、教學演示 | 精確 (整數) |
| 矩陣庫 (Eigen/OpenCV) | O(n³) | 工程項目、大規模、穩健性要求高 | 高 (雙精度/長雙精度) |
解方程組編程核心是 **「數學建模 → 選擇算法 → 處理數值穩定性」**。二元一次方程組用克拉默法則瞬間得解;通用場景請站在巨人肩膀上用成熟線性代數庫,**切勿重複造輪子**,除非是教學或極度受限環境。