Tách nhánh trước phép chia
Phương trình `ax²+bx+c=0` có thể trở thành bậc nhất nếu a=0. Khi a=b=0, c=0 cho vô số nghiệm còn c khác 0 cho vô nghiệm. Chỉ khi a khác 0 mới xét `delta=b*b-4*a*c` và chia cho `2*a`. Với delta âm, phương trình **không có nghiệm thực**; delta bằng 0 có nghiệm kép; delta dương có hai nghiệm thực phân biệt. Không làm phép chia trước khi loại trường hợp mẫu bằng 0.
Nhiệm vụ: lưu mã vào `giai-phuong-trinh.py`, chạy sáu bộ hệ số bên dưới; bảng kiểm là các nhãn và nghiệm in ra:
```python
from math import sqrt
def giai(a, b, c):
if a == 0:
if b == 0:
return "Vô số nghiệm" if c == 0 else "Vô nghiệm"
return f"Một nghiệm: {-c / b:g}"
delta = b * b - 4 * a * c
if delta < 0:
return "Vô nghiệm thực"
if delta == 0:
return f"Nghiệm kép: {-b / (2 * a):g}"
x1 = (-b + sqrt(delta)) / (2 * a)
x2 = (-b - sqrt(delta)) / (2 * a)
return f"Hai nghiệm: {x1:g} và {x2:g}"
for he_so in [(0, 0, 0), (0, 0, 5), (0, 2, -4),
(1, 0, -4), (1, 2, 1), (1, 0, 1)]:
print(he_so, giai(*he_so))
```
Sáu dòng lần lượt là vô số nghiệm; vô nghiệm; một nghiệm 2; hai nghiệm 2 và -2; nghiệm kép -1; vô nghiệm thực. Nếu một dòng sai, kiểm nhánh đầu tiên mà bộ hệ số đi qua và giá trị delta. Mã dùng hệ số nguyên nhỏ để kết quả dễ đối chiếu; với số thực tính trên máy, so sánh bằng 0 cần cân nhắc sai số nếu bài toán yêu cầu độ chính xác cao.
Bài luyện
Với hệ số `(0, 2, -4)`, nhánh nào cho nghiệm?
a=0 nên không còn bậc hai.
2x-4=0 cho x=2.
b khác 0.
Có nghiệm thực.
Lời giải
`a=0`, `b=2` khác 0 nên giải `2x-4=0`, suy ra `x=2`.
Bài luyện
Với `(1, 0, 1)`, delta bằng bao nhiêu và kết luận trong số thực là gì?
Delta không dương.
b²-4ac=0-4=-4.
Delta=-4<0, không có nghiệm thực.
Không có nhánh bậc nhất.
Lời giải
`delta=0²-4·1·1=-4`. Vì delta âm, phương trình `x²+1=0` không có nghiệm thực.
Bài luyện
Vì sao mã kiểm `a == 0` trước khi tính nghiệm bậc hai?
Delta vẫn tùy hệ số.
Khi a=0, phương trình không còn bậc hai và mẫu 2a bằng 0.
b,c vẫn quyết định nghiệm.
sqrt dùng cho delta dương ở a khác 0.
Lời giải
Công thức nghiệm bậc hai chia cho `2*a`, không dùng được khi a=0. Nhánh đầu xử lí các trường hợp suy biến trước.
Đang học