J'ai des systèmes linéaires d'inégalités dans 3 variables et j'aimerais tracer ces régions. Idéalement, j'aimerais quelque chose qui ressemble à des objets dans PolyhedronData. J'ai essayé RegionPlot3D, mais les résultats sont visuellement pauvres et trop polygone lourd pour tourner en temps réelTracer les inégalités linéaires dans Mathematica
Voici ce que je veux dire, le code ci-dessous génère 10 ensembles de contraintes linéaires et les parcelles
randomCons := Module[{}, hadamard = KroneckerProduct @@ Table[{{1, 1}, {1, -1}}, {3}]; invHad = Inverse[hadamard]; vs = Range[8]; m = mm /@ vs; sectionAnchors = Subsets[vs, {1, 7}]; randomSection := Mean[hadamard[[#]] & /@ #] & /@ Prepend[RandomChoice[sectionAnchors, 3], vs]; {p0, p1, p2, p3} = randomSection; section = Thread[m -> p0 + {x, y, z}.Orthogonalize[{p1 - p0, p2 - p0, p3 - p0}]]; And @@ Thread[invHad.m >= 0 /. section] ]; Table[RegionPlot3D @@ {randomCons, {x, -3, 3}, {y, -3, 3}, {z, -3, 3}}, {10}]
Toutes les suggestions ?
Mise à jour: L'intégration des suggestions ci-dessous, voici la version que je fini par utiliser pour tracer la région réalisable d'un système d'inégalités linéaires
(* Plots feasible region of a linear program in 3 variables, \ specified as cons[[1]]>=0,cons[[2]]>=0,... Each element of cons must \ be an expression of variables x,y,z only *) plotFeasible3D[cons_] := Module[{maxVerts = 20, vcons, vertCons, polyCons}, (* find intersections of all triples of planes and get rid of \ intersections that aren't points *) vcons = Thread[# == 0] & /@ Subsets[cons, {3}]; vcons = Select[vcons, Length[Reduce[#]] == 3 &]; (* Combine vertex constraints with inequality constraints and find \ up to maxVerts feasible points *) vertCons = Or @@ (And @@@ vcons); polyCons = And @@ Thread[cons >= 0]; verts = {x, y, z} /. FindInstance[polyCons && vertCons, {x, y, z}, maxVerts]; ComputationalGeometry`Methods`ConvexHull3D[verts, Graphics`Mesh`FlatFaces -> False] ]
code pour tester
randomCons := Module[{}, hadamard = KroneckerProduct @@ Table[{{1, 1}, {1, -1}}, {3}]; invHad = Inverse[hadamard]; vs = Range[8]; m = mm /@ vs; sectionAnchors = Subsets[vs, {1, 7}]; randomSection := Mean[hadamard[[#]] & /@ #] & /@ Prepend[RandomChoice[sectionAnchors, 3], vs]; {p0, p1, p2, p3} = randomSection; section = Thread[m -> p0 + {x, y, z}.Orthogonalize[{p1 - p0, p2 - p0, p3 - p0}]]; And @@ Thread[invHad.m >= 0 /. section] ]; Table[plotFeasible3D[List @@ randomCons[[All, 1]]], {50}];
Merci, ça a l'air vraiment sympa! Je pense que j'ai une idée de comment se débarrasser des lignes supplémentaires sur les visages, mettra à jour mon poste dans un peu –
@ Yaroslav l'a trouvé. Il y a une option là-bas. Voir edit –
@Yaroslav Les solutions dégénérées sont-elles un problème pour vous? Votre eq. le système génère parfois des cylindres infinis (je n'ai pas vérifié si aussi les plans et les points isolés) –