เด็กมัธยมต้นรู้จักแก้สมการเชิงเส้น 2 ตัวแปร เช่นถ้ามีเส้นตรงสองเส้น $y = a_1 x + b_1$ และ $y = a_2 x + b_2$ ก็สามารถหาค่า $x$ โดยการจับสมการเส้นตรงทั้งสองเส้นมาลบกันแล้วได้ $0 = (a_1 - a_2) x + (b_1-b_2)$ พอแก้สมการจะได้ค่า $x$ เป็น:
$$x = -\frac{b_1 - b_2}{a_1 - a_2}$$เมื่อเอาค่า $x$ ที่ได้ไปแทนค่าใน $y = a_1 x + b_1$ หรือ $y = a_2 x + b_2$ ก็จะได้ค่า $y$ ออกมาเป็น:
$$y = -\frac{a_2 b_1 - a_1 b_2}{a_1 - a_2}$$เราสามารถเขียนฟังก์ชั่นคำนวณจุดตัด $(x,y)$ ของเส้นตรงทั้งสองให้เราเป็นแบบนี้:
def solve_ax_plus_b(a1, b1, a2, b2):
"""
แก้สมการสองตัวแปร x, y โดยที่
y = a1 x + b1 และ
y = a2 x + b2
"""
x = -(b1-b2)/(a1-a2)
y = -(a2*b1-a1*b2)/(a1-a2)
return(x,y)
#ทดลองแก้ 3 x + 2 y = 5 และ 2 x + 8 y = 10 ซึ่งคำตอบคือ (x,y) = (1,1)
#เราต้องจัดรูปให้อยู่ในรูป y = a1 x + b1 และ y = a2 x + b2 ก่อนที่จะป้อนเข้าไปใน solve_ax_plus_b()
#จะได้รูปที่จัดเป็น y = -3/2 x + 5/2 และ y = -2/8 x + 10/8
#เมื่อแก้แล้วก็ได้คำตอบ (1,1) อย่างที่ควรจะเป็น
solve_ax_plus_b(-3/2, 5/2, -2/8, 10/8)
(1.0, 1.0)
นักเรียนควรสังเกตว่าการแก้สมการของเราจะมีการหารด้วยเลข $0$ เมื่อ $a_1$ มีค่าเท่ากับ $a_2$ ซึ่งหมายความว่าเส้นตรงทั้งสองเส้นมีความชันเท่ากัน (ไม่มีคำตอบ) จึงจะขนานกันไม่ตัดกัน หรือเป็นเส้นตรงที่ทับกันอยู่ (มีจำนวนคำตอบเป็นอนันต์)
การเขียนสมการเส้นตรงอยู่ในรูป $y = (ความชัน)x + (จุดตัดแกน y)$ มีข้อจำกัดที่ไม่สามารถเป็นสมการของเส้นตรงที่อยู่ในแนวดิ่งได้ ($x$ = ค่าคงที่ ความชันเป็นอนันต์) เราจึงหลีกเลี่ยงโดยเขียนสมการเส้นตรงเป็น $p x + q y = r$ โดย $p, q, r$ เป็นค่าคงที่แทน
สมการเชิงเส้นสองตัวแปรจะมีหน้าตาโดยทั่วไปเป็นแบบนี้: หาค่า $(x,y)$ ถ้า
$$p_1 x + q_1 y = r_1$$และ $$p_2 x + q_2 y = r_2$$
ถ้าเราไม่อยากแก้ด้วยมือ เราสามารถใช้ระบบพีขคณิตคอมพิวเตอร์ (Computer Algebra) เช่น Wolfram Alpha หาคำตอบให้เราก็ได้
def solve_two_lines(p1, q1, r1, p2, q2, r2):
"""
แก้สมการสองตัวแปร x, y โดยที่
p1 x + q1 y = r1 และ
p2 x + q2 y = r2
"""
x = (q2*r1 - q1*r2)/(p1*q2 - p2*q1)
y = -(p2*r1 - p1*r2)/(p1*q2 - p2*q1)
return(x,y)
#ทดลองแก้ 3 x + 2 y = 5 และ 2 x + 8 y = 10 ซึ่งคำตอบคือ (x,y) = (1,1)
#มื่อแก้แล้วก็ได้คำตอบ (1,1) อย่างที่ควรจะเป็น
solve_two_lines(3,2,5,2,8,10)
(1.0, 1.0)
จะสังเกตว่าถ้า $p_1 q_2 - p_2 q_1 = 0$ เส้นตรงทั้งสองจะมีความชันเท่ากัน จะไม่มีคำตอบหรือมืจำนวนคำตอบเป็นอนันต์
สมการเชิงเส้นหลายๆตัวแปรจะมีหน้าตาแบบนี้ คือมีตัวแปรที่เราต้องการหาค่า $n$ ตัว:
$$a_{11} x_1 + a_{12} x_2 + a_{13} x_3 + ... + a_{1n} x_n = b_1$$$$a_{21} x_1 + a_{22} x_2 + a_{23} x_3 + ... + a_{2n} x_n = b_2$$$$a_{31} x_1 + a_{32} x_2 + a_{33} x_3 + ... + a_{3n} x_n = b_3$$$$.$$$$.$$$$.$$$$a_{n1} x_1 + a_{n2} x_2 + a_{n3} x_3 + ... + a_{nn} x_n = b_n$$โดยที่ตัวแปร $n$ ตัวที่เราต้องการหาค่าคือ $x_1, x_2, x_3, ..., x_n$
$a_{ij}$ เป็นตัวเลขค่าคงที่ (เรียกว่าสัมประสิทธิ์) จำนวน $n^2$ ตัว โดย $i$ และ $j$ มีค่าตั้งแต่ $1, 2, 3,..., n$
โดย $i$ และ $j$ ทำหน้าที่เป็นป้ายชื่อว่าเป็นตัวเลขตัวที่เท่าไร
และ $b_1, b_2, b_3, ..., b_n$ เป็นค่าคงที่ $n$ ตัว ที่อยู่ด้านขวาของเครื่องหมายเท่ากับ
ยกตัวอย่างเช่น ถ้าเราจะแก้สมการหา $(x,y)$ โดยที่
$$3x+2y = 5$$และ $$2x + 8 y = 10$$
เราก็ตั้งชื่อตัวแปรที่เราจะหาค่า ให้ $x_1 = x$ และ $x_2 = y$
ค่าคงที่สัมประสิทธิ์จะมีดังนี้:
$a_{11} = 3, a_{12} = 2$
$a_{21} = 2, a_{22} = 8$
และค่าคงที่ด้านขวาของเครื่องหมายเท่ากัยคือ $b_1 = 5, b_2 = 10$
เมื่อเรามีตัวแปรมากกว่าสองตัวขึ้นไป สูตรสำหรับหาค่าจะเริ่มยุ่งยากขึ้นไปเรื่อยๆ (เช่นที่ให้ Wolfram Alpha หาคำตอบสำหรับสามตัวแปร) เรามักจะใช้วิธี Gaussian Elimination (หรืออีกชื่อว่า Gauss -Jordan Elimination) หาคำตอบแทนสูตรสำเร็จรูป ดูตัวอย่างได้ที่คลิปนี้ หรือ คลิปนี้
ปัญหาที่น่าสนใจในการเข้าใจและประดิษฐ์สิ่งต่างๆด้วยความรู้ทางวิทยาศาสตร์และวิศวกรรมศาสตร์มักจะมีตัวแปรมากมายกว่านี้มาก อาจจะเป็นร้อย เป็นพัน เป็นล้านตัวแปร สาเหตุที่มีตัวแปรมากมายที่มีความสัมพันธ์เชิงเส้นกันอย่างนี้ก็เพราะว่าความรู้ความเข้าใจธรรมชาติของเรามักจะอยู่ในรูปของความสัมพันธ์ระหว่างอัตราการเปลี่ยนแปลงของปริมาณบางอย่างกับสิ่งอื่นๆ เมื่อเราเขียนอัตราการเปลี่ยนแปลงออกมา เรามักจะได้ตัวแปรที่บวกหรือลบกันอยู่ ทำให้อยู่ในรูปสมการเชิงเส้นหลายๆตัวแปรได้
ใน Python เรามีเครื่องมือช่วยแก้สมการเชิงเส้นด้วย เราสามารถใช้ numpy.linalg.solve() แก้ปัญหาให้เราได้
#ทดลองแก้ 3 x + 2 y = 5 และ 2 x + 8 y = 10 ซึ่งคำตอบคือ (x,y) = (1,1)
#มื่อแก้แล้วก็ได้คำตอบ (1,1) อย่างที่ควรจะเป็น
import numpy as np
a = np.array([[3, 2], [2, 8]]) #ใส่สัมประสิทธิ์เข้าไป
b = np.array([5, 10]) #ใส่ค่าคงที่ด้านขวาเข้าไป
solution = np.linalg.solve(a,b)#แก้สมการด้วย np.linalg.solve
print(solution)
[1. 1.]
#ทดลองแก้
# 3 x + 2 y + 3 z = 10
# 2 x - 5 y + 4 z = 20
# x + y + 10 z = 8
a = np.array([[3, 2, 3], [2, -5, 4], [1, 1, 10]]) #ใส่สัมประสิทธิ์เข้าไป
b = np.array([10, 20, 8]) #ใส่ค่าคงที่ด้านขวาเข้าไป
solution = np.linalg.solve(a,b) #แก้สมการด้วย np.linalg.solve
print(solution)
[ 4.02312139 -1.91907514 0.58959538]
#โจทย์ว่า มีผึ้ง วัว และเป็ด รวมกัน 900 ตัว
#มีปีกรวม 1200 ปีก
#มีขารวมกัน 3600 ขา
#ให้ผึ้งมี x ตัว
#ให้วัวมี y ตัว
#ให้เป็ดมี z ตัว
#มีสัตว์รวมกัน 1000 ตัว: x + y + z = 900
#มีปีกรวม 1200 ปีก: 4 x + 0 y + 2 z = 1200
#มีขารวม 3600 ขา: 6 x + 4 y + 2 z = 3600
#หาว่ามีสัตว์อย่างละกี่ตัว: หา x, y, z
a = np.array([[1,1,1], [4, 0, 2], [6, 4, 2]]) #ใส่สัมประสิทธิ์เข้าไป
b = np.array([900, 1200, 3600]) #ใส่ค่าคงที่ด้านขวาเข้าไป
solution = np.linalg.solve(a,b) #แก้สมการด้วย np.linalg.solve
print(solution)
[200. 500. 200.]
แก้สมการได้คำตอบ $(x,y,z) = (200, 500, 200)$ แสดงว่ามีผึ้ง 200 ตัว วัว 500 ตัว และเป็ด 200 ตัว