كيف يمكنني رسم قائمة تم إرجاعها بواسطة حل الرياضيات إلى معادلات عدد صحيح محدودة

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

سؤال

لذلك لدي مجموعة من المعادلات ديوفانتين يحدها التي تحدد خطوط على متن الطائرة.أريد أن أجعل الرياضيات مؤامرة تقاطع اثنين من هذه المعادلات حتى أستطيع أن أرى ما تبدو عليه.

حتى الآن لدي شيء مثل:

حل [0 < إكس واي < 3 && -1 < 2 س ص < 2 ، {س ، ص} ، الأعداد الصحيحة]

الذي يعود بعض هيكل مثل:

{{س - > -2 ، ص - > -4} ، {س - > -1 ، ص - > -3} ، {س - > -1 ، ص - > -2} ، {س - > 0, ص - > -1}}

لكن كيف يمكنني الآن أن أجعل ماثيماتيكا يرسم هذا حتى أتمكن من رؤية الشكل الناتج.ويفضل أن أود المؤامرة للنظر في كل 'نقطة' لتكون 1 1 مربع.

أيضا ، أتساءل عما إذا كانت هناك طريقة أفضل للقيام بمثل هذه الأشياء.شكرا.

هل كانت مفيدة؟

المحلول

حدد البيانات التي ترغب في رسمها عن طريق تحويل القائمة Solve[] العودة.يمكن القيام بذلك على النحو التالي

 data = {x, y} /. Solve[0 < x - y < 3 && -1 < 2 x - y < 2, {x, y}, Integers]

بشكل عام ، يمكنك جعل Solve قم بإرجاع الحل بتنسيق قائمة (بدلا من مجموعة من القواعد) باستخدام الحيلة التالية:

 data = Solve[0 < x - y < 3 && -1 < 2 x - y < 2, {x, y}, Integers] /. Rule[a_,b_]->b

للتآمر ، من بين العديد من البدائل ، يمكنك استخدام ListPlot كما

ListPlot[data, PlotMarkers -> {Style["\[FilledSquare]", FontSize -> 16]}]

للحصول على الإخراج التالي

output image

يمكنك تحسينه باستخدام العديد من خيارات التصميم وخيارات أخرى من ListPlot.على سبيل المثال ، يمكنك الانضمام إلى النقاط

ListPlot[data, PlotMarkers -> {Style["\[FilledSquare]", FontSize -> 16]}, 
 Joined -> True]

للحصول على

joined plot

تحرير:للعب مع وضع علامة وحجم هناك العديد من البدائل.باستخدام ListPlot يمكنك الحصول على ما تحتاجه في أي من الطريقتين:

 (* 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}

في كلتا الحالتين ، تحتاج إلى استخدام Epilog, ، وإلا فإن الخطوط التي تربط النقاط يتم تغطيتها بواسطة العلامات.كلا البديلين ينتجان الناتج التالي:

listplot with markers

بدلا من ذلك ، يمكنك استخدام Graphics, RegionPlot, ContourPlot, BubbleChart مع التحولات المناسبة من data للحصول على نتائج مماثلة لتلك الموجودة في ListPlot الإخراج أعلاه.

باستخدام الأوليات الرسومات:

 (* 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}

باستخدام بوبليشارت:

 (* 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}

باستخدام المنطقة:

 (* 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}

باستخدام كونتوربلوت:

 (* 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}

نصائح أخرى

قد يكون giveacodicetagpre.

أدخل وصف الصورة هنا

يمكن أيضا استخراج النقاط للمصورة باستخدام giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top