首页 > 其他 > 详细

求解一元方程公式法

时间:2014-03-24 09:29:44      阅读:447      评论:0      收藏:0      [点我收藏+]

/* 只有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;
}


求解一元方程公式法,布布扣,bubuko.com

求解一元方程公式法

原文:http://blog.csdn.net/mobius_strip/article/details/21909145

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!