كيف يمكنني رسم قائمة تم إرجاعها بواسطة حل الرياضيات إلى معادلات عدد صحيح محدودة
-
14-11-2019 - |
سؤال
لذلك لدي مجموعة من المعادلات ديوفانتين يحدها التي تحدد خطوط على متن الطائرة.أريد أن أجعل الرياضيات مؤامرة تقاطع اثنين من هذه المعادلات حتى أستطيع أن أرى ما تبدو عليه.
حتى الآن لدي شيء مثل:
حل [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]}]
للحصول على الإخراج التالي
يمكنك تحسينه باستخدام العديد من خيارات التصميم وخيارات أخرى من ListPlot
.على سبيل المثال ، يمكنك الانضمام إلى النقاط
ListPlot[data, PlotMarkers -> {Style["\[FilledSquare]", FontSize -> 16]},
Joined -> True]
للحصول على
تحرير:للعب مع وضع علامة وحجم هناك العديد من البدائل.باستخدام 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
, ، وإلا فإن الخطوط التي تربط النقاط يتم تغطيتها بواسطة العلامات.كلا البديلين ينتجان الناتج التالي:
بدلا من ذلك ، يمكنك استخدام 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.