Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求一组二次方程的解_Java_Algorithm_Geometry - Fatal编程技术网

Java 求一组二次方程的解

Java 求一组二次方程的解,java,algorithm,geometry,Java,Algorithm,Geometry,我有一组二次方程,比如 x² + x + y = 7 x + 3y = -3 y² + x² + z = 11 所有系数都是整数。这组方程要么没有解,要么是一组解中的一个解 有人知道一种方法来找出这些方程是否有解吗 我的第一个想法是一个接一个地求解这些方程,然后用结果求解其他方程。问题在于舍入误差:理论上,如果我有两个方程 x + y = 5 x = 5 - y 有很多解决办法。但是如果我的方法导致 x + y = 4.999999 x = 5 - y 系统突然没有解决方案。在下一步中,我

我有一组二次方程,比如

x² + x + y = 7
x + 3y = -3
y² + x² + z = 11
所有系数都是整数。这组方程要么没有解,要么是一组解中的一个解

有人知道一种方法来找出这些方程是否有解吗

我的第一个想法是一个接一个地求解这些方程,然后用结果求解其他方程。问题在于舍入误差:理论上,如果我有两个方程

x + y = 5
x = 5 - y
有很多解决办法。但是如果我的方法导致

x + y = 4.999999
x = 5 - y
系统突然没有解决方案。在下一步中,我可以添加ε来补偿舍入误差,但我不确定它们应该有多大。有什么想法或更好的方法吗


PS:背景是在平面上找到一组复杂的圆和线的交点。

因为你有整数的精确输入,所以你可以使用精确的算法。 例如,你可以计算一组和你的方程对应的多项式,例如

x² + x + y - 7
x + 3y + 3
y² + x² + z - 11
通过术语的字典排序,你将得到一种三角形形式的Groebner基,其中第一个多项式包含尽可能少的变量,例如

81z² - 176z + 92
2y + 9z - 8
2x - 27z + 30
这将为z提供两个实根,并在z固定后为y和x提供唯一值。如果计算基的第一个多项式不包含变量,则方程组没有任何解。如果计算基中的第一个多项式包含两个变量,则有无限多个可能复杂的解

您可以使用Wolfram Alpha在线试验Groebner基地,例如。可以使用计算Groebner基,Java中提供了一些实现


注意:Buchberger算法的最坏情况复杂度是输入的最大总次数的双指数,但在您的应用程序中,这可能无关紧要。

您可以尝试使用BigDecimal来消除精度误差,您需要确定一个通用的最大精度,或者将这些值与一些ε进行比较,也就是说,布尔值等于Math.abs4.999-5>0.0001;。后一种方法通常用于几何应用,如碰撞检测等。在几何应用中,结果需要在尽可能低的精度下保持数值稳定。ε值是交点的精度,因此在您的情况下,每个曲线/曲面上最近点的最大距离被视为交点同一点通常设置为形状中最小细节的一小部分。。。。或者渲染为像素大小的分数,等等。。。但要注意使用它的哪种力量。。。例如,如果得到的是直线x+c0.y=c1,则使用eps^1,但对于圆x^2+y^2=r^2,则使用eps^2,因此方程之间的单位/度量仍然相同。我解决问题