Wie kann ich eine von der Mathematica-Lösung zurückgegebene Liste in beschränkte ganzzahlige Gleichungen zeichnen

StackOverflow https://stackoverflow.com/questions/9011923

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.

War es hilfreich?

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

output image

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

joined plot

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:

listplot with markers

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.

Bildbeschreibung eingeben hier

kann auch die Punkte zum Plot mit extrahieren generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top