บทนำ
สมการคือหัวใจหลักของคณิตศาสตร์ ไม่ว่าคุณจะคำนวณฟิสิกส์, จัดการอัลกอริธึม, หรือแค่ฝึกฝน มันมีประโยชน์มากที่จะรู้วิธีการแก้สมการด้วยโค้ด มาดูสี่กรณีกัน:
- สมการเชิงเส้น (ax + b = 0)
- สมการเชิงกำลังสอง (ax² + bx + c = 0)
- ระบบของสมการเชิงเส้นสองสมการ (สองตัวแปร)
- สมการเชิงกำลังสาม (ax³ + bx² + cx + d = 0)
สำหรับแต่ละกรณี เราจะเริ่มจาก ตรรกะทางคณิตศาสตร์ แล้วกระโดดไปที่โค้ด C++ และ Python.
1. สมการเชิงเส้น (ax + b = 0)
วิธีการแก้ (คณิตศาสตร์):
- ย้าย b ไปอีกด้าน: ax = -b.
- ถ้า a = 0 และ b = 0 → มีคำตอบไม่จำกัด.
- ถ้า a = 0 และ b ≠ 0 → ไม่มีคำตอบ.
- ในกรณีอื่น ๆ, x = -b/a.
C++:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a, b;
cin >> a >> b;
if (fabs(a) < 1e-9) {
if (fabs(b) < 1e-9) cout << "Infinite solutions\n";
else cout << "No solution\n";
} else {
cout << "x = " << -b/a << endl;
}
return 0;
}
Python:
a, b = map(float, input("Enter a, b: ").split())
if abs(a) < 1e-9:
if abs(b) < 1e-9:
print("Infinite solutions")
else:
print("No solution")
else:
print("x =", -b/a)
2. สมการเชิงกำลังสอง (ax² + bx + c = 0)
วิธีการแก้ (คณิตศาสตร์):
- คำนวณดิสคริมิแนนต์: Δ = b² − 4ac.
- ถ้า Δ < 0: ไม่มีคำตอบจริง.
- ถ้า Δ = 0: รากคู่หนึ่ง x = −b/(2a).
- ถ้า Δ > 0: รากสอง x₁, x₂ โดยใช้สูตรเชิงกำลังสอง.
- ถ้า a = 0: ลดให้เป็นเชิงเส้น.
C++:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a, b, c;
cin >> a >> b >> c;
if (fabs(a) < 1e-9) {
cout << "x = " << -c/b << "\n";
} else {
double delta = b*b - 4*a*c;
if (delta < 0) cout << "No real roots\n";
else if (fabs(delta) < 1e-9) cout << "Double root x = " << -b/(2*a) << "\n";
else {
cout << "x1 = " << (-b + sqrt(delta))/(2*a) << "\n";
cout << "x2 = " << (-b - sqrt(delta))/(2*a) << "\n";
}
}
}
Python:
import math
a, b, c = map(float, input("Enter a, b, c: ").split())
if abs(a) < 1e-9:
print("x =", -c/b)
else:
delta = b*b - 4*a*c
if delta < 0:
print("No real roots")
elif abs(delta) < 1e-9:
print("Double root x =", -b/(2*a))
else:
x1 = (-b + math.sqrt(delta))/(2*a)
x2 = (-b - math.sqrt(delta))/(2*a)
print("x1 =", x1, "x2 =", x2)
3. ระบบของสมการเชิงเส้นสองสมการ
รูปแบบ:
ax + by = c
dx + ey = f
วิธีการแก้ (คณิตศาสตร์):
- ใช้กฎของ Cramer.
- ดีเทอร์มิแนนต์: D = ae - bd.
- ถ้า D ≠ 0: x = (ce - bf) / D
y = (af - cd) / D
- x = (ce - bf) / D
- y = (af - cd) / D
- ถ้า D = 0: ถ้า Dx = 0 และ Dy = 0 → มีคำตอบไม่จำกัด.
ในกรณีอื่น → ไม่มีคำตอบ.
- ถ้า Dx = 0 และ Dy = 0 → มีคำตอบไม่จำกัด.
- ในกรณีอื่น → ไม่มีคำตอบ.
C++:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a,b,c,d,e,f;
cin >> a >> b >> c >> d >> e >> f;
double D = a*e - b*d;
double Dx = c*e - b*f;
double Dy = a*f - c*d;
if (fabs(D) < 1e-9) {
if (fabs(Dx) < 1e-9 && fabs(Dy) < 1e-9) cout << "Infinite solutions\n";
else cout << "No solution\n";
} else {
cout << "x = " << Dx/D << ", y = " << Dy/D << "\n";
}
}
Python:
a, b, c, d, e, f = map(float, input("Enter a,b,c,d,e,f: ").split())
D = a*e - b*d
Dx = c*e - b*f
Dy = a*f - c*d
if abs(D) < 1e-9:
if abs(Dx) < 1e-9 and abs(Dy) < 1e-9:
print("Infinite solutions")
else:
print("No solution")
else:
x = Dx / D
y = Dy / D
print("x =", x, "y =", y)
4. สมการเชิงกำลังสาม (ax³ + bx² + cx + d = 0)
วิธีการแก้ (คณิตศาสตร์):
- วิธีทั่วไป: ใช้สูตรของ Cardano.
- แทนที่เพื่อเอา x² ออก: ตั้งค่า x = t - b/(3a).
- รูปแบบที่ลดลง: t³ + pt + q = 0.
- ดิสคริมิแนนต์: Δ = (q/2)² + (p/3)³. ถ้า Δ > 0: 1 รากจริง, 2 รากเชิงซ้อน.
ถ้า Δ = 0: มีรากจริงอย่างน้อย 2 รากที่เท่ากัน.
ถ้า Δ < 0: 3 รากจริงที่แตกต่างกัน.
- ถ้า Δ > 0: 1 รากจริง, 2 รากเชิงซ้อน.
- ถ้า Δ = 0: มีรากจริงอย่างน้อย 2 รากที่เท่ากัน.
- ถ้า Δ < 0: 3 รากจริงที่แตกต่างกัน.
- พูดตามตรง การเขียนสูตรของ Cardano ใน C++ มันค่อนข้างยุ่งยาก ใน Python เราสามารถใช้ NumPy ได้ง่าย ๆ.
C++ (ทำให้เรียบง่ายสำหรับรากจริงหนึ่ง):
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a,b,c,d;
cin >> a >> b >> c >> d;
double f = ((3*c/a) - (b*b)/(a*a)) / 3;
double g = ((2*b*b*b)/(a*a*a) - (9*b*c)/(a*a) + (27*d/a)) / 27;
double h = g*g/4 + f*f*f/27;
if (h > 0) {
double R = -(g/2) + sqrt(h);
double S = cbrt(R);
double T = -(g/2) - sqrt(h);
double U = cbrt(T);
double x1 = (S+U) - (b/(3*a));
cout << "One real root x = " << x1 << "\n";
} else {
cout << "Multiple real roots (needs full Cardano)\n";
}
}
Python (NumPy):
import numpy as np
coeffs = list(map(float, input("Enter a, b, c, d: ").split()))
roots = np.roots(coeffs)
print("Roots:", roots)
บทสรุป
เราได้พูดคุยเกี่ยวกับคณิตศาสตร์และโค้ดสำหรับการแก้สมการเชิงเส้น, เชิงกำลังสอง, ระบบ 2×2, และสมการเชิงกำลังสาม C++ สร้างสูตรด้วยมือ; Python ทำให้ทุกอย่างกระชับ (และ NumPy หาเชิงกำลังสามได้ง่าย) ลองนำแต่ละตัวแก้สมการไปใช้เองเพื่อพัฒนาทักษะทั้งด้านพีชคณิตและการเขียนโปรแกรม.