混沌数学及其软件模拟
这几天在研究混沌,并写了些程序将网上能找到的各种混沌模型以图形的形式显示出来.
(一)混沌介绍
混沌(Chaos)是指发生在确定系统中的貌似随机的不规则运动,长期以来,人们在认识和描述运动时,大多只局限于线性动力学描述方法,即确定的运动有一个完美确定的解析解。但是自然界在相当多情况下,非线性现象却起着很大的作用。混沌指确定性系统产生的一种对初始条件具有敏感依赖性的回复性非周期运动。混沌理论隶属于非线性科学,只有非线性系统才能产生浑沌运动。1963年美国气象学家Lorenz在分析天气预报模型时,首先发现空气动力学中混沌现象,该现象只能用非线性动力学来解。于是,1975年混沌作为一个新的科学名词首先出现在科学文献中。从此,非线性动力学迅速发展,并成为有丰富内容的研究领域。该学科涉及非常广泛的科学范围从电子学到物理学,从气象学到生态学,从数学到经济学等。
一般地,如果一个接近实际而没有内在随机性的模型仍然具有貌似随机的行为,就可以称这个真实物理系统是混沌的。一个随时间确定性变化或具有微弱随机性的变化系统,称为动力系统,它的状态可由一个或几个变量数值确定。而一些动力系统中,两个几乎完全一致的状态经过充分长时间后会变得毫无一致,恰如从长序列中随机选取的两个状态那样,这种系统被称为敏感地依赖于初始条件。而对初始条件的敏感的依赖性也可作为混沌的一个定义。
与我们通常研究的线性科学不同,混沌学研究的是一种非线性科学,而非线性科学研究似乎总是把人们对“正常”事物“正常”现象的认识转向对“反常”事物“反常”现象的探索。例如,孤波不是周期性振荡的规则传播;“多媒体”技术对信息贮存、压缩、传播、转换和控制过程中遇到大量的“非常规”现象产生所采用的“非常规”的新方法;混沌打破了确定性方程由初始条件严格确定系统未来运动的“常规”,出现所谓各种“奇异吸引子”现象等。
在非线性科学中,混沌现象指的是一种确定的但不可预测的运动状态。它的外在表现和纯粹的随机运动很相似,即都不可预测。但和随机运动不同的是,混沌运动在动力学上是确定的,它的不可预测性是来源于运动的不稳定性。或者说混沌系统对无限小的初值变动和微绕也具于敏感性,无论多小的扰动在长时间以后,也会使系统彻底偏离原来的演化方向。进一步研究表明,混沌是非线性动力系统的固有特性,是非线性系统普遍存在的现象。牛顿确定性理论能够充分处理的多维线性系统,而线性系统大多是由非线性系统简化来的。混沌现象是自然界中的普遍现象,天气变化就是一个典型的混沌运动。混沌现象的一个著名表述就是蝴蝶效应:南美洲一只蝴蝶扇一扇翅膀,就会在佛罗里达引起一场飓风。洛伦兹在计算机上用他所建立的微分方程模拟气候变化的时候,偶然发现输入的初始条件的极细微的差别,可以引起模拟结果的巨大变化。洛伦兹打了个比喻,即我们在文首提到的关于在南半球巴西某地一只蝴蝶的翅膀的偶然扇动所引起的微小气流,几星期后可能变成席卷北半球美国得克萨斯州的一场龙卷风,这就是天气的“蝴蝶效应”。
混沌系统具有三个关键要素:一是对初始条件的敏感依赖性;二是临界水平,这里是非线性事件的发生点;三是分形维,它表明有序和无序的统一。混沌系统经常是自反馈系统,出来的东西会回去经过变换再出来,循环往复,没完没了,任何初始值的微小差别都会按指数放大,因此导致系统内在地不可长期预测。
混沌现象现代科学所讲的混沌,其基本含义可以概括为:聚散有法,周行而不殆,回复而不闭。意思是说混沌轨道的运动完全受规律支配,但相空间中轨道运动不会中止,在有限空间中永远运动着,不相交也不闭合。浑沌运动表观上是无序的,产生了类随机性,也称内在随机性。浑沌模型一定程度上更新了传统科学中的周期模型,用浑沌的观点去看原来被视为周期运动的对象,往往有新的理解。
(二)混沌相关的几个基本概念
1. 混沌: 目前尚无通用的严格的定义, 一般认为,将不是由随机性外因引起的, 而是由确定性方程(内因)直接得到的具有随机性的运动状态称为混沌。
2. 相空间: 在连续动力系统中, 用一组一阶微分方程描述运动, 以状态变量(或状态向量)为坐标轴的空间构成系统的相空间。系统的一个状态用相空间的一个点表示, 通过该点有唯一的一条积分曲线。
3. 混沌运动: 是确定性系统中局限于有限相空间的高度不稳定的运动。所谓轨道高度不稳定, 是指近邻的轨道随时间的发展会指数地分离。由于这种不稳定性, 系统的长时间行为会显示出某种混乱性。
4. 分形和分维: 分形是 n 维空间一个点集的一种几何性质, 该点集具有无限精细的结构, 在任何尺度下都有自相似部分和整体相似性质, 具有小于所在空间维数 n 的非整数维数。分维就是用非整数维——分数维来定量地描述分形的基本性质。
5. 不动点: 又称平衡点、定态。不动点是系统状态变量所取的一组值, 对于这些值系统不随时间变化。
6. 吸引子: 指相空间的这样的一个点集 s (或一个子空间) , 对s邻域的几乎任意一点, 当t趋近正无穷时所有轨迹线均趋于s, 吸引子是稳定的不动点。
7. 奇异吸引子: 又称混沌吸引子, 指相空间中具有分数维的吸引子的集合。该吸引集由永不重复自身的一系列点组成, 并且无论如何也不表现出任何周期性。混沌轨道就运行在其吸引子集中。
8. 分叉和分叉点: 又称分岔或分支。指在某个或者某组参数发生变化时, 长时间动力学运动的类型也发生变化。这个参数值(或这组参数值)称为分叉点, 在分叉点处参数的微小变化会产生不同性质的动力学特性, 故系统在分叉点处是结构不稳定的。
9. 周期解: 对于系统Xn+1 = f(Xn) , 当n趋近正无穷时,若存在Xn+i == Xn , 则称该系统有周期i解。不动点可以看作是周期为1的解, 因为它满足Xn+1 == Xn。
10. 初值敏感性:对初始条件的敏感依赖是混沌的基本特征,也有人用它来定义混沌:混沌系统是其终极状态极端敏感地依赖于系统的初始状态的系统。敏感依赖性的一个严重后果就在于,使得系统的长期行为变得不可预见.
(三)软件实现
我写的混沌相关的程序分为两类:
一类是混沌生成的点集,参见:混沌数学之离散点集图形DEMO,
另一类是混沌所生成的曲线,这一节主要介绍这一类.
软件下载地址:https://files.cnblogs.com/WhyEngine/Chaos.7z
那帖下我写的有关这种混沌方程对象的基类定义代码:
1 #define SET_GET_FLOAT_PROPERTY(name) \ 2 void Set##name##(float v)\ 3 {\ 4 m_##name## = v;\ 5 }\ 6 float Get##name##() const\ 7 {\ 8 return m_##name##;\ 9 } 10 11 // -------------------------------------------------------------------------------------- 12 13 class DifferentialEquation 14 { 15 public: 16 DifferentialEquation() 17 { 18 m_StartX = 0.0f; 19 m_StartY = 0.0f; 20 m_StartZ = 0.0f; 21 22 m_ParamA = 0.0f; 23 m_ParamB = 0.0f; 24 m_ParamC = 0.0f; 25 m_ParamD = 0.0f; 26 m_ParamE = 0.0f; 27 m_ParamT = 0.0f; 28 29 m_StepT = 0.001f; 30 } 31 32 // 求导数 33 virtual void Derivative(float x, float y, float z, float& dX, float& dY, float& dZ) = NULL; 34 35 // 计算曲线 36 virtual void CalculateCurve(void* curveVerticesPtr, unsigned int stride, unsigned int count) 37 { 38 39 char* xPtr = (char*)curveVerticesPtr; 40 char* yPtr = (char*)curveVerticesPtr + sizeof(float); 41 char* zPtr = (char*)curveVerticesPtr + 2*sizeof(float); 42 43 float x, y, z; 44 float dx, dy, dz; 45 x = m_StartX; 46 y = m_StartY; 47 z = m_StartZ; 48 49 if (IsValidParamT()) 50 { 51 m_ParamT = 0.0f; 52 53 for (unsigned int i = 0; i < count; i++) 54 { 55 *(float*)xPtr = x; 56 *(float*)yPtr = y; 57 *(float*)zPtr = z; 58 59 Derivative(x, y, z, dx, dy, dz); 60 61 x += m_StepT*dx; 62 y += m_StepT*dy; 63 z += m_StepT*dz; 64 65 xPtr += stride; 66 yPtr += stride; 67 zPtr += stride; 68 69 m_ParamT += m_StepT; 70 } 71 72 m_ParamT = 0.0f; 73 } 74 else 75 { 76 for (unsigned int i = 0; i < count; i++) 77 { 78 *(float*)xPtr = x; 79 *(float*)yPtr = y; 80 *(float*)zPtr = z; 81 82 Derivative(x, y, z, dx, dy, dz); 83 84 x += m_StepT*dx; 85 y += m_StepT*dy; 86 z += m_StepT*dz; 87 88 xPtr += stride; 89 yPtr += stride; 90 zPtr += stride; 91 } 92 } 93 94 } 95 96 SET_GET_FLOAT_PROPERTY(StartX); 97 SET_GET_FLOAT_PROPERTY(StartY); 98 SET_GET_FLOAT_PROPERTY(StartZ); 99 100 SET_GET_FLOAT_PROPERTY(ParamA); 101 SET_GET_FLOAT_PROPERTY(ParamB); 102 SET_GET_FLOAT_PROPERTY(ParamC); 103 SET_GET_FLOAT_PROPERTY(ParamD); 104 SET_GET_FLOAT_PROPERTY(ParamE); 105 106 SET_GET_FLOAT_PROPERTY(StepT); 107 108 virtual bool IsValidParamA() const {return false;} 109 virtual bool IsValidParamB() const {return false;} 110 virtual bool IsValidParamC() const {return false;} 111 virtual bool IsValidParamD() const {return false;} 112 virtual bool IsValidParamE() const {return false;} 113 virtual bool IsValidParamT() const {return false;} 114 115 protected: 116 float m_StartX; 117 float m_StartY; 118 float m_StartZ; 119 120 float m_ParamA; 121 float m_ParamB; 122 float m_ParamC; 123 float m_ParamD; 124 float m_ParamE; 125 float m_ParamT; 126 127 float m_StepT; // 步长时间 128 };
DifferentialEquation是导数方程的意思.
每一种混沌方程,在程序中都是DifferentialEquation对象的子类.
目前,我已经实现了以下几种混沌方程: