我希望实现简单的等式:

i,j = -Q±√(Q 2 -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

简单地说,测试采用等式的第一部分并将其修改为介于0和11之间的非零整数,然后写入i和j。 i和j返回正确的数字,但由于某种原因需要* -10才能使它们正确(我猜测得到正确值的数字)。

如果可能的话,我想找到一种更好的方法来执行上面的等式,因为我这样做的方式似乎是错误的, 只是有效。 我希望按照等式所暗示的方式来做,而不是破解它的工作。

===============>>#1 票数:6

二次方程通常用abc 为了满足ax 2 + 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方法目前将长期recurse。 试试这个:

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);
}

===============>>#2 票数:1

你需要取平方根。 请注意,Q ^ 2-4PR会产生一个负数,因此您将不得不处理复数(或限制输入以避免这种情况)。 Apache Math可以在这里为您提供帮助。

===============>>#3 票数:1

使用Math.sqrt作为平方根。 为什么要将i和j投射到整数? 它是给出方形函数根的等式,因此i和j可以是任何复数。 您应将判别式限制为实(双)根的正值,否则使用复数。


double test = Q*Q - 4*P*R;
if(Q < 0) throw new Exception("negative discriminant!");
else {
    test = Math.sqrt(test);
    double i = (-Q + test) / 2*P;
    double i = (-Q - test) / 2*P;
}

===============>>#4 票数:0

你为什么要做模数而不是平方根? 你的代码似乎是获得二次方程((a±sqrt(b ^ 2-4ac))/ 2a)的根的方法,所以代码应该是:

double delta = Q*Q-4*P*R);
if(delta < 0.0) {
  throw new Exception("no roots");
}
double d = Math.power(delta,0.5);
double r1 = (Q + d)/(2*P)
double r2 = (Q - d)/(2*P)

===============>>#5 票数:0

正如其他人所指出的,你对mod的使用甚至都没有错。 你为什么要编这样的数学?

众所周知,如果b的值非常接近判别式,则二次方程的朴素解可能会出现问题。

“C ++中的数字配方”第5.6节提出了一种更好的方法:如果我们定义的话

替代文字
(来源: equationsheet.com

然后两个根是:

替代文字

替代文字

您的代码还需要考虑病态情况(例如,a = 0)。

让我们用你的价值观代替这些公式,看看我们得到了什么。 如果a = 10,b = 7,c = 10,那么:

替代文字
(来源: equationsheet.com

然后两个根是:

替代文字
(来源: equationsheet.com

替代文字
(来源: equationsheet.com

我想我的迹象是正确的。

如果您的计算给您带来麻烦,可能是因为您的方法无法正确考虑您的复杂根源。 你需要一个复杂的数字类。

  ask by AlexT translate from so

未解决问题?本站智能推荐:

5回复

Java:将数学方程式转换为String表达式吗?

我是Java的新手,我想弄清楚如何编写一个数学表达式来在一行上显示变量的值,然后在下一行进行数学运算? 这是我认为可行的方法,但是它只是打印出答案,而不是在addStuff()方法顶行显示字符串表示形式。
3回复

如何从Java上的txt文件读取和获取方程式中变量的系数

我如何从txt文件中读取方程式,并获取这些方程式的系数,例如。 3.2x-5.6y=10在txt文件中,我需要3.2 , -5.6和10来制作图形gui程序。 我尝试了bufferedreader但无法获取系数。
3回复

用Java解决两个代数方程

我有两个方程需要在Java中评估 这些方程本质上是动态的 y在这些方程式中是已知的,我需要确定x的值 用Java编写程序的最佳简便方法是什么?
3回复

如何在Java中执行贷款方程式?

我正在尝试制作一个程序,允许用户在考虑贷款时确定不同的方面。 第一个公式应该确定给定的每月还款额,贷款额,利率和月数。 第二个方程式是在给定贷款金额,利率和每月还款额的情况下,确定要偿还多少笔(或几个月)。 这是我正在测试的代码,但似乎无法获得有效的输出。 对于第一个方程式,我首先
1回复

反演(A-B)是否有任何等式? [关闭]

是否可以计算AB的倒数,我已经计算出A和B的倒数。
5回复

Python解决一个变量的等式

我正在尝试使用SymPy在python中解决方程式。 我有一个生成的等式(类似于function = y(8.0-(y**3.0)) ,我与SymPy一起创建一个新的等式: eq = sympy.Eq(function, 2) ,它输出y(8.0-(y**3.0)) == 2但是sympy.s
1回复

将等式转换为C ++ [重复]

这个问题已经在这里有了答案: 圆矩形碰撞检测(交叉点) 20个答案 我正在尝试测试圆是否与正方形相交。 我弄清楚如何做到这一点的最好方法是查找是否存在x,使得:x在平方的最小和最大x值之间; 问题是我不知道如何将其转换为代码,有人可以帮忙吗?
1回复

如何在Matlab中求解一组线性方程和不等式的组合?

我有一个涉及线性方程组和不等式的问题。 该问题由Ax = 0和Cx > 0 ( A和C是矩阵, x是要求解的变量的向量)。 此问题可能有多种解决方案。 我想找到至少一个解决方案或一组解决方案,然后从中选择一个。 任何想法如何使用MATLAB做到这一点? 对于背景(不确定是否会
4回复

在PHP中做事的简单方法是什么?

我正在尝试制作一个脚本来帮助我的数学学习 示例公式: y=(4*(x*2)^(2x+4))+4*x^2 为此,我只需要了解一下,只需将(x*2)赋予(2x+4)的幂,然后再将其归并为原始方程式,那么您当然可以eval()一个答案。 当我知道x值时,我想计算y的值。 如果没有权
3回复

如何在Java中实现这个等式?

好的,这更像是一个后续问题: 如何计算旅行推销员比特币之旅的最佳路径? 首先,对于旅行商问题的比特游,我有以下复发关系: l是以前结果的表格。 我的问题是C部分:假设定义了l(k,i)和dist(pk,pj) ,我将如何在Java中实现C部分? 我最初的想法是,我将k从1迭代到