Giới Thiệu
Phương trình là nền tảng của toán học. Dù bạn đang tính toán vật lý, xử lý thuật toán, hay chỉ đơn giản là luyện tập, việc biết cách giải chúng bằng mã là rất hữu ích. Hãy cùng xem bốn trường hợp sau:
- Phương trình tuyến tính (ax + b = 0)
- Phương trình bậc hai (ax² + bx + c = 0)
- Hệ hai phương trình tuyến tính (hai ẩn số)
- Phương trình bậc ba (ax³ + bx² + cx + d = 0)
Đối với mỗi trường hợp, chúng ta sẽ bắt đầu với logic toán học, sau đó nhảy vào mã C++ và Python.
1. Phương Trình Tuyến Tính (ax + b = 0)
Cách giải (toán học):
- Chuyển b sang bên kia: ax = -b.
- Nếu a = 0 và b = 0 → có vô số nghiệm.
- Nếu a = 0 và b ≠ 0 → không có nghiệm.
- Ngược lại, 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 << "Vô số nghiệm\n";
else cout << "Không có nghiệm\n";
} else {
cout << "x = " << -b/a << endl;
}
return 0;
}
Python:
a, b = map(float, input("Nhập a, b: ").split())
if abs(a) < 1e-9:
if abs(b) < 1e-9:
print("Vô số nghiệm")
else:
print("Không có nghiệm")
else:
print("x =", -b/a)
2. Phương Trình Bậc Hai (ax² + bx + c = 0)
Cách giải (toán học):
- Tính toán định thức: Δ = b² − 4ac.
- Nếu Δ < 0: không có nghiệm thực.
- Nếu Δ = 0: một nghiệm kép x = −b/(2a).
- Nếu Δ > 0: hai nghiệm x₁, x₂ sử dụng công thức bậc hai.
- Nếu a = 0: giảm về phương trình tuyến tính.
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 << "Không có nghiệm thực\n";
else if (fabs(delta) < 1e-9) cout << "Nghiệm kép 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("Nhập a, b, c: ").split())
if abs(a) < 1e-9:
print("x =", -c/b)
else:
delta = b*b - 4*a*c
if delta < 0:
print("Không có nghiệm thực")
elif abs(delta) < 1e-9:
print("Nghiệm kép 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. Hệ Hai Phương Trình Tuyến Tính
Dạng:
Cách giải (toán học):
- Sử dụng quy tắc Cramer.
- Định thức: D = ae - bd.
- Nếu D ≠ 0:x = (ce - bf) / D
y = (af - cd) / D
- x = (ce - bf) / D
- y = (af - cd) / D
- Nếu D = 0: Nếu cả Dx = 0 và Dy = 0 → có vô số nghiệm.
Ngược lại → không có nghiệm.
- Nếu cả Dx = 0 và Dy = 0 → có vô số nghiệm.
- Ngược lại → không có nghiệm.
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 << "Vô số nghiệm\n";
else cout << "Không có nghiệm\n";
} else {
cout << "x = " << Dx/D << ", y = " << Dy/D << "\n";
}
}
Python:
a, b, c, d, e, f = map(float, input("Nhập 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("Vô số nghiệm")
else:
print("Không có nghiệm")
else:
x = Dx / D
y = Dy / D
print("x =", x, "y =", y)
4. Phương Trình Bậc Ba (ax³ + bx² + cx + d = 0)
Cách giải (toán học):
- Phương pháp tổng quát: sử dụng công thức Cardano.
- Thay thế để loại bỏ hạng tử x²: đặt x = t - b/(3a).
- Dạng rút gọn: t³ + pt + q = 0.
- Định thức: Δ = (q/2)² + (p/3)³. Nếu Δ > 0: 1 nghiệm thực, 2 nghiệm phức.
Nếu Δ = 0: ít nhất 2 nghiệm thực bằng nhau.
Nếu Δ < 0: 3 nghiệm thực phân biệt.
- Nếu Δ > 0: 1 nghiệm thực, 2 nghiệm phức.
- Nếu Δ = 0: ít nhất 2 nghiệm thực bằng nhau.
- Nếu Δ < 0: 3 nghiệm thực phân biệt.
- Thật sự, việc lập trình công thức Cardano trong C++ hơi phức tạp. Trong Python, chúng ta có thể chỉ cần sử dụng NumPy.
C++ (đơn giản hóa cho một nghiệm thự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 << "Một nghiệm thực x = " << x1 << "\n";
} else {
cout << "Nhiều nghiệm thực (cần công thức Cardano đầy đủ)\n";
}
}
Python (NumPy):
import numpy as np
coeffs = list(map(float, input("Nhập a, b, c, d: ").split()))
roots = np.roots(coeffs)
print("Nghiệm:", roots)
Kết Luận
Chúng ta đã đề cập đến toán học và mã nguồn để giải các phương trình tuyến tính, bậc hai, hệ 2×2 và bậc ba. C++ xây dựng các công thức bằng tay; Python giữ mọi thứ ngắn gọn (và NumPy tìm các nghiệm bậc ba dễ dàng). Hãy thử triển khai từng bộ giải để phát triển cả kỹ năng đại số và lập trình.