我有一个凸集,位于欧几里得空间中(3D,但希望为nD提供答案),由一组半空间(法向量+点)描述。
除了计算所有由3个(或n个)半空间相交得到的点并排除非极点之外,是否有更好的算法来寻找凸集的极点?
我有一个凸集,位于欧几里得空间中(3D,但希望为nD提供答案),由一组半空间(法向量+点)描述。
除了计算所有由3个(或n个)半空间相交得到的点并排除非极点之外,是否有更好的算法来寻找凸集的极点?
lcon2vert
。然而,为了阅读算法并在另一种语言中重新实现它,使用Michael Kleder的旧版和简单的con2vert文件更容易,这是Matt J项目所依赖的。Ax<=b
的线性不等式集合组成,其中A是一个矩阵,b是一个列向量。c = A\b
,它是超定线性系统Ax=b
的最小二乘解。如果分量上满足A*c<b
,则这是一个内部点。否则,尝试多变量最小化,目标函数为0和所有数字A*c-b
的最大值。如果无法找到一个满足A*c-b<0
的点,则程序退出并显示“无法找到内部点”。b = b - A*c
实现。由于0现在是一个内部点,b的所有条目都是正数。这只是Matlab中的一个命令:D = A ./ repmat(b,[1 size(A,2)]);
,对A的第i行进行了b(i)的除法。从此以后,只使用矩阵D。请注意,D的行是在开头提到的双面体P*的顶点。
步骤4. 检查多面体P是否有界
如果多面体P的对偶面P*的顶点位于原点通过某些超平面的同一侧,则多面体P是无界的。可以使用内置函数convhulln
来检测这个问题,它计算给定点的凸包体积。作者检查将零行附加到矩阵D是否增加了凸包的体积;如果增加了,程序将退出并显示“检测到非边界约束”。
步骤5. 计算顶点
这是循环部分。
for ix = 1:size(k,1)
F = D(k(ix,:),:);
G(ix,:)=F\ones(size(F,1),1);
end
在这里,矩阵k编码P*的面,每行列出面的顶点。矩阵F是D的子矩阵,包含P*的一个面的顶点。反斜杠调用线性求解器,并找到P的一个顶点。
步骤6:清理
由于在步骤2中对多面体进行了平移,因此使用V = G + repmat(c',[size(G,1),1]);
来撤消此平移。其余两行尝试消除重复的顶点(不总是成功)。