最近看了很多與混沌相關的知識,並寫了若干小軟件.混沌現象是個有意思的東西,同時混沌也能夠生成許多有意思的圖形.混沌學的現代研究使人們漸漸明白,十分簡單的數學方程完全可以模擬系統如瀑布一樣劇烈的行為。輸入端微小的差別能夠迅速放大到輸出端,變成壓倒一切的差別,這種現象被稱為“對初始條件的敏感性”。
混沌現象其基本含義可以概括為:聚散有法,周行而不殆,回復而不閉。意思是說混沌軌道的運動完全受規律支配,但相空間中軌道運動不會中止,在有限空間中永遠運動着,不相交也不閉合。渾沌運動表觀上是無序的,產生了類隨機性,也稱內在隨機性。混沌系統具有三個關鍵要素:一是對初始條件的敏感依賴性;二是臨界水平,這里是非線性事件的發生點;三是分形維,它表明有序和無序的統一。混沌系統經常是自反饋系統,出來的東西會回去經過變換再出來,循環往復,沒完沒了,任何初始值的微小差別都會按指數放大,因此導致系統內在地不可長期預測。
這一節將先展示下混沌點集所生成的圖形.這是一個生成混沌離散點集圖形的DEMO,里面含有多個不同方程生成的混沌圖形.在這個DEMO中,會看到由點集生成的看得出規律的及看不出規律的圖形.
下載地址為:http://files.cnblogs.com/WhyEngine/chaos.7z
軟件中有兩種視口顯示模式,三維和二維的.鍵盤O用於二者間的切換.
鼠標右鍵用於控制視口.
鍵盤G用於是否顯示網格的切換
-------------------------------------------------------------
在這種離散點集的混沌圖形中,使用迭代的方法生成頂點數據:
在中學課本中我們學過,一個一元函數,通常可以表示為: Y=f(x) 這里X是自變量,Y是因變量。
例如: Y=3X+1,如果X=1,那么Y=4;如果X=4,那么Y=13;總之,如果X被確定,那么相應的Y也被確定。
我們用一個抽象的符號F,來表示Y遵循X變化的因果關系。廢話連篇的解釋是:數字Y隨數字X的變化而變化,Y由X來決定,決定的依據是“關系”F。
如果我們利用某個關系函數,比如Y=F(X),代入一個X算出一個Y,又將Y作為新的X再次計算下一個Y………如此不斷,這種方法在數學上稱為迭代,具體的表達式是: Xn =F(X n-1 ),n=1,2,3……..
學過程序的人一定知道"費波那齊數列",它算是比較典型的Xn =F(X n-1 )方程的例子。不過這種方程不是收斂的,所以它的圖形幾下就會爆表。
OK,那先帖下我寫的有關這種離散方程對象的基類定義代碼:
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 #define PI 3.14159265f 12 13 // -------------------------------------------------------------------------------------- 14 15 class DiscreteEquation 16 { 17 public: 18 DiscreteEquation() 19 { 20 m_StartX = 0.0f; 21 m_StartY = 0.0f; 22 23 m_ParamA = 0.0f; 24 m_ParamB = 0.0f; 25 m_ParamC = 0.0f; 26 m_ParamD = 0.0f; 27 m_ParamE = 0.0f; 28 } 29 30 // 求迭代值 31 virtual void IterateValue(float y, float z, float& outY, float& outZ) const = NULL; 32 33 // 計算點集的Z軸坐標 34 static void CalculatePointsZ(void* curveVerticesPtr, unsigned int stride, unsigned int count, float minZ, float maxZ) 35 { 36 char* zPtr = (char*)curveVerticesPtr + 2*sizeof(float); 37 float zStep = (maxZ - minZ)/(count - 1); 38 39 for (unsigned int i = 0; i < count; i++) 40 { 41 *(float*)zPtr = minZ + i*zStep; 42 zPtr += stride; 43 } 44 } 45 46 // 計算點集的Y軸與X軸坐標 47 virtual void CalculatePointsXY(void* curveVerticesPtr, unsigned int stride, unsigned int count) 48 { 49 char* xPtr = (char*)curveVerticesPtr; 50 char* yPtr = (char*)curveVerticesPtr + sizeof(float); 51 52 float y, x; 53 float nx, ny; 54 55 x = m_StartX; 56 y = m_StartY; 57 58 for (unsigned int i = 0; i < count; i++) 59 { 60 *(float*)xPtr = x; 61 *(float*)yPtr = y; 62 63 IterateValue(x, y, nx, ny); 64 65 x = nx; 66 y = ny; 67 68 xPtr += stride; 69 yPtr += stride; 70 } 71 } 72 73 SET_GET_FLOAT_PROPERTY(StartX); 74 SET_GET_FLOAT_PROPERTY(StartY); 75 76 SET_GET_FLOAT_PROPERTY(ParamA); 77 SET_GET_FLOAT_PROPERTY(ParamB); 78 SET_GET_FLOAT_PROPERTY(ParamC); 79 SET_GET_FLOAT_PROPERTY(ParamD); 80 SET_GET_FLOAT_PROPERTY(ParamE); 81 82 virtual bool IsValidParamA() const {return false;} 83 virtual bool IsValidParamB() const {return false;} 84 virtual bool IsValidParamC() const {return false;} 85 virtual bool IsValidParamD() const {return false;} 86 virtual bool IsValidParamE() const {return false;} 87 88 protected: 89 float m_StartX; 90 float m_StartY; 91 92 float m_ParamA; 93 float m_ParamB; 94 float m_ParamC; 95 float m_ParamD; 96 float m_ParamE; 97 };
每一種混沌點集圖形,在程序中都是DiscreteEquation對象的子類.
目前,我已經實現了以下幾種混沌方程,將在后來的章節中一一介紹:
(3)混沌數學之Baker模型
(4)混沌數學之CircuitChaotic(二維離散電路混沌系統)
(9)混沌數學之Kent模型
(10)混沌數學之帳篷模型
(11)混沌數學之ASin模型
(12)混沌數學之Henon模型