超平面由n个点定义

时间:2012-07-21 16:36:54

标签: c++ math linear-algebra

我遇到以下问题:

考虑到空间中的n个点,我正在搜索经过它们的超平面。

这个问题的最简单的例子是两点(x_1 = 0,x_2 = 0)和(1,-1),我想得到1 * x_1 + 1 * x_2 = 0返回。

我的观点是32位整数的n元组。期望超平面a_1 x_1 + a_2 x_2 + ... = c的系数a_i也必须是32位整数。如果不能以这种方式定义超平面,我想报告这个。

我的项目是用c ++编写的。

我可能会自己编写代码,但我预计这将是相当多的工作。另外,我的预感是,这是一个普遍的问题,可能有一个开源库可以解决我的问题。有人知道一个可以解决我问题的图书馆吗?

提前致谢!

3 个答案:

答案 0 :(得分:3)

实际上这并不是很难,因为给定的点是线性无关的。

让你在Z ^ n中成为你的节点,然后将v ^ i定义为(u ^ i_0,...,u ^ i_ {n-1}, - 1)。

现在创建一个矩阵A

( v^0_0     v^0_1 ...     v^0_n     )
( v^1_0     v^1_1 ...     v^1_n     )
    .         .             .
    .         .             .
    .         .             .
( v^{n-2}_0 v^{n-2}_1 ... v^{n-2}_n )

你需要解决的是A * x == 0。

现在继续进行高斯消除。确保你仍然让系数为整数。所以你不必做r_k - = r_ki * r_i / r_ii,你必须做r_k = r_ki * r_i - r_ii * r_k。在每个步骤之后,将处理的行除以其最大公约数。这通常可以避免溢出。如果遇到溢出,只需使用更大的类型进行矩阵运算本身。

最后,您将拥有一个矩阵,其中最多有两列具有多个条目。您的解决方案将取决于仅选择这两行的值,例如它看起来像

1 1 1 0 0 0
2 0 0 1 0 0
0 1 0 0 1 0
1 1 0 0 0 1

将任何值分配给x_0和x_1(在此示例中),您就完成了。 x的最后一个值将是超平面相等的右侧。

答案 1 :(得分:2)

我自己没有使用它,但LinBox看起来像你想要的。

答案 2 :(得分:-1)

您需要做的就是求解线性方程组:

X*A = C

其中A =(a_1,...,a_n)^ T,C =(c,...,c)^ T.它们都是n个向量。 Xm n矩阵

x^1_1  ...  x^1_n
x^2_1  ...  x^2_n
  .     .     .
  .     .     .
  .     .     .
x^m_1  ...  x^m_n

其中每一行是一个点的坐标。假设有m个点(无论它们是否与线性相关)和m<=n

要求解线性方程,请尝试2种情况:C =(1,...,1)^ T,C =(0,...,0)^ T.

然后你可以使用任何算法,如高斯或高斯 - 乔丹消除,来寻找A =(a_1,...,a_n)^ T.如果m<n和/或点与线性相关,则A中将包含自由变量,否则A是唯一确定的。从确定的A开始,您可以判断A的所有元素是否都是整数。