使用立方公式计算不起作用的三次方程的根

时间:2016-09-16 21:56:27

标签: java polynomial-math

我正在尝试制作一个输出给定三次方程根的程序。因此,我决定使用立方公式(http://www.math.vanderbilt.edu/~schectex/courses/cubic/)制作一个版本。这个公式应该能够输出其中一个根的结果。

然而,它似乎无法工作,我不确定它是否有缺陷的代码或想法。这里系数1,-6,11和-6应该产生1,2或3的输出。而是输出NaN。这同样适用于我试图使用的其他系数。谢谢你的帮助!

public class CubicFormula {
    public static void main(String[] args) {
        System.out.println(new CubicFormula().findRoots(1.0, -6.0, 11.0, -6.0));
    }

    public double findRoots(double a, double b, double c, double d) {
        double p = -(b)/(3*a);
        double q = Math.pow(p, 3) + (b*c - 3*a*d)/(6*Math.pow(a, 2));
        double r = c/(3*a);

        return Math.cbrt(q + Math.sqrt(Math.pow(q, 2.0) + Math.pow((r - Math.pow(p, 2.0)), 3)))
                + Math.cbrt(q - Math.sqrt(Math.pow(q, 2.0) + Math.pow((r - Math.pow(p, 2.0)), 3))) + p;

    }
}

1 个答案:

答案 0 :(得分:3)

从您提到的链接

  

一个原因是我们试图避免教他们复杂的数字。复数(即将飞机上的点视为数字)是一个更高级的主题,最好留给更高级的课程。但是,我们允许在微积分中使用的唯一数字是实数(即线上的点)。这对我们施加了一些限制 - 例如,我们不能采用负数的平方根。现在,Cardan的公式有一个缺点,即可能会在计算的中间步骤中发挥这样的平方根,即使这些数字没有出现在问题或答案中。

这部分

Math.sqrt(Math.pow(q, 2.0) + Math.pow((r - Math.pow(p, 2.0)), 3))

最终将是负数的sqrt,这是虚构的,但在java

双打世界最终成为NaN。