混沌數學及其軟件模擬


      這幾天在研究混沌,並寫了些程序將網上能找到的各種混沌模型以圖形的形式顯示出來.

(一)混沌介紹

      混沌(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,

另一類是混沌所生成的曲線,這一節主要介紹這一類.

軟件下載地址:http://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 };
View Code

DifferentialEquation是導數方程的意思.

 

每一種混沌方程,在程序中都是DifferentialEquation對象的子類.

目前,我已經實現了以下幾種混沌方程:

 


免責聲明!

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



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