Bài toán: Giải phương trình bậc 4 trùng phương sau a4 + b2 + c = 0 (a≠0) (1)
- Input
Nhap a: 1 Nhap b: -2 Nhap c: 1
- Output
x = 1 x = -1
Ý tưởng giải phương trình bậc 4 trùng phương
Ta có thể giải phương trình (1) theo các bước như sau
- Để giải phương bậc 4 trùng phương thì ta quy nó về phương trình bậc 2 với X = x2
- Ta tiến hành chọn các nghiệm X thỏa mãn tính chất X lớn hơn hoặc bằng 0.
- Với nghiệm X = 0 thì ta suy ra phương trình (1) có nghiệm x = 0
- Với nghiệm X > 0 thì ta suy ra phương trình (1) có hai nghiệm x = ± sqrt(X)
Nếu bạn chưa biết cách giải phương trình bậc 2 trong c++ thì các bạn nên xem lại bài viết này.
Xây dựng hàm giải phương trình bậc 4 trùng phương
Mình sẽ tận dụng lại code giải phương trình bậc 2 ở bài trước để giải bài tập này. Nếu các bạn muốn tự viết lại hàm giải phương trình bậc 4 trên thì mình rất khuyến khích!
Ta quy phương trình (1) về phương trình sau:
aX2 + bX + c = 0 (2)
Hàm giải phương trình bậc 2:
int giaiPT(float a, float b, float c,float &x1, float &x2) { //code }
Trong đó hàm trên sẽ trả về số nghiệm của phương trình.
Có hai tham chiếu x1, x2 được trả về chính là hai nghiệm ( X1 và X2 nếu có).
Ta có thể biện luận số nghiệm của phương trình (1) như sau:
Số nghiệm của phương trình (2) | Nghiệm X1 | Nghiệm X2 | Số nghiệm của phương trình (1) |
Vô nghiệm | Vô nghiệm | ||
Nghiệm kép | 0 | 0 | Có một nghiệm x =0 |
>0 | >0 | Có hai nghiệm | |
<0 | <0 | Vô nghiệm | |
Nghiệm phân biệt | <0 | <0 | Vô nghiệm |
0 | >0 | Có ba nghiệm | |
0 | <0 | Có một nghiệm | |
<0 | >0 | Có hai nghiệm | |
>0 | >0 | Có bốn nghiệm |
Từ bảng trên thì ta đã có thể biện luận số nghiệm của phương trình 1 rồi phải không nào !
Cùng xây dựng chương trình giải phương trình bậc 4 trùng phương thôi.
Code tham khảo
#include<iostream> #include<math.h> using namespace std; int giaiPT(float a, float b, float c, float &x1, float &x2) { float delta = b * b - 4 * a*c; if (delta < 0) { x1 = x2 = 0.0; return 0; } else if (delta == 0) { x1 = x2 = -b / (2 * a); return 1; } else { delta = sqrt(delta); x1 = (-b + delta) / (2 * a); x2 = (-b - delta) / (2 * a); return 2; } } int main() { float X1, X2, a, b, c; do { cout<<"Nhap a (a!=0): "; cin >> a; cout<<"Nhap b: "; cin >> b; cout<<"Nhap c: "; cin >> c; } while (!a); //nếu a=0 thì nhập lại if (giaiPT(a, b, c, X1, X2) == 0) { cout<< "Phuong trinh vo nghiem"; } else if( giaiPT(a, b, c, X1, X2) == 1 ) { if (X1 < 0) cout << "Phuong trinh vo nghiem"; else if (X1 == 0) cout << "Phuong trinh co mot nghiem x: " << 0; else { cout<<"Phuong trinh co hai nghiem"<<endl; cout << "x1: " << sqrt(X1) << endl; cout << "x2: " << -sqrt(X1) << endl; } } else { if (X1 < 0) { if(X2 < 0) cout<< "Phuong trinh vo nghiem"; else if(X2 == 0) cout << "Phuong trinh co mot nghiem x: " << 0; else { cout << "Phuong trinh co hai nghiem" << endl; cout << "x1: " << sqrt(X2) << endl; cout << "x2: " << -sqrt(X2) << endl; } } else if (X1 == 0) { if(X2 < 0) cout << "Phuong trinh co mot nghiem x: " << 0; else { cout << "Phuong trinh co ba nghiem" << endl; cout << "x1: " << sqrt(X2) << endl; cout << "x2: " << -sqrt(X2) << endl; cout << "x3: " << 0; } //X2 không thể bằng 0 nếu bằng 0 thì là nghiệm kép } else { if (X2 < 0) { cout << "Phuong trinh co hai nghiem" << endl; cout << "x1: " << sqrt(X1) << endl; cout << "x2: " << -sqrt(X1) << endl; } else if (X2 == 0) { cout << "Phuong trinh co ba nghiem" << endl; cout << "x1: " << sqrt(X1) << endl; cout << "x2: " << -sqrt(X1) << endl; cout << "x3: " << 0; } else { cout << "Phuong trinh co bon nghiem" << endl; cout << "x1: " << sqrt(X1) << endl; cout << "x2: " << -sqrt(X1) << endl; cout << "x3: " << sqrt(X2) << endl; cout << "x4: " << -sqrt(X2) << endl; } } } system("pause"); return 0; }
Nhap a (a!=0): 1 Nhap b: -2 Nhap c: 1 Phuong trinh co hai nghiem x1: 1 x2: -1
Bài viết mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !
Để lại một bình luận