Back
Clang & Wasm 教學

C語言補充教材 - 二元一次方程式的聯立求解

Solving Simultaneous Linear Equations


🧠 國中數學複習:什麼是「二元一次聯立方程式」?

所謂二元一次方程式,是指包含兩個未知數(通常為 xx 和 $y$)的一次方程式

例如:

{a1x+b1y=c1a2x+b2y=c2\begin{cases} a_1x + b_1y = c_1 \\ a_2x + b_2y = c_2 \end{cases}

這種形式就是一組二元一次聯立方程式。

✅ 解法:代入法 or 加減法 or 行列式法

這裡我們會使用「克拉默法則(Cramer's Rule)」,因為它的形式容易轉換成 C 程式實作。


📐 Cramer’s Rule(克拉默法則)

給定以下兩個方程式:

{a1x+b1y=c1a2x+b2y=c2\begin{cases} a_1x + b_1y = c_1 \\ a_2x + b_2y = c_2 \end{cases}

定義三個行列式:

  • 主行列式(判別式):

    D=a1b2a2b1D = a_1b_2 - a_2b_1
  • xx 的行列式:

    Dx=c1b2c2b1D_x = c_1b_2 - c_2b_1
  • yy 的行列式:

    Dy=a1c2a2c1D_y = a_1c_2 - a_2c_1

D0D \ne 0,則有唯一解:

x=DxD,y=DyDx = \frac{D_x}{D}, \quad y = \frac{D_y}{D}
✳️ 🧠 克拉默法則(Cramer's Rule)詳細補充

✳️ 問題設定

我們想解這樣的一組聯立方程式:

{a1x+b1y=c1a2x+b2y=c2\begin{cases} a_1x + b_1y = c_1 \\ a_2x + b_2y = c_2 \end{cases}

我們目標是求解 xxyy


🧩 代數背景:為什麼行列式能解聯立方程式?

其實這是線性代數中的一個重要結果:

AX=CAX = C

其中:

  • AA 是係數矩陣(2×2):

    A=[a1b1a2b2]A = \begin{bmatrix} a_1 & b_1 \\ a_2 & b_2 \end{bmatrix}
  • XX 是未知變數向量:

    X=[xy]X = \begin{bmatrix} x \\ y \end{bmatrix}
  • CC 是常數項向量:

    C=[c1c2]C = \begin{bmatrix} c_1 \\ c_2 \end{bmatrix}

det(A)0\det(A) \ne 0,則方程組有唯一解,可以寫為:

X=A1CX = A^{-1}C

但 Cramer's Rule 是一種更直觀、不需算出 A1A^{-1} 的方式。


🧮 Cramer’s Rule 正式定義

  1. 主行列式 DD

    D=a1b2a2b1D = a_1b_2 - a_2b_1

    這就是係數矩陣的 determinant(行列式)。

  2. 將第一欄換成常數項,算出 DxD_x

    Dx=c1b2c2b1D_x = c_1b_2 - c_2b_1
  3. 將第二欄換成常數項,算出 DyD_y

    Dy=a1c2a2c1D_y = a_1c_2 - a_2c_1
  4. 解為:

    x=DxD,y=DyDx = \frac{D_x}{D}, \quad y = \frac{D_y}{D}

🔍 為什麼這樣做是對的?

行列式的幾何意義是「平行四邊形面積」,當 D0D \ne 0 時,代表兩條直線(或向量)不平行,一定有唯一交點;這時 Cramer's Rule 就會給出精確交點座標。


📝 例題說明(搭配程式)

給定:

{2x+3y=84xy=2\begin{cases} 2x + 3y = 8 \\ 4x - y = 2 \end{cases}

計算:

  • D=2(1)43=212=14D = 2*(-1) - 4*3 = -2 - 12 = -14
  • Dx=8(1)23=86=14D_x = 8*(-1) - 2*3 = -8 - 6 = -14
  • Dy=2248=432=28D_y = 2*2 - 4*8 = 4 - 32 = -28

則:

  • x=14/14=1x = -14 / -14 = 1
  • y=28/14=2y = -28 / -14 = 2

驗證:

  • 2(1)+3(2)=2+6=82(1) + 3(2) = 2 + 6 = 8
  • 4(1)2=24(1) - 2 = 2

✅ 正確。


🧠 記憶口訣小技巧

  • D 是原本的係數交叉相減
  • D_x 是把 x 那欄換成右邊的 c₁c₂,再交叉相減
  • D_y 是把 y 那欄換成右邊的 c₁c₂,再交叉相減

💻 C語言實作:使用行列式法求解聯立方程式

✅ 範例程式碼:

#include <stdio.h>

int main() {
    double a1, b1, c1;
    double a2, b2, c2;
    double D, Dx, Dy, x, y;

    printf("請輸入第一個方程式的係數 a1, b1, c1(格式:a1x + b1y = c1):\n");
    scanf("%lf %lf %lf", &a1, &b1, &c1);

    printf("請輸入第二個方程式的係數 a2, b2, c2(格式:a2x + b2y = c2):\n");
    scanf("%lf %lf %lf", &a2, &b2, &c2);

    D = a1 * b2 - a2 * b1;

    if (D == 0) {
        printf("這組方程式無唯一解(可能無解或有無限多組解)。\n");
    } 
    else {
        Dx = c1 * b2 - c2 * b1;
        Dy = a1 * c2 - a2 * c1;
        x = Dx / D;
        y = Dy / D;

        printf("解為:x = %.2lf, y = %.2lf\n", x, y);
    }

    return 0;
}

SNPQ © 2025