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

Solving Simultaneous Linear Equations
🧠 國中數學複習:什麼是「二元一次聯立方程式」?
所謂二元一次方程式,是指包含兩個未知數(通常為 x 和 $y$)的一次方程式。
例如:
{a1x+b1y=c1a2x+b2y=c2
這種形式就是一組二元一次聯立方程式。
✅ 解法:代入法 or 加減法 or 行列式法
這裡我們會使用「克拉默法則(Cramer's Rule)」,因為它的形式容易轉換成 C 程式實作。
📐 Cramer’s Rule(克拉默法則)
給定以下兩個方程式:
{a1x+b1y=c1a2x+b2y=c2
定義三個行列式:
主行列式(判別式):
D=a1b2−a2b1
x 的行列式:
Dx=c1b2−c2b1
y 的行列式:
Dy=a1c2−a2c1
若 D=0,則有唯一解:
x=DDx,y=DDy
✳️ 🧠 克拉默法則(Cramer's Rule)詳細補充
✳️ 問題設定
我們想解這樣的一組聯立方程式:
{a1x+b1y=c1a2x+b2y=c2
我們目標是求解 x 和 y。
🧩 代數背景:為什麼行列式能解聯立方程式?
其實這是線性代數中的一個重要結果:
AX=C
其中:
A 是係數矩陣(2×2):
A=[a1a2b1b2]
X 是未知變數向量:
X=[xy]
C 是常數項向量:
C=[c1c2]
若 det(A)=0,則方程組有唯一解,可以寫為:
X=A−1C
但 Cramer's Rule 是一種更直觀、不需算出 A−1 的方式。
🧮 Cramer’s Rule 正式定義
主行列式 D:
D=a1b2−a2b1
這就是係數矩陣的 determinant(行列式)。
將第一欄換成常數項,算出 Dx:
Dx=c1b2−c2b1
將第二欄換成常數項,算出 Dy:
Dy=a1c2−a2c1
解為:
x=DDx,y=DDy
🔍 為什麼這樣做是對的?
行列式的幾何意義是「平行四邊形面積」,當 D=0 時,代表兩條直線(或向量)不平行,一定有唯一交點;這時 Cramer's Rule 就會給出精確交點座標。
📝 例題說明(搭配程式)
給定:
{2x+3y=84x−y=2
計算:
- D=2∗(−1)−4∗3=−2−12=−14
- Dx=8∗(−1)−2∗3=−8−6=−14
- Dy=2∗2−4∗8=4−32=−28
則:
- x=−14/−14=1
- y=−28/−14=2
驗證:
- 2(1)+3(2)=2+6=8
- 4(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;
}