Wie kann ich eine von der Mathematica-Lösung zurückgegebene Liste in beschränkte ganzzahlige Gleichungen zeichnen
-
14-11-2019 - |
Frage
Ich habe also eine Reihe begrenzter diophantischer Gleichungen, die Linien in der Ebene spezifizieren.Ich möchte, dass Mathematica den Schnittpunkt von zwei dieser Gleichungen zeichnet, damit ich sehen kann, wie sie aussehen.
Bisher habe ich so etwas wie:
Löse[0 < x - y < 3 && -1 < 2 x - y < 2, {x, y}, Ganze Zahlen]
was eine Struktur zurückgibt wie:
{{x -> 2, y -> 4}, {x -> 1, y -> 3}, {x -> 1, y -> 2}, {x -> 0, und -> -1}}
aber wie kann ich Mathematica jetzt dazu bringen, dies zu zeichnen, damit ich die resultierende Form sehen kann.Vorzugsweise möchte ich, dass die Handlung jeden 'Punkt' als ein 1x1-Quadrat betrachtet.
Ich frage mich auch, ob es einen besseren Weg gibt, solche Dinge zu tun.Danke.
Lösung
Definieren Sie die Daten, die Sie zeichnen möchten, indem Sie die Liste transformieren Solve[]
zurückgeben.Dies kann wie folgt erfolgen
data = {x, y} /. Solve[0 < x - y < 3 && -1 < 2 x - y < 2, {x, y}, Integers]
Allgemeiner können Sie machen Solve
geben Sie die Lösung mit dem folgenden Trick in einem Listenformat (und nicht als Regelsatz) zurück:
data = Solve[0 < x - y < 3 && -1 < 2 x - y < 2, {x, y}, Integers] /. Rule[a_,b_]->b
Zum Plotten können Sie unter vielen Alternativen verwenden ListPlot
als
ListPlot[data, PlotMarkers -> {Style["\[FilledSquare]", FontSize -> 16]}]
um die folgende Ausgabe zu erhalten
Sie können es mit vielen Styling- und anderen Optionen von weiter verfeinern ListPlot
.Zum Beispiel können Sie die Punkte verbinden
ListPlot[data, PlotMarkers -> {Style["\[FilledSquare]", FontSize -> 16]},
Joined -> True]
bekommen
BEARBEITEN:Um mit der Platzierung und Größe der Marker zu spielen, gibt es mehrere Alternativen.Wobei ListPlot
sie können auf eine der beiden Arten bekommen, was Sie brauchen:
(* Alternative 1: use fontsize to change the marker size *)
lp1 := ListPlot[{#} & /@ #1,
PlotMarkers -> {Style["\[FilledSquare]", FontSize -> Scaled[#2]]},
AspectRatio -> 1, AxesOrigin -> {0, 0},
PlotRange -> {{-5, 1}, {-5, 1}},
PlotStyle -> Hue /@ RandomReal[1, {Length@#1}],
Epilog -> {GrayLevel[.3], PointSize[.02], Point@#1, Thick,
Line@#1}, Frame -> True, FrameTicks -> All] &;
(* usage example *)
lp1 @@ {data, .30}
(* Alternative 2: use the second parameter of PlotMarkers to control scaled size *)
lp2 := ListPlot[{#} & /@ #1,
PlotMarkers -> {Graphics@{Rectangle[]}, #2}, AspectRatio -> 1,
AxesOrigin -> {0, 0}, PlotRange -> {{-5, 1}, {-5, 1}},
PlotStyle -> Hue /@ RandomReal[1, {Length@#1}],
Epilog -> {GrayLevel[.3], PointSize[.02], Point@#1, Thick,
Line@#1}, Frame -> True, FrameTicks -> All] &
(* usage example *)
lp2 @@ {data, 1/5.75}
In beiden Fällen müssen Sie verwenden Epilog
, andernfalls werden die Linienverbindungspunkte durch die Markierungen verdeckt.Beide Alternativen erzeugen die folgende Ausgabe:
Alternativ können Sie verwenden Graphics
, RegionPlot
, ContourPlot
, BubbleChart
mit entsprechenden Transformationen von data
um ähnliche Ergebnisse wie in zu erzielen ListPlot
ausgabe oben.
Verwenden von Grafikprimitiven:
(* data transformation to define the regions *)
trdataG[data_, size_] := data /. {a_, b_} :>
{{a - size/2, b - size/2}, {a + size/2, b + size/2}};
(* plotting function *)
gr := Graphics[
{
{Hue[RandomReal[]], Rectangle[##]} & @@@ trdataG @@ {#1, #2},
GrayLevel[.3], PointSize[.02], Thick, Point@#1, Line@#1},
PlotRange -> {{-5, 1}, {-5, 1}
},
PlotRangePadding -> 0, Axes -> True, AxesOrigin -> {0, 0},
Frame -> True, FrameTicks -> All] &
(* usage example *)
gr @@ {data, .99}
Verwenden von BubbleChart:
(* Transformation of data to a form that BubbleChart expects *)
dataBC[data_] := data /. {a_, b_} :> {a, b, 1};
(* custom markers *)
myMarker[size_][{{xmin_, xmax_}, {ymin_, ymax_}}, ___] :=
{EdgeForm[], Rectangle[{(1/2) (xmin + xmax) - size/2, (1/2) (ymin + ymax) -
size/2}, {(1/2) (xmin + xmax) + size/2, (1/2) (ymin + ymax) + size/2}]};
(* charting function *)
bc := BubbleChart[dataBC[#1], ChartElementFunction -> myMarker[#2],
ChartStyle -> Hue /@ RandomReal[1, {Length@#1}], Axes -> True,
AxesOrigin -> {0, 0}, PlotRange -> {{-5, 1}, {-5, 1}},
PlotRangePadding -> 0, AspectRatio -> 1, FrameTicks -> All,
Epilog -> {GrayLevel[.3], PointSize[.02], Point@#1, Thick, Line@#1}] &
(* usage example *)
bc @@ {data, .99}
Verwenden von RegionPlot:
(* Transformation of data to a form that RegionPlot expects *)
trdataRP[data_, size_] := data /. {a_, b_} :>
a - size/2 <= x <= a + size/2 && b - size/2 <= y <= b + size/2
(* charting function *)
rp := RegionPlot[Evaluate@trdataRP[#1, #2], {x, -5, 1}, {y, -5, 1},
AspectRatio -> 1, Axes -> True, AxesOrigin -> {0, 0},
PlotRange -> {{-5, 1}, {-5, 1}},
PlotStyle -> Hue /@ RandomReal[1, {Length@#1}], FrameTicks -> All,
PlotPoints -> 100, BoundaryStyle -> None,
Epilog -> {GrayLevel[.3], PointSize[.02], Point@#1, Thick, Line@#1}] &
(* usage example *)
rp @@ {data, .99}
Konturplot verwenden:
(* Transformation of data to a form that ContourPlot expects *)
trdataRP[data_, size_] := data /. {a_, b_} :>
a - size/2 <= x <= a + size/2 && b - size/2 <= y <= b + size/2;
trdataCP[data_, size_] := Which @@ Flatten@
Thread[{trdataRP[data, size], Range@Length@data}];
(* charting function *)
cp := ContourPlot[trdataCP[#1, #2], {x, -5, 1}, {y, -5, 1},
AspectRatio -> 1, Axes -> True, AxesOrigin -> {0, 0},
PlotRange -> {{-5, 1}, {-5, 1}}, FrameTicks -> All,
ExclusionsStyle -> None, PlotPoints -> 100,
ColorFunction -> Hue,
Epilog -> {GrayLevel[.3], PointSize[.02], Point@#1, Thick, Line@#1}] &
(* usage example *)
cp @@ {data, .99}
Andere Tipps
kann sein generasacodicetagpre.
kann auch die Punkte zum Plot mit extrahieren generasacodicetagpre.