/* 只有1,2,3,4次方程有求跟公式 */
#include <cmath>
#define OO 10
class equation {
private:
double A,B,C,D,E;
public:
double X[ 5 ];
int Count;
equation( double a, double b );
equation( double a, double b, double c );
equation( double a, double b, double c, double d );
equation( double a, double b, double c, double d, double e );
double daet(){return B*B-4*A*C;}
};
/* y = ax+b */
equation::equation( double a, double b )
{
A = a;B = b;
if ( a == 0 ) Count = OO;
else {
Count = 1;
X[ 1 ] = B/A;
}
}
/* y = ax^2+bx+c */
equation::equation( double a, double b, double c )
{
A = a;B = b;C = c;
if ( daet() < 0 ) {
Count = 0;
}else {
if ( daet() == 0 ) Count = 1;
else Count = 2;
X[ 1 ] = (-b-sqrt( daet() ))/(2*a);
X[ 2 ] = (-b+sqrt( daet() ))/(2*a);
}
}
/* y = ax^3+bx^2+cx+d */
equation::equation( double a, double b, double c, double d )
{
A = b*b-3*a*c;B = b*c-9*a*d;C = c*c-3*b*d;
if ( A == 0 && B == 0 ) {
Count = 1;
X[ 1 ] = X[ 2 ] = X[ 3 ] = -c/b;
}else if ( daet() < 0 ){
double T = (2*A*b-3*a*B)/(2*sqrt(A*A*A));
double S = acos( T );
Count = 3;
X[ 1 ] = (-b-2*sqrt(A)*cos(S/3))/(3*a);
X[ 2 ] = (-b+sqrt(A)*(cos(S/3)+sqrt(3)*sin(S/3)))/(3*a);
X[ 3 ] = (-b+sqrt(A)*(cos(S/3)-sqrt(3)*sin(S/3)))/(3*a);
}else if ( daet() == 0 ){
double K = B/A;
Count = 2;
X[ 1 ] = -b/a+K;
X[ 2 ] = X[ 3 ] = -K/2;
}else {
double Y1 = A*b+3*a*(-B+sqrt(B*B-4*A*C))/2;
double Y2 = A*b+3*a*(-B-sqrt(B*B-4*A*C))/2;
Count = 1;
X[ 1 ] = X[ 2 ] = X[ 3 ] = (-b-pow(Y1,1/3)-pow(Y2,1/3))/(3*a);
}
}
/* y = ax^4+bx^3+cx^2+dx+e */
equation::equation( double a, double b, double c, double d, double e )
{
double D1 = c*c-3*b*d+12*a*e;
double D2 = 2*c*c*c-9*b*c*d+27*a*d*d+27*b*b*e-72*a*c*e;
double D3 = sqrt(D2+sqrt(-4*D1*D1*D1+D2*D2));
double D = (pow(2,1/3)*D1)/(2*a*a*a*D3)+D3/(3*pow(2,1/3)*a);
double AA = sqrt(b*b/(4*a*a)-2*c/(3*a)+D);
double BB = b*b/(2*a*a)-4*c/(3*a)-D;
double CC = -b*b*b/(a*a*a)+4*b*c/(a*a)-8*d/a;
X[ 1 ] = -b/(4*a)-0.5*AA-0.5*sqrt(BB-CC/AA);
X[ 2 ] = -b/(4*a)-0.5*AA-0.5*sqrt(BB+CC/AA);
X[ 3 ] = -b/(4*a)-0.5*AA+0.5*sqrt(BB-CC/AA);
X[ 4 ] = -b/(4*a)-0.5*AA+0.5*sqrt(BB+CC/AA);
}
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
equation E( 1, -5, -4, 20 );
cout << E.X[ 1 ] << " " << E.X[ 2 ] << " " << E.X[ 3 ] << endl;
system("pause");
return 0;
}
原文:http://blog.csdn.net/mobius_strip/article/details/21909145