洛伦兹吸引子相图的简易实现
2012-01-23晏志武
晏志武
(临沧市临翔区第一中学 云南 临沧 677000)
爱德华·洛伦兹在20世纪60年代根据流体力学中的纳维叶·斯托克斯方程、热传导方程和连续性方程得出了一组气象学微分方程.这是一组毫不起眼的方程,但洛伦兹所采用的电脑数值计算和绘制相图的方法却影响深远.这组方程后来被命名为洛伦兹吸引子,因其中的一张典型相图酷似蝴蝶又被称为“洛伦兹的蝴蝶”.洛伦兹以此开创了计算机研究复杂非线性问题的先河.
1 洛伦兹微分方程组
2 微分方程组转化为差分方程组
现在普遍使用的数学运算软件是Matlab或Mathematica ,二者都要求具备比较好的数学基础和编程能力.笔者设想使用Flash动画软件实现上述方程组的计算和绘图,但Flash处理不了微分方程,因此,要先将微分方程组转化为下列差分方程组
Δx=-σ(x-y)Δt
Δy=(rx-y-xz)Δt
Δz=(-bz+xy)Δt
我们知道,当变量Δt→0时,差分就变成微分了.实际计算时只要Δt足够小即可取得误差符合要求的结果.
3 Flash简单编程实现
程序共有2个图层、3帧.
(1)第1图层第1帧放置1个斜二侧作图实例itnpoint(这其实就是一个大小合适的黑色圆点元件分身),1个变量名为r的输入文本框和1个控制程序运行或暂停的按钮,第2,第3帧均为普通帧.
(2)第2图层为代码层
第1帧(关键帧)设定初值
σ=9;
b=3;
if(_root.r==undefined){r=27};// r的默认值为27,可通过第1图层的输入文本框改设为其他值.
else{r=r}
x=1;
y=0;
z=0;
Δt=0.005;//Δt足够小时,差分方程的运算结果才能充分地近似于微分方程.
第2帧(关键帧)迭代运算和绘图:
hx.moveTo(t, 90+x); // 以下3行设置分量图绘图实例hx,hy,hz的初始位置,t是时间值.
hy.moveTo(t, 170+y);
hz.moveTo(t, 250+z);
Δx=-9*(x-y)*Δt; // 以下3行计算差分值.
Δy=(r*x-y-x*z)*Δt;
Δz=(-3*z+x*y)*Δt;
x=x+Δx; // 以下3行完成迭代.
y=y+Δy;
z=z+Δz;
x1=x+(1/2)*y*Math.cos(Math.PI/4); // 以下2行计算“斜二侧作图法”的位置坐标.
y1=(1/2)*y*Math.sin(Math.PI/4);
t=Δt*m; // 更新时间值.
m=m+1; // 记录迭代次数.
hx.lineTo(t, 90+x); // 以下3行完成第1次以x,y,z为纵坐标,t为横坐标的分量图绘制.
hy.lineTo(t, 170+y);
hz.lineTo(t, 250+z);
ht = "ht0" add m; // 生成斜二侧图绘图点.
duplicateMovieClip("itnpoint",ht,m); // 复制绘图实例itnpoint (itnpoint放置于第1图层).
setProperty(bn, _x, x1 ); // 以下2行设置绘图点坐标.
setProperty(bn, _y, y1 );
第3帧(关键帧):
gotoAndPlay(2); // 回到第2帧作重复地迭代计算.
4 相图和分量图举例
系数σ,b和变量x,y,z的初值确定,r取不同的值将得到显著不同的图形见表1,由此可以看到方程组对r的高度敏感性.
表1r取不同值对应的图形
续表
5 结束语
Flash是目前主流的平面动画软件,大家比较熟悉.除用于网页制作外,也可用于数值计算和相图绘制.其优点是简单易懂,过程清晰可见,不足之处是运行时间稍长(约需几分钟).这种方法尤其适合于数学基础和编程能力都比较欠缺的中学生进行中学物理与大学物理衔接段的学习.
另外,“洛伦兹吸引子”提醒我们要极其慎重地对待地球环境,轻率地改变它有可能导致难以预料和无法挽回的后果.
参考文献
1 郝柏林.从抛物线谈起 — 混沌动力学引论. 上海:上海科技教育出版社,1993.9
2 刘正君.MATLAB科学计算与可视化仿真.北京:电子工业出版社,2009
3 吴明哲,等.网页高手-Action程序设计篇.北京:中国铁道出版社