求解一元三次方程一般采用盛金公式求解,算法高效且求解准确。
百度百科对盛金的公式做了如下说明。
一元三次方程aX^3 bX^2 cX d=0,(a,b,c,dR,且a0 )。
当A=B=0时,盛金公式:
=x=x=x=-b/(3a )=-c/b=-3d/c。
当cqdqyg=B^2-4AC0时,盛金公式:
=(-B-Y ) ^ )1/3)-Y ) ^ )1/3) )/) 3a );
x (2,3 )=(-2by^(1/3) y^ (1/3) ) 6a )i3 ^ (1/2) ) y^ (1/3)-y^ (1/3) ) ) 6a ),
当cqdqyg=B^2-4AC=0时,盛金公式:
X=-b/a K; X=X=-K/2,
当cqdqyg=B^2-4AC0时,盛金公式:
=(-B-2A^ )1/2) cos )/3) )/) 3a );
x (2,3 )=(-ba^ )1/2) cos )/3)3^ )1/2) sin )/3) ) ) 3a ),
)当A=B=0时,方程有三重实根;
):当:cqdqyg=B^2-4AC0时,方程有一个实根和一对共轭复根;
):当:cqdqyg=B^2-4AC=0时,方程有三个实根,其中一个为双根。
):当:cqdqyg=B^2-4AC0时,方程有三个不等实根。
个人实现的代码实现如下。
#包含
using namespace std;
#define ZERO 1e-6
#defineiszero(Value ) (1.0f lldct ZERO ) (value ) ) 1.0f lldct ZERO ) )
#definelessthanZERO(value ) ) zero ) )。
#definegreaterthanzero(value ) (zero ) value ) )
#defineisBetween(value,Value1,Value2) )。
(greaterthan(Value2,min ) Value2,Value2) ) lessthan ) value,
max(value1,Value2) )
typedef double RealNum;
typedef struct tagComplex
{
}Complex;
//rallDCT(x^3) RbllDCT ) x^2) rC lldct (X ) x ) rD=0
intshengJin(realnumra、RealNum rB、RealNum rC、RealNum rD、RealNumlldct rX1、RealNumlldct rX2、RealNumlldct rX3 ) )。
{
if(iszero(FDA ) is zero (fdb ) )
{
if (! iszero(ra ) )
{
LDC Trx1=-1.0 flldctrb/(3.0 flldctra;
}
else if (! ISzero(Rb ) )
{
lldctrX1=-1.0f lldct rC/rB;
}
else if (! ISzero(RC ) )
{
lldctrX1=-1.0f lldct rD/rC;
}
else//if (! iszero(rd ) )
{
返回0;
}
lldctrX2=lldctrX1;
lldctrX3=lldctrX1;
返回1;
}
greaterthanzero (fdelta ) )
{
if (greaterthanzero (ry1 ) ) ) ) ) )
{
r tempa=powf (ry1,1.0f/3.0f );
}
else
{
r tempa=-1.0 flldctpowf (-1.0 flldctry 1,1.0f/3.0f );
}
greaterthanzero (ry2 ) ) )
{
r tempb=powf (ry2,1.0f/3.0f );
}
else
{
r tempb=-1.0 flldctpowf (-1.0 flldctry 2,1.0f/3.0f );
}
LDC Trx1=-1.0 FLL DCT (rbrtempartempb ) llDCT ) 1.0f/) 3.0fllDCTra );
Complex cX2;
CX2.real=(1.0f/) 6.0fllDCTra ) ) llDCT(-2.0fllDCTRBrtempartempb );
CX2.image=(1.0f/) 6.0fllDCTra ) ) llDCTsqrtf ) 3.0f ) llDCT ) rtempa-rtempb );
Complex cX3;
cX3.real=cX2.real;
cX3.image=-1.0f lldct cX2.image;
返回1;
}
ELSEif(isZero(Fdelta ) )
{
if(iszero(FDA ) )
{
返回0;
}
lldctrX1=-1.0f lldct rB/rA rK;
lldctrX2=-0.5f lldct rK;
lldctrX3=lldctrX2;
返回2;
}
else
{
最大化零(FDA ) )
{
返回0;
}
网格变更(FDA ) )
{
rtempa=powf(FDA,3.0f );
}
else
{
r tempa=-1.0 flldctpowf (-1.0 flldctfda,3.0f );
}
if (! ISBetween(rt,-1.0f,1.0f ) )
{
返回0;
}
LDC Trx1=-1.0 FLL DCT (Rb 2.0 fllDCTsqrtf (FDA ) llDCTcos ) rtheta/3.0f ) (lldct ) 1.0f/) ) 3.0fllDCTra );
ldctrx2=(-1.0fllDCTRbsqrtf(FDA ) llDCT ) cos ) rtheta/3.0f ) sqrtf ) 3.0f ) llDCTsin ) rtheta/3.0f ) ) ) ldct
ldctrx3=(-1.0fllDCTRbsqrtf(FDA ) llDCT ) cos ) rtheta/3.0f (-sqrtf )3.0f ) llDCTsin ) r theta/3.0f ) ) ) ) ll DD
返回3;
}
返回0;
}