giải-phương-trình-bậc-4

Thuật toán giải phương trình bậc 4 trùng phương bằng code c++

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 !

Similar Posts

Subscribe
Notify of
guest
3 Bình luận
Inline Feedbacks
View all comments