找到一组二次方程的解

时间:2017-03-15 15:23:49

标签: 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
系统突然没有解决方案。在下一步中,我可以添加epsilons来补偿舍入错误,但我不确定它们应该有多大。任何想法或更好的方法?

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

1 个答案:

答案 0 :(得分:1)

由于你有精确的整数输入,你可以使用精确的算法。 例如,您可以计算与您的方程对应的多项式Groebner basis,例如

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基础(例如compute the basis for your example)。可以使用Buchberger algorithm计算Groebner基础,Java中提供了一些实现。

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