數量週期——藍橋杯2012年Java決賽

複雜現象背後的推動力,可能是極其簡單的原理。科學的目標之一就是發現紛繁複雜的自然現象背後的簡單法則。愛因斯坦的相對論是這方面的典範例證。

很早的時候,生物學家觀察某區域某種昆蟲的數量(稱爲蟲口數)之逐年變化規律,就十分迷惑:有的時候是逐漸增多達到一個平衡值。有的時候在兩個數字間週期跳動。有的時候則進入一片混亂,類似隨機數字一樣變化(稱爲混沌現象)。

慢慢地,人們從數學中更清晰地觀察到了這一現象,並因此開創了:符號動力學、非線性動力學等研究領域。

一個著名的蟲口數目簡化模型如下:

x’ = x * (1 - x) * r

這裏,x x’ r 都是浮點數。

其中,x 表示當年的蟲口數,x’ 表示下一年的蟲口數。它們的取值範圍在 0 與 1 之間,實際上表示的是:蟲口的總數佔環境所能支持的最大數量的比率。

r 是常數(環境參數),r的取值範圍在 [0,4]。

令人驚訝的是:這個簡單的迭代公式有着不同尋常的神祕性質!

一般來說,多次迭代後,蟲口數的穩定模式與x的初始值無關,而與 r 有關!

例如:無論x初始值是多少,當 r = 2.5 的時候,x 多次迭代後會趨向於 0.6。

而當 r = 3.2 的時候,x 的值會趨向於在 0.799 與 0.513 之間週期性擺動。

那麼,r = 3.62 的時候,你觀察到有什麼週期現象發生嗎?

public class Main{
    static BigDecimal r = new BigDecimal(3.2);
    static BigInteger n = BigInteger.ZERO;
    static BigDecimal num1 = BigDecimal.ONE;
    static BigDecimal x1;

    static BigDecimal test(BigDecimal x, int n) {
        x1 = x.multiply(num1.subtract(x)).multiply(r)
                .setScale(4, BigDecimal.ROUND_HALF_UP);
        if (n <= 3000) {
            System.out.println("x1=" + x1);
            test(x1, n + 1);
        }
        return x1;
    }

    public static void main(String[] args) {
        BigDecimal x = new BigDecimal(0.5);
        test(x, 1);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章