首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

基礎算法思維訓練:解決二元一次方程組的編程實現方法

     編輯:程式設計疑難解答

問題描述

已知方程組:
`x + y = 5`
`x - y = 1`
求 `x, y` 值。編程實現求解。

數學解法 (解析解)

兩式相加:`2x = 6` → `x = 3`
代入第一式:`3 + y = 5` → `y = 2`

編程實現三種思路

1. 直接公式法 (最高效、推薦)

#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;
}

2. 高斯消元法 (通用、可擴展到 n 元)

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

3. 暴力枚舉法 (教學用、整數解場景)

// 僅適用於小範圍整數解
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³)工程項目、大規模、穩健性要求高高 (雙精度/長雙精度)

工程落地建議

  • ✅ **固定 2/3 元小系統** → 硬編碼克拉默公式,零依賴、極快。
  • ✅ **通用 n 元 / 矩陣運算** → 引入 Eigen (Header-only, C++), `A.colPivHouseholderQr().solve(b)` 一行解決。
  • ✅ **非線性方程組** → 牛頓迭代法、Levenberg-Marquardt (Ceres Solver)。
  • ⚠️ **浮點數比較** 永遠用 `fabs(a-b) < eps`,勿用 `==`。

總結

解方程組編程核心是 **「數學建模 → 選擇算法 → 處理數值穩定性」**。二元一次方程組用克拉默法則瞬間得解;通用場景請站在巨人肩膀上用成熟線性代數庫,**切勿重複造輪子**,除非是教學或極度受限環境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved