这篇日志里,我曾提到过一个非常牛B的Flash动画The Zoomquilt,它由一系列的图片拼接而成,并且这些图片最终形成了一个循环,从而产生出无限放大的效果。最近,网络上出现了Zoomquilt加强版Zoomquilt II,它比前一代包含更多的图片和更丰富的细节。如果你喜欢他们的前一个作品的话,你会更加喜欢这个加强版的。
每年的这个时候,SciFi频道都会推出一个Mini科幻剧,通常只有三集,每集大约两个小时。最新的Mini科幻剧Tin Man讲述一群人被困在一个叫做Outer Zone的地方,前几天刚刚播完。SciFi频道为这部剧集制作了一个类似的Flash动画,效果更加华丽,完全看不出拼接的痕迹,并且还加入了声音和动画效果。
无穷
如果非要给这份爱加上一个期限,我希望是……无限
图片来源:http://brownsharpie.courtneygibbons.org/?p=313 一个非常有意思的网站!
Poincaré圆盘模型:一个神奇的双曲世界
今年恰逢PKU数学文化节十周年,其间开办的很多讲座我都去了。去听讲座的人好像都是数院的,我恐怕是唯一一个中文系的。考虑到我和中文系的MM没有共同话题,因此每一次听讲座时我都会顺便四处打望,看看有没有数院的美女,下来可以和她“交谈”一下。有趣的是我的做法与常人所想的恰好相反:据说数院的已经盯上中文系的MM了,而我一个中文系的竟然反过来去找数院的MM。
昨天有一个关于非欧几何的讲座,这是目前所有的讲座中最为精彩的一次。讲座里提到了Poincaré的一个双曲几何模型,感觉非常有意思,在这里和大家分享一下。
在所有的双曲几何模型中,Poincaré的圆盘模型可能是最有趣的一个。这个双曲世界存在于一个有限的平面区域里,整个世界限制在一个单位圆的范围内。这个世界中有两个最重要的物理定律:一,假如某物体X离原点O距离为d,那么该物体的温度为1-d^2;二,物体的大小与温度成正比。这样,假如某个人从这个世界的中心走向边缘,那么他的温度会从1慢慢变成0,同时整个人慢慢变小。他自身大小改变的同时周围的物体也等比例地放大或缩小,而这个世界里的人视野有限,看不见远处的东西,因此他不会觉得自己变小了或者变大了。因此,在这个世界里,物理学家们能够很轻易地发现第一定律,但要发现第二定律则非常具有挑战性,探索第二定律的过程必然很曲折,并且很可能出现哥白尼时代的故事。
对于我们来说,这个世界是有界的;但对于这个世界中的人来说,这个世界是无穷大的。因为离原点越远,人就越小,于是相对来说他们所看到的空间也就越大。当人的位置趋于边界时,物体大小趋于0,此时的空间将变得无穷大,因此这个世界中的物体永远无法到达边界。同时,离原点越远的话越接近“绝对零度”,这将非常不适宜生物的生存,因此人们大多居住在原点,离原点越远城市规模越小,更远的地方则完全没有开发过,只适合于疯狂的冒险家进行极限运动。于是这个世界中的物理学家很自然地得到这个结论:世界是无穷大的。
下面就神奇了。现在,考虑某个人想从A点走到B点。如果按照红色的线段直直地走过去,所走的路程并不是最短的,因为这条路线离原点较远。聪明的人会发现,我先往原点方向走一点,然后再到B点去,这样走的路程更短一些。我们猜想,最短路线很可能是一条偏向于原点的弧线(就好像原点把直线段“吸”过去了一样)。之所以产生这种奇怪的现象是因为,离原点越远物体就越小,人的步子也变小了,相对来说实际空间就变大了。因此,对我们来说距离相等的两点,对他们来说离原点越远其实际距离越大。因此,我们有必要重新定义这个双曲世界中“距离”的概念。由于物体大小与1-d^2成正比,因此我们可以定义,如果在离原点距离为d的位置上有一个充分小的位移,在我们看来距离为Δx,那么在这个世界中的实际距离就是Δx/(1-d^2)。这样就可以算出,从A到B的最近路线是一条垂直于边界的圆弧(蓝色的那条)。于是在这个世界中,“直线段”已经不再是我们熟悉的直线段了,而是一条条的弧线(还包括整个圆的直径)。而我们眼中的直线,在他们看来就是曲线。
这个世界中的几何满足欧式几何的前面四个公设,但不满足第五公设。比如,两点确定一条直线,因为过两点的圆弧只有一条垂直于这个世界的边界;而直线可以无限延长,因为离边界越近两点的实际距离越大,你永远走不到尽头。但是,这个世界不满足第五公设。从图2可以看到,过一点可以作无数条直线不与已知直线相交;从图3可以看到,三角形的内角和小于180度。下面这幅图片可以帮助你更好地理解这个双曲模型。这是该平面上的一个三角形剖分,里面的所有三角形都是等边三角形,而且所有这些三角形都是一样大的。你可以看到7个等边三角形共用一个顶点,这说明三角形的内角和小于180度。
另外值得一提的是,这个构想很适合写成一篇科幻小说。记得大刘的那篇科幻吗?一群电子器件诞生在某颗星球的内核,然后探索物理定律,历经重重困难,最终冲破了它们那个世界的“天然外壳”,看到了外面的世界,并相信我们整个宇宙也处于一个更大的星体内。这个双曲几何模型也很适合写出这样的小说来,比如以物理史书的方式叙述从古至今若干个传奇人物的故事,讲述他们是如何从一些奇怪的现象出发,通过各种试验证明自己的猜想,顶住社会各方面的压力,执著地探索宇宙的奥秘。小说中的人物可以带着读者一起进行探索,最后才告诉读者这个宇宙的本质是什么。
Matrix67原创
转贴请注明出处
趣图:分形图形之海岸线 无限放大的图片
神奇的分形艺术(四):Julia集和Mandelbrot集
考虑函数f(z)=z^2-0.75。固定z0的值后,我们可以通过不断地迭代算出一系列的z值:z1=f(z0), z2=f(z1), z3=f(z2), …。比如,当z0 = 1时,我们可以依次迭代出:
z1 = f(1.0) = 1.0^2 – 0.75 = 0.25
z2 = f(0.25) = 0.25^2 – 0.75 = -0.6875
z3 = f(-0.6875) = (-0.6875)^2 – 0.75 = -0.2773
z4 = f(-0.2773) = (-0.2773)^2 – 0.75 = -0.6731
z5 = f(-0.6731) = (-0.6731)^2 – 0.75 = -0.2970
…
可以看出,z值始终在某一范围内,并将最终收敛到某一个值上。
但当z0=2时,情况就不一样了。几次迭代后我们将立即发现z值最终会趋于无穷大:
z1 = f(2.0) = (2.0)^2 – 0.75 = 3.25
z2 = f(3.25) = (3.25)^2 – 0.75 = 9.8125
z3 = f(9.8125) = (9.8125)^2 – 0.75 = 95.535
z4 = f(95.535) = (95.535)^2 – 0.75 = 9126.2
z5 = f(9126.2) = (9126.2)^2 – 0.75 = 83287819.2
…
经过计算,我们可以得到如下结论:当z0属于[-1.5, 1.5]时,z值始终不会超出某个范围;而当z0小于-1.5或大于1.5后,z值最终将趋于无穷。
现在,我们把这个函数扩展到整个复数范围。对于复数z0=x+iy,取不同的x值和y值,函数迭代的结果不一样:对于有些z0,函数值约束在某一范围内;而对于另一些z0,函数值则发散到无穷。由于复数对应平面上的点,因此我们可以用一个平面图形来表示,对于哪些z0函数值最终趋于无穷,对于哪些z0函数值最终不会趋于无穷。我们用深灰色表示不会使函数值趋于无穷的z0;对于其它的z0,我们用不同的颜色来区别不同的发散速度。由于当某个时候|z|>2时,函数值一定发散,因此这里定义发散速度为:使|z|大于2的迭代次数越少,则发散速度越快。这个图形可以编程画出。和上次一样,我用Pascal语言,因为我不会C的图形操作。某个MM要过生日了,我把这个自己编程画的图片送给她^_^
{$ASSERTIONS+}
uses graph;
type
complex=record
re:real;
im:real;
end;
operator * (a:complex; b:complex) c:complex;
begin
c.re := a.re*b.re - a.im*b.im;
c.im := a.im*b.re + a.re*b.im;
end;
operator + (a:complex; b:complex) c:complex;
begin
c.re := a.re + b.re;
c.im := a.im + b.im;
end;
var
z,c:complex;
gd,gm,i,j,k:integer;
begin
gd:=D8bit;
gm:=m640x480;
InitGraph(gd,gm,'');
Assert(graphResult=grOk);
c.re:=-0.75;
c.im:=0;
for i:=-300 to 300 do
for j:=-200 to 200 do
begin
z.re:=i/200;
z.im:=j/200;
for k:=0 to 200 do
begin
if sqrt(z.re*z.re + z.im*z.im) >2 then break
else z:=(z*z)+c;
end;
PutPixel(i+300,j+200,k)
end;
readln;
CloseGraph;
end.
代码在Windows XP SP2,FPC 2.0下通过编译,麻烦大家帮忙报告一下程序运行是否正常(上次有人告诉我说我写的绘图程序不能编译)。在我这里,程序运行的结果如下:
这个美丽的分形图形表现的就是f(z)=z^2-0.75时的Julia集。考虑复数函数f(z)=z^2+c,不同的复数c对应着不同的Julia集。也就是说,每取一个不同的c你都能得到一个不同的Julia集分形图形,并且令人吃惊的是每一个分形图形都是那么美丽。下面的六幅图片是取不同的c值得到的分形图形。你可能不相信这样一个简单的构造法则可以生成这么美丽的图形,这没什么,你可以改变上面程序代码中c变量的值来亲自验证。
c = 0.45, -0.1428
c = 0.285, 0.01
c = 0.285, 0
c = -0.8, 0.156
c = -0.835, -0.2321
c = -0.70176, -0.3842
类似地,我们固定z0=0,那么对于不同的复数c,函数的迭代结果也不同。由于复数c对应平面上的点,因此我们可以用一个平面图形来表示,对于某个复数c,函数f(z)=z^2+c从z0=0开始迭代是否会发散到无穷。我们同样用不同颜色来表示不同的发散速度,最后得出的就是Mandelbrot集分形图形:
前面说过,分形图形是可以无限递归下去的,它的复杂度不随尺度减小而消失。Mandelbrot集的神奇之处就在于,你可以对这个分形图形不断放大,不同的尺度下你所看到的景象可能完全不同。放大到一定时候,你可以看到更小规模的Mandelbrot集,这证明Mandelbrot集是自相似的。下面的15幅图演示了Mandelbrot集的一个放大过程,你可以在这个过程中看到不同样式的分形图形。
网上可以找到很多小程序实现Mandelbrot集的放大过程。把上面给出的代码改一改,你也可以写出一个这样的程序来。
Update:2011 年 8 月 31 日,我对这个话题做了更进一步的讨论 http://www.matrix67.com/blog/archives/4570