2016-03-14 116 views
0

我有以下代碼:爲什麼這個C++函數產生混沌輸出?

int main (int argc, char **argv){ 
double lambda = 4; 
double x = .2; 

for (int i=1; i<=30; i++) 
    { 
    printf("%.5f \n", x); 
    x = lambda * x * (1-x); 
    }   
} 

即輸出以下:

0.20000 0.64000 0.92160 0.28901 0.82194 0.58542 0.97081 0.11334 0.40197 0.96156 0.14784 0.50392 0.99994 0.00025 0.00098 0.00394 0.01568 0.06174 0.23173 0.71212 0.82001 0.59036 0.96734 0.12638 0.44165 0.98638 0.05374 0.20342 0.64815 0.91221

我的問題是:如何在輸出值變化的每一次迭代for循環如果變量「i」不是for循環中「x」計算的一部分?

+1

「x」正在根據自己以前的值進行更改。 「我」只是一個計數器應重複計算多少次。 –

+0

它給予完美的結果。沒有看到任何問題。 –

+0

[進一步閱讀](http://www.cs.utsa.edu/~wagner/pubs/logistic/remarks.pdf)。在數學上,如果我們以「x」非理性開始,這會產生無限序列的不同隨機數。顯然,這不能被浮點複製(因爲它們都是有理性的),並且論文討論了一些處理浮點錯誤的方法。 –

回答

2

您在以下語句中使用xx = lambda * x * (1-x);。這種方式x值在每次迭代更改。

+1

這並不能解釋序列混亂的原因。許多迭代顯示收斂到一個固定值或定期beaviour。這個稱爲對數方程的特定方程是混沌行爲最着名的模型之一。 –

+1

@FrankPuffer:OP所問的問題是如果計算不涉及「i」的值,'x'的值可能會如何改變。 – dreamlax

+0

@dreamlax:對,但實際上他提出了兩個完全不同的問題,一個是我引用的標題中的問題,另一個是文本末尾的問題。 –

2

對於循環的每次迭代,基於涉及舊值x的一些計算來爲變量x分配新值。變量i僅用於限制此計算重複的次數。

同樣,你可以改變的x值(不使用i)在一個更簡單的方法:

x = x + 1; 

使用,而不是x = lambda * x * (1-x);線和觀察一下該值增加。

1

for循環中的「i」被稱爲迭代變量,這意味着它將用作記錄「否」的計數器。循環的迭代。

而「x」是你想在循環中玩的變量。

您可以嘗試在循環中打印i和x的值,以瞭解迭代的概念。

相關問題