【发布时间】:2016-01-19 00:35:07
【问题描述】:
我正在尝试创建一个函数来计算包含复数的 4 次多项式的 4 个根。在搜索公式时,我发现了一个相当简单的公式,包含在 this discussion 中,由 Tito Piezas III 在页面底部描述。
现在,我相信真正的错误并不是我的代码中的错误(因为我确信校对会很烦人),而是我对所涉及方法的理解。我的问题是,二次根很复杂,我不知道如何在以编程方式计算二次根时使用复数。
他建议使用两个二次方程的根来推导四次根。我试图用下面的代码尽可能地模仿这个公式。这个想法是我计算两个二次根(在它们仅是正数的前提下——我不知道否则如何),然后,使用这些结果,我可以计算出四次根,然后保存实数和复数值分别到x1,x2,x3,x4 到r1,r2,r3,r4,c1,c2,c3,c4。但是,在计算二次根时,u,稍后用于计算二次根的值:很复杂!
这是他的公式和步骤的image。 Blow 是我的代码,大多数步骤都有说明。
double a, b, c, d;
double c1, c2, c3, c4; //complex values
double r1, r2, r3, r4; //real values
// x^4+ax^3+bx^2+cx+d=0
a = 3;
b = 4;
c = 5; //<--- example coefficients
d = 6;
if (a != 0) {
double u,v1,v2;
double x,y,z; //essentially a,b,c that he uses
x=1;
y= -2*b*b*b+9*a*b*c-27*c*c-27*a*a*d+72*b*d;
z= Math.pow((b*b-3*a*c+12*d),3);
//calculation of the v roots
v1 = -y+(Math.sqrt(y*y-4*x*z))/(2*x); // < negative root
v2 = -y-(Math.sqrt(y*y-4*x*z))/(2*x); // < negative root
//---calculations after this are invalid since v1 and v2 are NaN---
u = (a*a)/4 + ((-2*b+Math.pow(v1,1/3)+Math.pow(v2,1/3))/3);
double x12sub,x34sub;
x12sub= 3*a*a-8*b-4*u+((-a*a*a+4*a*b-8*c)/(Math.sqrt(u)));
x34sub= 3*a*a-8*b-4*u-((-a*a*a+4*a*b-8*c)/(Math.sqrt(u)));
r1 = -(1/4)*a +(1/2)*(Math.sqrt(u));
r2 = -(1/4)*a +(1/2)*(Math.sqrt(u));
r3 = -(1/4)*a -(1/2)*(Math.sqrt(u));
r4 = -(1/4)*a -(1/2)*(Math.sqrt(u));
//--casting results into their orderly variables--
if(x12sub<0){
x12sub= x12sub*-1;
x12sub = Math.sqrt(x12sub);
x12sub = x12sub*(1/4);
c1=x12sub;
c2=x12sub;
}
else{
r1=r1+x12sub;
r2=r2-x12sub;
}
if(x34sub<0){
x34sub= x34sub*-1;
x34sub = Math.sqrt(x34sub);
x34sub = x34sub*(1/4);
c3=x34sub;
c4=x34sub;
}
else{
r3=r3+x34sub;
r4=r4+x34sub;
}
}
我愿意接受任何解决方案。甚至涉及使用可以帮助我的库的那些。感谢您的帮助。
【问题讨论】:
-
This 可能对您的部分问题有用。
-
您最好使用非显式方法,例如 Jenkins-Traub 方法。这是关于 Jenkins-Traub 方法的pretty good article。
-
我看到Apache Commons-Math中有拉盖尔方法的实现。这是LaguerreSolver 的javadoc。
-
@RobertDodier:这篇文章几乎没有告诉你有关 Jenkins-Traub 的任何信息。与维基百科的文章进行比较。线性因素的综合划分是基本的组成部分,而不仅仅是通货紧缩的方法。 -- 但是,RPoly 的配套 javascript 翻译 akiti.ca/PolyRootRe.html 通常对于快速根计算很有用。
标签: java math polynomial-math