后勤地图的奇特魅力


21

挑战的目的是大约绘制吸引所述的逻辑映射作为其参数的函数[R (也称为分支图),或它的一个子区。在Wikipedia的以下图像中可以看到该图形的外观:

在此处输入图片说明

背景

逻辑映射是一个数学函数,其采用输入X ķ并将其映射到输出X K + 1定义为

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

其中r是映射的参数,假定位于区间[0,4]中。

给定[0,4]中的r以及间隔[0,1]中的初始值x 0,有趣的是函数重复应用大量N次迭代,从而产生最终值x N。请注意,x N也必将位于[0,1]中。

例如,假设r = 3.2,N =1000。初始值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 ,...

什么真实的是,对于足够大的Ñ,以及对于几乎所有的初始值X 0,术语X Ñ将接近集合{0.5130,0.7995}中的元素中的一个。这个集合叫做该特定r吸引子

对于参数r的其他值的活检集或其元素的大小将改变。该图绘制了每个r在吸引子中的元素。

特定r的吸引子可以是估计

  1. 测试各种初始值x 0 ;
  2. 让为大量的系统演变Ñ迭代; 和
  3. 注意到最终值的X Ñ获得这一点。

挑战

输入项

  • N:迭代次数。

  • r 1 r 2 s。这些定义了 r值的集合 R,即 R = { r 1 r 1 + s r 1 + 2 s,..., r 2 }。

程序

初始值x 0的集合X是固定的:X = {0.01,0.02,...,0,99}。可选地,X中还可以包含0和1 。

对于每个řř并且每个X 0X,迭代的逻辑映射Ñ次以产生X Ñ。记录获得的元组(rx N)。

输出量

绘制每个元组( rx N)为平面中的一个点,其中r为水平轴,x N为垂直轴。输出应该是图形的(不是ASCII艺术)。

附加规则

  • 指示的过程定义了所需的结果,但未执行。可以使用其他任何处理相同(rx N)元组的过程。
  • 输入像往常一样灵活。
  • 浮点错误不会对答题器造成影响。
  • 需要以任何可接受的格式进行图形输出。特别地,输出可以显示在屏幕上,或者可以产生图形文件,或者可以输出RGB值的阵列。如果输出文件或数组,请张贴一个显示时的示例。
  • 图形可以是矢量或栅格。对于光栅图形,图像的大小至少应为400×400像素。
  • 每个点应显示为单个像素,或者显示为一个像素大小的标记(否则,图形会很快变得混乱)。
  • r(水平轴)的轴范围应为[0,4 ],x轴的范围应为[0,1] 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在沙箱中遇到挑战时提供了有益的意见。


什么没有python解决方案?

@Lembik我在Python(和在Matlab)一个参考实现,但我不想回答我自己
路易斯Mendo

您可以回答有关PPCG的问题(也许令人惊讶)。

我知道@Lembik,但我希望有其他人的答案
Luis Mendo

Answers:


13

MATL,32 30 28 27字节

@Luis节省了4个字节

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

输入格式是r1sr2,和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]迭代逻辑函数; 在这里,函数()的第一个参数是有问题的;产生这会很乐意绘制。创建一整堆这些点,其值从到以递增;的在表示所有的从第二一种起始原函数的参数,并因此膨胀到其正确设置的范围和增量。r#(1-#)&Nx#NPoint@{r,...}PointGraphicsTable[...,{x,0,1,.01},{r,##2}]x01.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个字节的ListPlot @ Table [{r,Nest [r#(1-#)&,x,#]},{x,0,1,.01},{r,## 2}]&
J42161217

我已经在挑战中澄清了所指示的过程旨在定义所需的结果,但是该过程本身并未强制执行。您可以使用任何其他提供相同结果的过程。抱歉,如果一开始不清楚,那么
Luis Mendo

没问题,我们有几个不错的答案!
格雷格·马丁

1
您不是要使用这-6个字节。您是否认为此解决方案有误?
J42161217 '17

哦,我还以为你的答案是的发布(一个版本)从您的评论的代码....
格雷格·马丁

5

Mathematica,65个字节

我使用了Greg Martin的一些技巧,这是我的版本,没有使用Graphics

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

输入

[1000、2.4、4、0.001]

输出

在此处输入图片说明

输入

[2000,3.4,3.8,0.0002]

输出

在此处输入图片说明


1
选择避免初始值0或1(以及它们生成的x = 0行)的第一个答案:-)
Luis Mendo

您应该添加代码说明,因为它实际上并没有遵循指定的过程。OP可以确定准确外观的结果是否证明了该替代方法的合理性。
格雷格·马丁

不执行指定的过程。允许通过任何其他方式提供相同结果的任何内容(我将对此进行澄清)。无论如何,我很想知道解释的原因
Luis Mendo

您需要为每个r绘制的点已经存在于每个“巢”中。这是原始代码,这是我(前一段时间)绘制此图的第一种方法。
J42161217 '17

@Luis Mendo我有一个更短的版本(为mathematica记录了一个)。58个字节,但您必须仅输入3个输入[N,r1,r2]。这需要时间,但可以。Plot[Table [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

ProcessingJS,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);


我认为您可以替换voidvar它,因为它是Processing JS
Kritixi Lithos

x*=p*(1-x)可以成为x*=p-p*x
Kritixi Lithos

通过重新排列for循环,我得到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个字节
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,159147字节

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.010.99。然后,它返回结果向量。

for循环将功能应用到带有step q的序列。它不返回值,而是将它们作为点添加到绘图中。如果吸引点是一个值,则所有点都将重叠并显示为一个点。是使积分尽可能小的必要补充。abscex=.1

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.