【问题标题】:Find solutions for a set of quadratic equations找到一组二次方程的解
【发布时间】:2017-08-06 10:34:25
【问题描述】:

我有一组二次方程,比如

x² + x + y = 7
x + 3y = -3
y² + x² + z = 11

所有系数都是整数。这组方程要么没有解,要么是一整套解的一个解。

有人知道找出这些方程是否有解的方法吗?

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

x + y = 5
x = 5 - y

会有很多解决方案。但是如果我的方法导致

x + y = 4.999999
x = 5 - y

系统突然无解。在下一步中,我可以添加 epsilon 来补偿舍入误差,但我不确定它们应该有多大。有什么想法或更好的方法吗?

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

【问题讨论】:

  • 您可以尝试使用BigDecimal 来消除精度错误(尽管您需要确定一个常见的最大精度)或将这些值与某个 epsilon 进行比较,例如 boolean equal = Math.abs(4.999 - 5) > 0.0001;。后一种方法通常用于几何应用中,例如碰撞检测等。在这些应用中,结果需要在数值上保持稳定,同时尽可能降低精度。
  • epsilon 值是您的交点的精度,因此在您的情况下,每条曲线/曲面上最近点的最大距离被视为交点(同一点)通常设置为最小的一小部分您的形状中的细节....或像素大小的一小部分(如果渲染等)...但要注意使用它的哪个功能...例如,如果您有线x+c0.y = c1,那么您使用eps^1 ,但对于圆圈@ 987654329@ 你使用eps^2 所以你在方程之间仍然有相同的单位/公制。我解决了How approximation search works

标签: java algorithm geometry


【解决方案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 算法的最坏情况复杂度是输入的最大总度数的双指数,但在您的应用程序中这可能无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多