|||
一元三次方程aX^3+bX^2+cX+d=0,(a,b,c,d∈R,且a≠0)。
重根判别式:
A=b^2-3ac;
B=bc-9ad;
C=c^2-3bd,
总判别式:
Δ=B^2-4AC。
当A=B=0时,盛金公式①:
X1=X2=X3=-b/(3a)=-c/b=-3d/c。
当Δ=B^2-4AC>0时,盛金公式②:
X1=(-b-((Y1)^(1/3)+(Y2)^(1/3)))/(3a);
X2,3=(-2b+(Y1)^(1/3)+(Y2)^(1/3)±3^(1/2)((Y1)^(1/3)-(Y2)^(1/3))i)/(6a),
其中Y1,2=Ab+3a(-B±(B^2-4AC)^(1/2))/2,i^2=-1。
当Δ=B^2-4AC=0时,盛金公式③:
X1=-b/a+K;
X2=X3=-K/2,
其中K=B/A,(A≠0)。
当Δ=B^2-4AC<0时,盛金公式④:
X1=(-b-2A^(1/2)cos(θ/3))/(3a);
X2,3=(-b+A^(1/2)(cos(θ/3)±3^(1/2)sin(θ/3)))/(3a),
其中θ=arccosT,T= (2Ab-3aB)/(2A^(3/2)),(A>0,-1<T<1)。
关键原码如下:
{T1P3Func}
Procedure T1P3Func.Calculate;
var
Fa,Fb,Fc,Fd : Real;
DA,DB,DC,DD : Real;
Y1,Y2,K : Real;
begin
Fa := Coefficients[0];
Fb := Coefficients[1];
Fc := Coefficients[2];
Fd := Coefficients[3];
DA := Fb*Fb - 3*Fa*Fc;
DB := Fb*Fc - 9*Fa*Fd;
DC := Fc*Fc - 3*Fb*Fd;
DD := DB*DB - 4 * DA * DC;
if (DA = DB) and (DA =0) then
begin
RSolutions[0]:= -Fb/(3*Fa);
RSolutions[1]:= -Fb/(3*Fa);
RSolutions[2]:= -Fb/(3*Fa);
VSolutions[0]:= 0;
VSolutions[1]:= 0;
VSolutions[2]:= 0;
FRootCount := 1;
end else if DD > 0 then
begin
Y1:= DA * Fb + 3*Fa*(-Fb+sqrt(DD))/2;
Y2:= DA * Fb + 3*Fa*(-Fb-sqrt(DD))/2;
if (Y1>0) and (Y2>0) then
begin
Y1:= power(Y1,1/3);
Y2:= power(Y2,1/3);
end else if (Y1>0) and (Y2<0) then
begin
Y1:= power(Y1,1/3);
Y2:= -power(-Y2,1/3);
end else if (Y1<0) and (Y2<0) then
begin
Y1:= -power(-Y1,1/3);
Y2:= -power(-Y2,1/3);
end else if (Y1<0) and (Y2>0) then
begin
Y1:= -power(-Y1,1/3);
Y2:= power(Y2,1/3);
end;
RSolutions[0]:= (-Fb - Y1 - Y2)/(3*Fa);
VSolutions[0]:= 0;
RSolutions[1]:= (-2*Fb+Y1+Y2)/(6*Fa);
VSolutions[1]:= Sqrt(3)*(Y1-Y2)/(6*Fa);
RSolutions[2]:= RSolutions[1];
VSolutions[2]:= -VSolutions[1];
FRootCount := 3;
end else if DD = 0 then
begin
K := DB/DA;
RSolutions[0]:= -Fb/Fa + K;
RSolutions[1]:= -K/2;
RSolutions[2]:= RSolutions[1];
VSolutions[0]:= 0;
VSolutions[1]:= 0;
VSolutions[2]:= 0;
FRootCount := 3;
end else if DD<0 then
begin
K := (2*DA*Fb-3*Fa*DB)/(2*Power(DA,3/2));
Y1 := Arccos(K);
RSolutions[0] := (-Fb-2*Sqrt(DA)*Cos(Y1/3))/(3*Fa);
RSolutions[1] := (-Fb+Sqrt(DA)*(Cos(Y1/3)+ sqrt(3)*sin(Y1/3)))/(3*Fa);
RSolutions[2] := (-Fb+Sqrt(DA)*(Cos(Y1/3)- sqrt(3)*sin(Y1/3)))/(3*Fa);
VSolutions[0]:= 0;
VSolutions[1]:= 0;
VSolutions[2]:= 0;
FRootCount := 3;
end;
end;
仔细对照算法说明,并未发现程序实现和算法说明的差异.用实例测试发现:
这段程序在解DD>0的情况时,不能得到正确的解.
如方程(x^2+1)(x+3)=0的解,一看就知道是:i,-i和-3.
展开为:x^3+3x^2+x+3=0
用程序解时:DD=1200>0(和手工验算符合)
得到的解是:
-1.21822935060556+0i
-0.890885324697222+2.13785617558042i
-0.890885324697222-2.13785617558042i
和i,-i,-3相距甚远,难道盛金公式用的有问题?
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 09:31
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社