Java:实现简单的方程

标签 java equations

我正在寻找实现简单的方程:

i,j = -Q ± √(Q2-4PR) / 2P

为此,我有以下代码(注意:P = 10.Q = 7.R = 10):

    //Q*Q – 4PR = -351 mod 11 = -10 mod 11 = 1, √1 = 1
    double test = Math.sqrt(modulo(((Q*Q) - ((4*P)*R))));

    // Works, but why *-10 needed?
    i = (int)(((-Q+test)/(P*2))*-10);    // i = 3
    j = (int)(((-Q-test)/(P*2))*-10);    // j = 4

简单来说,test 将方程的第一部分修改为 0 到 11 之间的非零整数,然后写入 i 和 j。 i 和 j 返回正确的数字,但由于某种原因需要 *-10 才能使它们正确(我猜想获得正确值的数字)。

如果可能的话,我想找到一种更好的方法来执行上述方程,因为我的方法似乎是错误的,并且只是有效。我想按照等式的建议去做,而不是修改它来工作。

最佳答案

quadratic equation通常用 abc 来表示。为了满足 ax2+bx+c = 0,您将得到 (-b +/- sqrt(b^2-4ac))/2a 作为答案。

我认为你的基本问题是你出于某种原因使用而不是取平方根。 -10 系数只是一个捏造的系数,它恰好适用于您的测试用例。

你应该有这样的东西:

public static void findRoots(double a, double b, double c)
{
    if (b * b < 4 * a * c)
    {
        throw new IllegalArgumentException("Equation has no roots");
    }

    double tmp = Math.sqrt(b * b - 4 * a * c);
    double firstRoot = (-b + tmp) / (2 * a);
    double secondRoot = (-b - tmp) / (2 * a);
    System.out.println("Roots: " + firstRoot + ", " + secondRoot);
}

编辑:您的 modulo 方法目前将长期递归。试试这个:

public static int modulo(int x)
{
    return ((x % 11) + 11) % 11;
}

基本上第一个 % 11 的结果将在 [-10, 10] 范围内 - 因此在添加另一个 11 并再次取 % 11 ,这是正确的。无需递归。

此时没有太多理由将其作为单独的方法,因此您可以使用:

public static void findRoots(double a, double b, double c)
{       
    int squareMod11 = (((b * b - 4 * a * c) % 11) + 11) % 11;
    double tmp = Math.sqrt(squareMod11);
    double firstRoot = (-b + tmp) / (2 * a);
    double secondRoot = (-b - tmp) / (2 * a);
    System.out.println("Roots: " + firstRoot + ", " + secondRoot);
}

关于Java:实现简单的方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815397/

相关文章:

math - 求解包含二 Gamma 函数的方程组的最有效方法是什么?

ms-office - Microsoft 公式编辑器语法

c++ - 为什么我的制图师要打印函数的多个实例? C++

python - 在 python 中/在网络上生成方程表示

java - 在ant构建中设置类路径

java - 使用通用集合

Java/MongoDB 按日期查询

python - 当一个变量的值已知时,在 numpy 中解决超定系统

java - 为什么我的程序不能正确显示 2016 年 2 月及之后的月份?

java - 将 Eclipse 安装移动到用户配置文件之外的文件夹?