Java 用单纯形法求物体的顶点

Java 用单纯形法求物体的顶点,java,c++,math,linear-algebra,simplex,Java,C++,Math,Linear Algebra,Simplex,我想找到一个物体的顶点,它由一些方程决定。 比如说 Eq1: 2x + y + z <= 12; Eq2: x + y >= 23; Eq3: x + y + z <= 10; 它给出了一个六面体。我想知道顶点的位置,这个对象就是从这些顶点创建的 唯一的方法是制作一个代码来检查这个方程的所有可能的变化吗 array = array with this equations (6 elements) for( i = 1; i <= arra

我想找到一个物体的顶点,它由一些方程决定。 比如说

Eq1:   2x + y +  z <= 12;
Eq2:    x + y      >= 23;
Eq3:    x + y +  z <= 10;
它给出了一个六面体。我想知道顶点的位置,这个对象就是从这些顶点创建的

唯一的方法是制作一个代码来检查这个方程的所有可能的变化吗

array = array with this equations (6 elements)

for( i = 1; i <= array.lenght; i++ ){
 for( j = 1; j <= array.lenght; j++ ){
  for( k = 1; k <= array.lenght; k++ ){
    //and there check is solve of a variation is possible
  }   
 }    
}
array=带此等式的数组(6个元素)
对于(i=1;i这被称为:从半空间表示转换多面体(这就是你所拥有的——一组不等式)在一般情况下,文献中有许多算法可以有效地实现这一点。如果您需要尽可能高效,您应该研究其中一种算法

但是,已知只有六个半空间可以形成有界的、非退化的六面体,所以蛮力可能很好。每个顶点都位于三个面的交点处。因此,取三个不等式的每个子集,并计算相应方程的交点。(如何做到这一点,请参见下文。)如果交点不存在(例如,两个平面平行),或者如果交点不满足其他三个不等式中的任何一个,则这三个面在顶点处不相交;否则该点就是其中一个顶点。对6C3=20组合中的每一个重复此操作,最终应得到八个顶点

要计算三个不等式的交点,可以使用一些简单的线性代数。以任意三个不等式为例:

2x +  y +  z <= 12
 x +  y      >= 23
 x           >= 0
(矩阵行是每个不等式中
x
y
z
的系数。)如果左侧的矩阵是奇异的(即行列式为零),则没有公共交点。否则,通过反转矩阵来计算解:

┌   ┐   ┌             ┐-1┌    ┐
│ x │   │ 2    1    1 │  │ 12 │
│   │   │             │  │    │
│ y │ = │ 1    1    0 │  │ 23 │
│   │   │             │  │    │
│ z │   │ 1    0    0 │  │  0 │
└   ┘   └             ┘  └    ┘

任何线性代数库都应该能够为您进行此计算,或者因为这是您可以使用的3D。然后对照其他三个不等式检查
[x y z]
,以确定它是否是顶点。

因为这是6个平面,它们中任何两个的交点都将是一条线。那么您说的“顶点”是什么意思“检查所有可能变化的代码”,您的意思是它计算是否存在迭代通过这些值的x、y和z的“所有可能”值的解决方案吗?如果是,这对于小范围的x、y和z是可能的(假设它们被限制为>=0,并且所有方程仅相加)但是如果你想在解中考虑实数,那是不可能的。@非直线果——顶点是三个平面相交的点。六面体(例如立方体)有八个顶点。
┌             ┐┌   ┐   ┌    ┐
│ 2    1    1 ││ x │   │ 12 │
│             ││   │   │    │
│ 1    1    0 ││ y │ = │ 23 │
│             ││   │   │    │
│ 1    0    0 ││ z │   │  0 │
└             ┘└   ┘   └    ┘
┌   ┐   ┌             ┐-1┌    ┐
│ x │   │ 2    1    1 │  │ 12 │
│   │   │             │  │    │
│ y │ = │ 1    1    0 │  │ 23 │
│   │   │             │  │    │
│ z │   │ 1    0    0 │  │  0 │
└   ┘   └             ┘  └    ┘