สถานที่น่าสนใจของแผนที่โลจิสติก


21

จุดประสงค์ของการท้าทายคือการวางแผนการดึงดูดของโลจิสติกแผนที่เป็นฟังก์ชันของพารามิเตอร์r (เรียกอีกอย่างว่าแผนภาพสองแฉก ) หรือ subregion ของมัน การปรากฏตัวของกราฟสามารถเห็นได้ในภาพต่อไปนี้จาก Wikipedia:

ป้อนคำอธิบายรูปภาพที่นี่

พื้นหลัง

แผนที่โลจิสติกเป็นฟังก์ชั่นทางคณิตศาสตร์ที่ใช้ใส่x kและแผนที่มันออกx + 1 kกำหนดให้เป็น

             x k + 1 = r x k (1− x k )

โดยที่rคือพารามิเตอร์ของแผนที่สันนิษฐานว่าอยู่ในช่วงเวลา [0, 4]

ได้รับRใน [0,4] และค่าเริ่มต้นx 0ในช่วง [0,1] มันน่าสนใจที่จะซ้ำ ๆ ใช้ฟังก์ชั่นสำหรับจำนวนมากยังไม่มีข้อความซ้ำการผลิตค่าสุดท้ายx N โปรดทราบว่าx Nจะต้องอยู่ใน [0,1] ด้วย

เป็นตัวอย่างให้พิจารณาr = 3.2, N = 1,000 ค่าเริ่มต้นx 0 = 0.01 ให้x 1000 = 0.5130 สำหรับx 0 = 0.02 ผลลัพธ์คือx 0 = 0.7995 สำหรับการใด ๆค่าเริ่มต้นอื่น ๆx 0ค่าสุดท้ายx 1000เป็นอย่างมากใกล้กับอย่างใดอย่างหนึ่งหรือ 0.5130 0.7995 นี่คือกราฟในความสูงของทั้งสองเส้นที่ตำแหน่งแนวนอนr = 3.2

นี่ไม่ได้หมายความว่าสำหรับr = 3.2 แต่ละลำดับจะรวมกันเป็นหนึ่งในสองค่า ในความเป็นจริงสำหรับค่าเริ่มต้นสองค่าที่พิจารณาข้างต้นลำดับคือ (สังเกตพฤติกรรมการสั่น):

             x 0 = 0.01, ... , x 1000 = 0.5130, x 1001 = 0.7995, x 1002 = 0.5130, ...
             x 0 = 0.02, ... , x 1000 = 0.7995, x 1001 = 0.5130, x 1002 = 0.7995 , ...

สิ่งที่เป็นความจริงเป็นที่สำหรับขนาดใหญ่พอNและสำหรับค่าเกือบทั้งหมดเริ่มต้นx 0คำx Nจะใกล้เคียงกับหนึ่งในองค์ประกอบของชุด {0.5130, 0.7995} ชุดนี้เรียกว่าตัวดึงดูดสำหรับrเฉพาะนี้

สำหรับค่าอื่น ๆ ของพารามิเตอร์rขนาดของชุด atractor หรือองค์ประกอบจะเปลี่ยนไป กราฟแปลงองค์ประกอบใน attractor สำหรับแต่ละR

attractor สำหรับเฉพาะRสามารถประมาณโดย

  1. การทดสอบค่าเริ่มต้นที่หลากหลายx 0 ;
  2. การปล่อยให้ระบบวิวัฒนาการสำหรับการทำซ้ำNจำนวนมาก และ
  3. จดบันทึกค่าสุดท้ายx Nที่ได้รับ

ความท้าทาย

ปัจจัยการผลิต

  • N : จำนวนการวนซ้ำ

  • R 1 , R 2และs สิ่งเหล่านี้กำหนดค่า Rของค่าของ rคือ R = { r 1 , r 1 + s , r 1 + 2 s , ... , r 2 }

ขั้นตอน

ชุดXของค่าเริ่มต้นx 0ได้รับการแก้ไข: X = {0.01, 0.02, ... , 0,99} เลือก 0 และ 1 นอกจากนี้ยังอาจจะรวมอยู่ในX

สำหรับแต่ละRในRและแต่ละx 0ในX , ย้ำโลจิสติกแผนที่Nครั้งเพื่อผลิตx N บันทึกสิ่งอันดับที่ได้รับ ( r , x N )

เอาท์พุต

พล็อตแต่ละ tuple ( r , x N ) เป็นจุดในระนาบที่มีrเป็นแกนนอนและx Nเป็นแกนตั้ง ผลลัพธ์ควรเป็นกราฟิก (ไม่ใช่ศิลปะ ASCII)

กฎเพิ่มเติม

  • โพรซีเดอร์ที่ระบุกำหนดผลลัพธ์ที่ต้องการ แต่ไม่ได้บังคับใช้ ขั้นตอนอื่นใดที่ procudes ชุดtuples ( r , x N ) เดียวกันสามารถใช้งานได้
  • อินพุตมีความยืดหยุ่นตามปกติ
  • ข้อผิดพลาดของคะแนนลอยจะไม่ถูกเก็บไว้กับผู้ตอบ
  • จำเป็นต้องใช้เอาต์พุตกราฟิกในรูปแบบที่ยอมรับได้ โดยเฉพาะอย่างยิ่งเอาต์พุตอาจแสดงบนหน้าจอหรืออาจสร้างไฟล์กราฟิกหรืออาร์เรย์ของค่า RGB อาจถูกส่งออก หากการส่งออกไฟล์หรืออาร์เรย์กรุณาโพสต์ตัวอย่างของสิ่งที่ดูเหมือนว่าเมื่อแสดง
  • กราฟิกอาจเป็นแบบเวกเตอร์หรือแรสเตอร์ สำหรับกราฟิกแรสเตอร์ขนาดของภาพควรมีอย่างน้อย 400 × 400 พิกเซล
  • แต่ละจุดควรแสดงเป็นพิกเซลเดียวหรือเป็นเครื่องหมายที่มีขนาดตามลำดับของหนึ่งพิกเซล (ไม่เช่นนั้นกราฟก็จะรกอย่างรวดเร็ว)
  • ช่วงแกนควรเป็น [0,4] สำหรับr (แกนนอน) และ [0,1] สำหรับx N (แกนแนวตั้ง); หรืออาจมีขนาดเล็กลงตราบใดที่มีคะแนนทั้งหมดที่ได้รับ
  • แกนสเกลนั้น โดยเฉพาะอย่างยิ่งขนาดไม่จำเป็นต้องเหมือนกันสำหรับทั้งสองแกน
  • เส้นกริดป้ายชื่อแกนสีและองค์ประกอบที่คล้ายคลึงกันเป็นที่ยอมรับ แต่ไม่จำเป็น
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

คลิกที่ภาพแต่ละภาพสำหรับรุ่นความละเอียดสูง

N = 1000; r1 = 2.4; r2 = 4; s = 0.001;

ป้อนคำอธิบายรูปภาพที่นี่

N = 2000; r1 = 3.4; r2 = 3.8; s = 0.0002;

ป้อนคำอธิบายรูปภาพที่นี่

N = 10000; r1 = 3.56; r2 = 3.59; s = 0.00002;

ป้อนคำอธิบายรูปภาพที่นี่

การรับทราบ

ขอบคุณ@FryAmTheEggmanและ@AndrasDeakสำหรับความคิดเห็นที่เป็นประโยชน์ขณะที่ความท้าทายอยู่ในกล่องทราย


อะไรที่ไม่มีทางออกของงูหลาม?!

@ Lembik ฉันมีการใช้งานอ้างอิงใน Python (และใน Matlab) แต่ฉันไม่ต้องการที่จะตอบตัวเอง
Luis Mendo

คุณได้รับอนุญาตให้ตอบคำถามของคุณใน PPCG (อาจแปลกใจ)

@ Lembik ฉันรู้ แต่ฉันต้องการคำตอบของคนอื่นมากกว่า
Luis Mendo

คำตอบ:


13

MATL, 32 30 28 27 ไบต์

บันทึกได้ 4 ไบต์ด้วย @Luis

3$:0:.01:1!i:"tU-y*]'.'3$XG

รูปแบบการป้อนข้อมูลเป็นr1, s, r2และN

ลองใช้ที่MATL Online

ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย

        % Implicitly grab the first three inputs
3$:     % Take these three inputs and create the array [r1, r1+s, ...]
0:.01:1 % [0, 0.01, 0.02, ... 1]
!       % Transpose this array
i       % Implicitly grab the input, N
:"      % For each iteration
  tU    % Duplicate and square the X matrix
  -     % Subtract from the X matrix (X - X^2) == x * (1 - x)
  y     % Make a copy of R array
  *     % Multiply the R array by the (X - X^2) matrix to yield the new X matrix
]       % End of for loop
'.'    % Push the string literal '.' to the stack (specifies that we want
        % dots as markers)
3$XG    % Call the 3-input version of PLOT to create the dot plot

8

Mathematica, 65 ไบต์

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&

ฟังก์ชั่นแท้รับอาร์กิวเมนต์ N, r1, r2, s ในลำดับที่ Nest[r#(1-#)&,x,N]iterates ฟังก์ชั่นโลจิสติกr#(1-#)&รวมเป็นNเวลาเริ่มต้นที่x; นี่คืออาร์กิวเมนต์แรกของฟังก์ชัน ( #) คือNคำถาม; Point@{r,...}ผลิตPointที่Graphicsจะมีความสุขในการพล็อต Table[...,{x,0,1,.01},{r,##2}]สร้างทั้งกลุ่มของจุดเหล่านี้มีxค่าวิ่งออกมาจาก0การ1เพิ่มขึ้นครั้งละ.01; ##2ใน{r,##2}หมายถึงทั้งหมดของการขัดแย้งฟังก์ชั่นเดิมที่เริ่มต้นจากคนที่สองและเพื่อ{r,##2}ขยายการที่ถูกต้องกำหนดช่วงและเพิ่มขึ้นสำหรับ{r,r1,r2,s}r

เอาต์พุตตัวอย่างในกรณีทดสอบที่สอง: อินพุต

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&[2000,3.4,3.8,0.0002]

ให้กราฟิกด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่


1
59 bytes ListPlot @ Table [{r, Nest [r # (1 - #) &, x, #]}, {x, 0,1, .01}, {r, ## 2}] &
J42161217

ฉันได้ชี้แจงในสิ่งที่ท้าทายว่าขั้นตอนที่ระบุนั้นหมายถึงการกำหนดผลลัพธ์ที่ต้องการ แต่ตัวกระบวนการเองไม่ได้ถูกบังคับใช้ คุณสามารถใช้ขั้นตอนอื่นใดก็ได้ที่ให้ผลลัพธ์เหมือนกัน ขออภัยหากยังไม่ชัดเจนในตอนแรก
หลุยส์เมนโด

ไม่ใช่ปัญหาเรามีคำตอบที่ดีหลายอย่าง!
Greg Martin

1
คุณจะไม่ใช้ -6 ไบต์เหล่านั้นหรือ คุณคิดว่า somathing ผิดกับวิธีนี้หรือไม่?
J42161217

โอ้ฉันคิดว่าคำตอบของคุณคือการโพสต์ของ (รุ่น) รหัสจากความคิดเห็นของคุณ ....
เกร็กมาร์ติน

5

Mathematica, 65 ไบต์

ฉันใช้กลอุบายของ Greg Martin และนี่เป็นรุ่นของฉันโดยไม่ใช้กราฟิก

ListPlot@Table[{r,NestList[#(1-#)r&,.5,#][[-i]]},{i,99},{r,##2}]&

อินพุต

[1,000, 2.4, 4, 0.001]

เอาท์พุต

ป้อนคำอธิบายรูปภาพที่นี่

อินพุต

[2000, 3.4, 3.8, 0.0002]

เอาท์พุต

ป้อนคำอธิบายรูปภาพที่นี่


1
คำตอบแรกที่เลือกที่จะหลีกเลี่ยงค่าเริ่มต้น 0 หรือ 1 (และx = 0 บรรทัดที่พวกเขาสร้าง) :-)
Luis Mendo

คุณควรเพิ่มคำอธิบายว่าโค้ดของคุณทำอะไรเพราะไม่ปฏิบัติตามขั้นตอนที่ระบุ OP สามารถตัดสินใจได้ว่าผลลัพธ์ที่ดูแม่นยำนั้นจะปรับวิธีการอื่นหรือไม่
Greg Martin

ขั้นตอนที่ระบุไม่ได้ถูกบังคับใช้ อนุญาตสิ่งใดก็ตามที่ให้ผลลัพธ์เดียวกันโดยวิธีอื่นใด (ฉันจะอธิบายอย่างชัดเจน) ไม่ว่าจะทำเช่นไรฉันอยากรู้ว่าจะเห็นคำอธิบายอย่างไร
Luis Mendo

จุดที่คุณต้องพล็อตสำหรับทุก r มีอยู่แล้วใน "Nest" ทุกครั้ง นี่คือรหัสต้นฉบับและเป็นแนวทางแรกของฉัน (เมื่อครู่ก่อน) ในการวางแผนแผนภาพนี้
J42161217

@ Luis Mendo ฉันมีรุ่นที่สั้นกว่า (ซึ่งสร้างสถิติสำหรับ mathematica) .58 ไบต์ แต่คุณต้องป้อนเพียง 3 อินพุต [N, r1, r2] ต้องใช้เวลา แต่ใช้งานได้ดีตาราง [NestList [# ( 1 - #) r & ,. 5, #] [[- i]], {i, 99}], {r, ## 2}] &
J42161217

2

TI-Basic, 85ไบต์

Prompt P,Q,S,N
P→Xmin:Q→Xmax
0→Ymin:1→Ymax
For(W,.01,1,.01
For(R,P,Q,S
W→X
For(U,1,N
R*X*(1-X→X
End
Pt-On(R,X
End
End

โปรแกรม TI-Basic ที่สมบูรณ์ซึ่งรับอินพุตตามลำดับr1,r2,s,Nจากนั้นแสดงเอาต์พุตแบบเรียลไทม์บนหน้าจอกราฟ โปรดทราบว่านี้มีแนวโน้มที่จะไม่น่าเชื่อช้า

นี่คือผลลัพธ์ตัวอย่างที่ไม่สมบูรณ์ที่สร้างขึ้นหลังจากนั้นประมาณ 2.5 ชั่วโมงสำหรับอินพุต3,4,0.01,100:

ป้อนคำอธิบายรูปภาพที่นี่


คุณไม่ต้องการ*สัญญาณ
lirtosiast

1

กำลังประมวลผล JS, 125 123 120 ไบต์

ขอบคุณKritixi Lithosสำหรับการบันทึก 3 ไบต์

var f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;p<=r;p+=s){x=i;for(j=0;j<n;j++)x*=p-p*x;point(p*1e3,1e3-x*1e3)}}

ลองออนไลน์! โทรโดยใช้f(N, r_1, r_2, s);


ฉันคิดว่าคุณสามารถแทนที่voidด้วยvarเพราะมันกำลังประมวลผลJS
Kritixi Lithos

และx*=p*(1-x)สามารถกลายเป็นx*=p-p*x
Kritixi Lithos

โดยการจัดเรียง for-loop ฉันจะได้รับvar f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;x=i,p<=r;point(p*1e3,1e3-x*1e3),p+=s)for(j=0;j<n;j++)x*=p-p*x;}ที่ 119 bytes
Kritixi Lithos

1

GEL , 158 ไบต์

`(N,r,t,s)=(LinePlotWindow=[r,t,0,1];for i=r to t by s do(p=.;for w=0to 1by 0.01do(x=w;for a=0to N do(x=i*x*(1-x););p=[p;q=[i,x]];);LinePlotDrawPoints(p);););

มันอาจจะไม่สั้นที่สุด แต่ก็ดึงในเวลาจริงแม้ว่ามันจะช้าอย่างไม่น่าเชื่อกับอินพุตขนาดใหญ่ อย่างไรก็ตามนี่เป็นฟังก์ชั่นที่ไม่ระบุชื่อซึ่งรับอินพุตในรูปแบบ(N,r1,r2,s)และแสดงผลพล็อตในหน้าต่างใหม่ โปรดทราบว่าสิ่งนี้จะต้องทำงานกับ Genius รุ่น GNOME

ตัวอย่างผลลัพธ์


1

R, 159 147 ไบต์

pryr::f({plot(NA,xlim=c(a,b),ylim=0:1);q=function(r,n,x=1:99/100){for(i in 1:n)x=r*x*(1-x);x};for(i in seq(a,b,s))points(rep(i,99),q(i,n),cex=.1)})

ผลิตภัณฑ์ใดทำหน้าที่ได้

function (a, b, n, s) 
{
    plot(NA, xlim = c(a, b), ylim = 0:1)
    q = function(r, n, x = 1:99/100) {
        for (i in 1:n) x = r * x * (1 - x)
        x
    }
    for (i in seq(a, b, s)) points(rep(i, 99), q(i, n), cex = 0.1)
}

plot(NA,...)สร้างผืนผ้าใบว่างเปล่าที่มีขนาดที่ถูกต้อง qเป็นฟังก์ชั่นที่ทำการวนซ้ำ มันต้องใช้เวลาค่าของrแล้วไม่nซ้ำสำหรับทุกจุดเริ่มต้นระหว่างและ0.01 0.99จากนั้นจะส่งคืนเวกเตอร์ที่ได้

for-loop ใช้ฟังก์ชันqกับลำดับaที่จะมีขั้นตอนb sแทนที่จะคืนค่ามันจะเพิ่มพวกเขาเป็นจุดไปยังพล็อต หากจุดดึงดูดคือค่าเดียวคะแนนทั้งหมดจะทับซ้อนกันและแสดงเป็นจุดเดียว cex=.1เป็นการเพิ่มที่จำเป็นเพื่อให้คะแนนมีขนาดเล็กที่สุด

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.