人真正变强大,不是因为守护着自尊心,而是抛开自尊心的时候。
——《请回答1988》
Strange Attractor是混沌运动的主要特征之一,由法国物理学家小D和小F在1970年左右引进。Now here comes a question : 何为混沌运动?度娘解释道,混沌(chaos)是指确定性动力学系统因对初值敏感而表现出的不可预测的、类似随机性的运动。元芳,你怎么看?简单点,你又不是个演员,不就是蝴蝶效应嘛。
We need to have a wealth of imagination and association. 谁知道你现在忍不住的一个喷嚏,它是否has changed your life?
烧脑热线:埃里克·布雷斯、J·麦凯伊·格鲁伯执导《蝴蝶效应》:
6.1 Attractor
所谓吸引子(Attractor),是动力系统里的一个状态,系统演化会趋向那个方向靠拢。所有运动系统,不管是混沌的还是非混沌的,都是以吸引子为基础。
奇异吸引子具有两个主要特征:
① 奇异吸引子的运动对初值表现为极强的敏感依赖性,在初值上微小的差异,就会导致运动轨迹的截然不同;
② 奇异吸引子往往具有非整数维,如2.06维,需要计算才能确定。
6.2 Amazing Grace
鉴于其属性,奇异吸引子本质上可是相当艺术性的。 吕埃勒这样写到:“这些系统的曲线,有时像烟花或者星系图,有时像蔬菜的分芽繁殖过程。”
例如,Lorenz Attractor 拥有自对称之美:
Peter de Jong Attractor在二维或三维空间可视化——
可视化:
立体化:
塑料质感:
6.3 Processing与Peter de Jong Attractor
Peter de Jong Attractor方程式如下:
//Processing中,其数学公式的表达:
float newX = sin(a * oldY) - cos(b * oldX);
float newY = sin(c * oldX) - cos(d * oldY);
旧坐标的迭代计算产生一组新的坐标,可以绘制为二维图形。 而改变常数a,b,c和d的值能够产生不同的图案。
float x = 0, y = 0.5;
float a = -2, b = -2, c = -1.2, d = 2;
float a = 1.641, b = 1.902, c = 0.316, d = 1.525;
float a = 0.970, b = -1.899, c = 1.381, d = -1.506;
float a = 1.4, b = -2.3, c = 2.4, d = -2.1;
float a = 2.01, b = -2.53, c = 1.61, d = -0.33;
float a = -0.827, b = -1.637, c = 1.659, d = -0.943;
float a = -2.24, b = 0.43, c = -0.65, d = -2.43;
float a = -0.709, b = 1.638, c = 0.452, d = 1.740;
实现示例代码:
/**
* Peter de Jong Attractors
* @微信公众号:维度模态
* @author:Hewes
* @date 2017/08/20
*/
size(800, 800);
background(255);
stroke(0);
translate(width/2, height/2); //平移至中心
float oldX = 0, oldY = 0.5;
float a = -2, b = -2, c = -1.2, d = 2, mag = 150; //参数mag代表放大倍数
for (int i = 0; i < 200000; i++) {
//迭代公式:
//xn+1 = sin(a yn) - cos(b xn)
//yn+1 = sin(c xn) - cos(d yn)
float newX= sin(a * oldY) - cos(b * oldX);
float newY= sin(c * oldX) - cos(d * oldY);
//放大+画点
point(newX * mag, newY * mag);
//赋新值
oldX=newX;
oldY=newY;
}
Maybe you want to do something like this:
但由于这里涉及到了图像渲染知识,其另有一番奥妙。欲知后事如何,请听下回分解。
6.4 挡不住的 Interaction
加一点鼠标操作,如何?其核心代码:
//鼠标按下后改变参数的值
void mousePressed() {
background(255);
x = random(-0.2, 0.2);
y = random(-0.2, 0.2);
a = random(-2.5, 2.5);
b = random(-2.5, 2.5);
c = random(-2.5, 2.5);
d = random(-2.5, 2.5);
}
你的脑洞大,你来讲……