【问题标题】:Using cubic formula to calculate roots of cubic equation not working使用三次公式计算三次方程的根不起作用
【发布时间】:2016-09-16 21:56:26
【问题描述】:

我正在尝试制作一个输出给定三次方程的根的程序。因此,我决定使用三次公式 (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;

    }
}

【问题讨论】:

    标签: java polynomial-math


    【解决方案1】:

    从你提到的那个链接

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

    这部分

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

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

    双打世界最终变成了 NaN。

    【讨论】:

    • 除了消除实根的虚部外,立方根可能需要是复(极)根,具体取决于您使用的公式的变体。 (即cbrt(-1) 需要为-0.5 + sqrt(3) i 而不是-1。)
    猜你喜欢
    • 2013-09-06
    • 2020-11-28
    • 2012-09-09
    • 2017-11-10
    • 2015-04-28
    • 2013-11-27
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多