Триплет, выбранный из набора неравенств, обычно определяет точку, полученную путем решения соответствующего триплета уравнений.Я считаю, что вы хотите выпуклый корпус этого набора точек.Вы можете сгенерировать это следующим образом.
cons = randomCons; (* Your function *)
eqs = Apply[Equal, List @@@ Subsets[cons, {3}], {2}];
sols = Flatten[{x, y, z} /. Table[Solve[eq, {x, y, z}], {eq, eqs}], 1];
pts = Select[sols, And @@ (NumericQ /@ #) &];
ComputationalGeometry`Methods`ConvexHull3D[pts]
Конечно, некоторые триплеты могут быть недоопределены и приводить к линиям или к целой плоскости.Таким образом, код будет выдавать жалобу в этих случаях.
Похоже, что это работало в нескольких случайных случаях, которые я пробовал, но, как отмечает Яро, это не работает во всех случаях.Следующая картинка проиллюстрирует, почему:
{p0, p1, p2,
p3} = {{1, 0, 0, 0, 0, 0, 0, 0}, {1, 1/2, -(1/2), 0, -(1/2), 0,
0, -(1/2)}, {1, 0, 1/2, 1/2, 0, 0, -(1/2), 1/2}, {1, -(1/2), 1/2,
0, -(1/2), 0, 0, -(1/2)}};
hadamard = KroneckerProduct @@ Table[{{1, 1}, {1, -1}}, {3}];
invHad = Inverse[hadamard];
vs = Range[8];
m = mm /@ vs;
section =
Thread[m ->
p0 + {x, y, z}.Orthogonalize[{p1 - p0, p2 - p0, p3 - p0}]];
cons = And @@ Thread[invHad.m >= 0 /. section];
eqs = Apply[Equal, List @@@ Subsets[cons, {3}], {2}];
sols = Flatten[{x, y, z} /. Table[Solve[eq, {x, y, z}], {eq, eqs}],
1]; // Quiet
pts = Select[sols, And @@ (NumericQ /@ #) &];
ptPic = Graphics3D[{PointSize[Large], Point[pts]}];
regionPic =
RegionPlot3D[cons, {x, -2, 2}, {y, -2, 2}, {z, -2, 2},
PlotPoints -> 40];
Show[{regionPic, ptPic}]
Таким образом, есть точки, которые в конечном итоге отсекаются плоскостью, определяемой некоторым другим ограничением.Вот один (я уверен, ужасно неэффективный) способ найти те, которые вы хотите.
regionPts = regionPic[[1, 1]];
nf = Nearest[regionPts];
trimmedPts = Select[pts, Norm[# - nf[#][[1]]] < 0.2 &];
trimmedPtPic = Graphics3D[{PointSize[Large], Point[trimmedPts]}];
Show[{regionPic, trimmedPtPic}]
Таким образом, вы можете использовать выпуклый корпус trimmedPts.В конечном итоге это зависит от результата RegionPlot, и вам может потребоваться увеличить значение PlotPoints, чтобы сделать его более надежным.
Гугление немного раскрывает концепцию области осуществимости в линейном программировании.Кажется, это именно то, что вам нужно.
Mark