混沌數學之離散點集圖形DEMO


      最近看了很多與混沌相關的知識,並寫了若干小軟件.混沌現象是個有意思的東西,同時混沌也能夠生成許多有意思的圖形.混沌學的現代研究使人們漸漸明白,十分簡單的數學方程完全可以模擬系統如瀑布一樣劇烈的行為。輸入端微小的差別能夠迅速放大到輸出端,變成壓倒一切的差別,這種現象被稱為“對初始條件的敏感性”。

      混沌現象其基本含義可以概括為:聚散有法,周行而不殆,回復而不閉。意思是說混沌軌道的運動完全受規律支配,但相空間中軌道運動不會中止,在有限空間中永遠運動着,不相交也不閉合。渾沌運動表觀上是無序的,產生了類隨機性,也稱內在隨機性。混沌系統具有三個關鍵要素:一是對初始條件的敏感依賴性;二是臨界水平,這里是非線性事件的發生點;三是分形維,它表明有序和無序的統一。混沌系統經常是自反饋系統,出來的東西會回去經過變換再出來,循環往復,沒完沒了,任何初始值的微小差別都會按指數放大,因此導致系統內在地不可長期預測。

      這一節將先展示下混沌點集所生成的圖形.這是一個生成混沌離散點集圖形的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對象的子類.

目前,我已經實現了以下幾種混沌方程,將在后來的章節中一一介紹:

(1)混沌數學之logistic模型

(2)混沌數學之二維logistic模型

(3)混沌數學之Baker模型

(4)混沌數學之CircuitChaotic(二維離散電路混沌系統)

(5)混沌數學之Arnold模型

(6)混沌數學之Standard模型

(7)混沌數學之Feigenbaum模型

(8)混沌數學之生物動力學混沌模型

(9)混沌數學之Kent模型

(10)混沌數學之帳篷模型

(11)混沌數學之ASin模型

(12)混沌數學之Henon模型

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM