Sự hấp dẫn kỳ lạ của bản đồ logistic


21

Mục đích của thử thách là xấp xỉ cốt truyện rất thu hút khách của các bản đồ hậu cần là một hàm của tham số của nó r (còn gọi là sơ đồ phân nhánh ), hoặc một tiểu vùng của nó. Sự xuất hiện của biểu đồ có thể được nhìn thấy trong hình ảnh sau đây từ Wikipedia:

nhập mô tả hình ảnh ở đây

Lý lịch

Các bản đồ hậu cần là một hàm toán học mà phải mất một đầu vào x k và bản đồ nó vào một đầu ra x k + 1 định nghĩa là

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

Trong đó rtham số của bản đồ, được cho là nằm trong khoảng [0, 4].

Với r trong [0,4], và một giá trị ban đầu x 0 trong khoảng [0,1], nó là thú vị để liên tục áp dụng các chức năng cho một số lượng lớn N lần lặp lại, tạo ra một giá trị cuối cùng x N . Lưu ý rằng x N cũng nhất thiết phải nằm trong [0,1].

Ví dụ, xem xét r = 3.2, N = 1000. Giá trị ban đầu x 0 = 0,01 cho x 1000 = 0,5130. Với x 0 = 0,02 kết quả là x 0 = 0,7995. Đối với bất kỳ giá trị ban đầu nào khác x 0, các giá trị cuối cùng x 1000 rất gần với 0,5130 hoặc 0,7995. Điều này được nhìn thấy trong biểu đồ là chiều cao của hai đường ở vị trí nằm ngang r = 3.2.

Điều này không có nghĩa là với r = 3.2, mỗi chuỗi hội tụ đến một trong hai giá trị đó. Trong thực tế, đối với hai giá trị ban đầu được xem xét ở trên, các chuỗi là (lưu ý hành vi dao động):

             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 , ...

Có gì đúng là cho đủ lớn N , và cho hầu hết các giá trị ban đầu x 0 , thuật ngữ x N sẽ được gần gũi với một trong những yếu tố của tập {0,5130, 0,7995}. Bộ này được gọi là bộ thu hút cho r cụ thể này .

Đối với các giá trị khác của tham số r , kích thước của bộ điều khiển, hoặc các phần tử của nó, sẽ thay đổi. Biểu đồ vẽ các phần tử trong bộ thu hút cho mỗi r .

Người thu hút cho một r cụ thể có thể được ước tính bởi

  1. kiểm tra một loạt các giá trị ban đầu x 0 ;
  2. để hệ thống phát triển cho một số lượng lớn N lần lặp; và
  3. lưu ý các giá trị cuối cùng x N thu được.

Các thách thức

Đầu vào

  • N : số lần lặp.

  • r 1 , r 2 s . Chúng xác định tập R các giá trị của r , cụ thể là R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.

Thủ tục

Tập X của các giá trị ban đầu x 0 được cố định: X = {0,01, 0,02, ..., 0,99}. Tùy chọn, 0 và 1 cũng có thể được bao gồm trong X .

Đối với mỗi r trong R và mỗi x 0 trong X , lặp logistic đồ N lần để sản x N . Ghi lại các bộ dữ liệu thu được ( r , x N ).

Đầu ra

Vẽ mỗi tuple ( r , x N ) là một điểm trong mặt phẳng với r là trục hoành và x N là trục tung. Đầu ra phải là đồ họa (không phải nghệ thuật ASCII).

Quy tắc bổ sung

  • Quy trình được chỉ định xác định kết quả được yêu cầu, nhưng không được thi hành. Bất kỳ thủ tục nào khác có thể sử dụng cùng một bộ các bộ dữ liệu ( r , x N ).
  • Đầu vào linh hoạt như bình thường.
  • Lỗi dấu phẩy động sẽ không được tổ chức đối với người trả lời.
  • Đầu ra đồ họa là bắt buộc, trong bất kỳ định dạng được chấp nhận . Cụ thể, đầu ra có thể được hiển thị trên màn hình hoặc một tệp đồ họa có thể được tạo ra hoặc một mảng các giá trị RGB có thể được xuất ra. Nếu xuất ra một tập tin hoặc một mảng, xin vui lòng gửi một ví dụ về những gì nó trông giống như khi hiển thị.
  • Đồ họa có thể là vector hoặc raster. Đối với đồ họa raster, kích thước của hình ảnh tối thiểu phải là 400 × 400 pixel.
  • Mỗi điểm phải được hiển thị dưới dạng một pixel hoặc dưới dạng một dấu với kích thước theo thứ tự của một pixel (nếu không thì biểu đồ sẽ nhanh chóng bị lộn xộn).
  • Phạm vi trục phải là [0,4] cho r (trục ngang) và [0,1] cho x N (trục dọc); hoặc nó có thể nhỏ hơn miễn là nó bao gồm tất cả các điểm thu được.
  • Quy mô trục là tùy ý. Đặc biệt, tỷ lệ không cần phải giống nhau cho cả hai trục.
  • Các đường lưới, nhãn trục, màu sắc và các yếu tố tương tự được chấp nhận, nhưng không bắt buộc.
  • Mã ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

Click vào từng hình ảnh cho một phiên bản độ phân giải cao.

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

Nhìn nhận

Cảm ơn @FryAmTheEggman@AndrasDeak vì những bình luận hữu ích của họ trong khi thử thách nằm trong hộp cát.


Không có giải pháp trăn?!

@Lembik Tôi có một triển khai tham chiếu trong Python (và trong Matlab), nhưng tôi không muốn tự trả lời
Luis Mendo

Bạn được phép trả lời các câu hỏi của riêng bạn trên PPCG (có lẽ đáng ngạc nhiên).

@Lembik Tôi biết, nhưng tôi muốn có câu trả lời của người khác
Luis Mendo

Câu trả lời:


13

MATL, 32 30 28 27 byte

4 byte được lưu nhờ @Luis

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

Định dạng đầu vào là r1, s, r2, vàN

Dùng thử tại MATL Online

nhập mô tả hình ảnh ở đây

Giải trình

        % 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

Toán học, 65 byte

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

