求解一元三次方程的方法java实现

来源:互联网 发布:吉他定音器软件 编辑:程序博客网 时间:2024/06/05 07:17
 

public double findFS(double a, double b, double c, double d) {
  double FS = 0;
  double A, B, C, delta;
  double x1, x2, x3;
  A = b * b - 3 * a * c;
  B = b * c - 9 * a * d;
  C = c * c - 3 * b * d;
  delta = B * B - 4 * A * C;

  if (A == 0 && B == 0) {
   x1 = x2 = x3 = -c / b;
  }
  /*
   * Shengjin’s Distinguishing Means ①:当A=B=0时,方程有一个三重实根;
   * ②:当Δ=B^2-4AC>0时,方程有一个实根和一对共轭虚根; ③:当Δ=B^2-4AC=0时,方程有三个实根,其中有一个两重根;
   * ④:当Δ=B^2-4AC<0时,方程有三个不相等的实根。
   */
  if (delta > 0) {
   double y1 = A * b + 3 * a * (-B + Math.pow(B * B - 4 * A * C, 0.5))
     * 0.5;
   double y2 = A * b + 3 * a * (-B - Math.pow(B * B - 4 * A * C, 0.5))
     * 0.5;

   x1 = (-b - (Math.pow(y1, 1 / 3.0) + Math.pow(y2, 1 / 3.0)))
     / (3 * a);
   x2 = x3 = -999999999;
  } else if (delta == 0) {
   double K = B / A;
   x1 = -b / a + K;
   x2 = x3 = -K * 0.5;

  } else {
   double T = (2 * A * b - 3 * a * B) / (2 * Math.pow(A, 3 / 2.0));
   double temp = Math.acos(T);

   x1 = (-b - 2 * (2 * Math.pow(Math.cos(temp / 3.0), 0.5))) / (3 * a);
   x2 = (-b + Math.pow(A, 0.5) * Math.cos(temp / 3.0) + Math.pow(3,
     0.5)
     * Math.sin(temp / 3.0))
     / (3 * a);
   x3 = (-b + Math.pow(A, 0.5) * Math.cos(temp / 3.0) - Math.pow(3,
     0.5)
     * Math.sin(temp / 3.0))
     / (3 * a);
  }
  FS = maxNum(x1, x2, x3);
  return FS;
 }