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 │
└ ┘ └ ┘ └ ┘