Hàm thuần túy lấy các đối số N, r1, r2, s theo thứ tự đó. Nest[r#(1-#)&,x,N]lặp lại hàm logistic r#(1-#)&tổng số Nlần bắt đầu từ x; ở đây, đối số đầu tiên cho hàm ( #) là Ncâu hỏi; Point@{r,...}sản xuất một Pointđó Graphicssẽ được hạnh phúc để âm mưu. Table[...,{x,0,1,.01},{r,##2}]tạo ra một loạt các điểm này, với xgiá trị chạy từ 0đến 1theo gia số của .01; các ##2trong{r,##2} biểu thị tất cả các đối số chức năng ban đầu bắt đầu từ thứ hai, và do đó {r,##2}mở rộng để {r,r1,r2,s}mà đặt một cách chính xác phạm vi và tăng cho r.

Đầu ra mẫu, trong trường hợp thử nghiệm thứ hai: đầu vào

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

mang lại đồ họa dưới đây.

nhập mô tả hình ảnh ở đây


1
59 byte ListPlot @ Bảng [{r, Nest [r # (1 - #) &, x, #]}, {x, 0,1, .01}, {r, ## 2}] &
J42161217

Tôi đã làm rõ trong thách thức rằng quy trình được chỉ định có nghĩa là xác định kết quả được yêu cầu, nhưng bản thân quy trình không được thực thi. Bạn có thể sử dụng bất kỳ thủ tục nào khác cho kết quả tương tự. Xin lỗi nếu điều đó không rõ ràng lúc đầu
Luis Mendo

Không phải là một vấn đề, chúng tôi có một số câu trả lời tốt!
Greg Martin

1
Bạn sẽ không sử dụng -6 byte đó. Bạn có nghĩ rằng somathing là sai với giải pháp này?
J42161217

Ồ tôi nghĩ câu trả lời của bạn là việc đăng (một phiên bản) mã từ nhận xét của bạn ....
Greg Martin

5

Toán học, 65 byte

Tôi đã sử dụng một số thủ thuật của Greg Martin và đây là phiên bản của tôi mà không sử dụng Đồ họa

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

đầu vào

[1000, 2.4, 4, 0,001]

đầu ra

nhập mô tả hình ảnh ở đây

đầu vào

[2000, 3,4, 3,8, 0,0002]

đầu ra

nhập mô tả hình ảnh ở đây


1
Câu trả lời đầu tiên chọn tránh các giá trị ban đầu 0 hoặc 1 (và dòng x = 0 mà chúng tạo ra) :-)
Luis Mendo

Bạn nên thêm một lời giải thích về những gì mã của bạn làm, vì nó không thực sự tuân theo quy trình được chỉ định. OP có thể quyết định xem kết quả tìm kiếm chính xác có biện minh cho phương pháp thay thế hay không.
Greg Martin

Các thủ tục được chỉ định không được thực thi. Bất cứ điều gì cho kết quả tương tự, bằng bất kỳ phương tiện nào khác, đều được cho phép (Tôi sẽ làm rõ điều đó). Bất kể điều này, tôi tò mò muốn xem lời giải thích
Luis Mendo

Các điểm mà bạn cần vẽ cho mọi r, tồn tại trong mọi "Tổ". đây là mã gốc và đó là cách tiếp cận đầu tiên của tôi (cách đây một thời gian) về vẽ sơ đồ này.
J42161217

@Luis Mendo Tôi có một phiên bản thậm chí còn ngắn hơn (tạo bản ghi cho mathicala) .58 byte nhưng bạn chỉ phải nhập 3 đầu vào [N, r1, r2]. Mất nhiều thời gian nhưng nó hoạt động.Plot [Bảng [NestList [# ( 1 - #) r &, 5, #] [[- i]], {i, 99}], {r, ## 2}] &
J42161217

2

TI-Basic, 85 byte

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

Một chương trình TI-Basic hoàn chỉnh nhận đầu vào theo thứ tự r1,r2,s,Nvà sau đó hiển thị đầu ra theo thời gian thực trên màn hình đồ thị. Lưu ý rằng điều này có xu hướng rất chậm .

Đây là một đầu ra mẫu không đầy đủ được tạo ra sau khoảng 2,5 giờ cho đầu vào 3,4,0.01,100:

nhập mô tả hình ảnh ở đây


Bạn không cần các *dấu hiệu.
lirtosiast

1

Chế biếnJS, 125 123 120 byte

Cảm ơn Kritixi Litva lưu 3 byte.

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)}}

Hãy thử trực tuyến! Gọi bằngf(N, r_1, r_2, s);


Tôi nghĩ bạn có thể thay thế voidbằng varvì nó đang xử lý JS
Kritixi Lithos

x*=p*(1-x)có thể trở thànhx*=p-p*x
Kritixi Lithos

Bằng cách sắp xếp lại vòng lặp for, tôi nhận được 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;}ở mức 119 byte
Kritixi Lithos

1

GEL , 158 byte

`(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ó có thể không phải là ngắn nhất, nhưng nó rút ra trong thời gian thực, mặc dù nó có thể rất chậm với các đầu vào khổng lồ. Dù sao, đây là một chức năng ẩn danh nhận đầu vào ở định dạng (N,r1,r2,s)và xuất ra âm mưu trong một cửa sổ mới. Lưu ý rằng điều này phải được chạy với phiên bản Gnome của Genius.

Sản lượng mẫu


1

R, 159 147 byte

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)})

Sản phẩm nào có chức năng

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,...)tạo ra một khung trống có kích thước chính xác. qlà hàm thực hiện phép lặp. Nó nhận một giá trị rvà sau đó nlặp lại cho tất cả các điểm bắt đầu giữa 0.010.99 . Sau đó nó trả về vector kết quả.

Cho-loop áp dụng các chức năng qđể trình tự ađể bcó bước s. Thay vì trả về các giá trị, nó thêm chúng dưới dạng các điểm vào cốt truyện. Nếu điểm thu hút là một giá trị, tất cả các điểm sẽ chỉ trùng nhau và hiển thị dưới dạng một điểm. cex=.1là một bổ sung cần thiết để làm cho các điểm càng nhỏ càng tốt.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.