關於指數增長的分析

什麼是指數增長

指數增長這個詞應該大傢都不會陌生,特別是在去年一開始疫情爆發時期我們可以在新聞報道中會經常聽到這個詞匯。

關於指數增長,我們首先可以查看百度百科,看到有兩個對應的詞條:指數增長 和 指數式增長。一個是從貨幣投資的角度來舉例解釋,另一個是從數學角度來表示。 篇幅都不大,並且看上去除瞭名字好像沒什麼關聯,但其中隱藏的關鍵信息是密切相關的。

首先,我們看關於 指數增長 的百科解釋 ,它得到瞭一個非常關鍵的概念,就是 復利, 這個是銀行傢獲取收益的一個利器。 按照裡面的方式,我們總結出以下公式 來計算 人口增長 或者 收益。

a_{n} = a_0 (1 + rate)^{n}

其中 a_n 代表 n 年之後的人口,或者總的本金加收益, a_0 表示開始第1年時候 的人口或者本金, 其中rate為增長率。 這個就是指數增長的一般表達式。

我們現在返過來看 百科上另一個相關的詞條——指數式增長, 這這裡面沒有放數學公式,但在右邊放瞭一張圖。 這張圖的表達式其實就是

y=a^x

這個就是指數函數的本來面貌,我們可以在百度百科上看到看詳細的介紹。其中兩者形式上沒有太大的差別, 隻不過一個來表示 離散型的增長, 一個表示連續型的增長(離散型數據我們後面可以用散點圖畫面,連續型數據我們用曲線來表示)。 這裡面有個最為特殊的就是

y=e^x

它們之前其實可以進行相互轉換

a^x = e^xln{a}

我們使用 繪圖神器—— GeoGebra 將它們畫出來可以發現, 它們的形狀基本上都是一樣的(都是曲線,並且從左往右方向是從 0 到 正無窮增長的)。

或者我們在x 的前面加上一個負數,於是就有

這個時候我們就得到一組,形狀來原來完全一樣,但曲線的走勢剛好相反的曲線瞭(從正無窮到0)。

自然數是什麼來的?

在後面講這些曲線的實際意義之前,我們先來解決一個困惑,就是前面表達式中那個 e 是怎麼來的?

關於 e 的起源, 還是得回到投資中的復利問題中上來。我們拿一個例子來說明,假設我現在是出款方,你現在從我這裡借10000塊錢過去,按一年12%的利息來算。一年之後,你要還給我 10000 * (1 +12%) = 11200 元。 當然,也可以從投資角度 來理解 成, 我拿出10000 出去投資,一年後收到投資收益1200元,年化收益12%。 從出錢人的角度來講,肯定是希望這一年的收益越來越高對不,而且一年後才收完款,這個風險還有的。我們現在提供另一種方式,我們希望半年結算一次,我們把 利率 除以2,一年計2次, 看一年之後的結果會怎樣。這個時候 收益就是

10000 * (1 + frac{12%}{2})^2 = 11236

這個時候我們驚奇的發現,比原來多收瞭36塊錢,看來復利是個好東西。那麼自然而然就想到, 如果我把結算的周期縮得更短會怎麼樣,比如說你一個月還一次錢。那麼這個時候就有

10000 * (1 + frac{12%}{12})^{12} = 11268.25

我們會發現收益會更多一些。於是我有瞭一個邪惡的想法,如果我繼續不斷縮短結算周期,我的收益會不會一直漲上去。 還是說它會有個上限?直覺來講, 隨著周期縮短, 它的收益還會再漲, 但它會有一個極限。 我們生活中已經出現瞭這種例子瞭,我們從借唄上借款的話,它就是按天來計的。如果條件允許的話,也可以極致的按分按秒來計復利,利滾利。這個對於投資方(被借款方)來說是個好事, 但是對於被投資方(借款方)來講壓力就很大的。

我們還是可以用GeoGebra 來算一下。 我們發現,當我們把這個 n 不段向右滑動時,最後的結果一直都不會超過11275元。 也就是它實際上是存在一個上限的。 這個上限就引出瞭 自然數e。

按照 極限的定義,自然數 e 就是

e = lim_{n rightarrow infty} (1 + frac{1}{n})^n approx 2.7183

這裡我們還是要感謝這個 e 給復利的增長設瞭一個上限, 不然對於一般人來說,還貸的壓力隻會更大。

利用指數增長規律進行業績預測

接下來,我們來講一個指數曲線應用的例子。 我們可以在網上輕易搜到某寶歷年雙十一數據,並觀察它的圖像。從圖中可以看出, 它的增長很像一條指數曲線,那麼我們是不是可以利用這條指數曲線來預測下一年的銷售情況。答案是肯定的,而且我們並不是因為看著它像就直接應用。

我們先看一下如何來用一條曲線來預測,首先說明一下, 實際使用的時候並不一定真的會用指數曲線來模擬。這裡我們可以使用泰勒展開的方法,將指數函數展開成一個多方式來進行運算(說實話,級數就是幹這個來用的,計算機嚴格意義來上說,隻會算加法,你還真指望它給你求冪函數嗎?)。

這個時候就可以使用matlab,或者python裡的numpy中的polyfit() 函數來完成這項操作(我更傾向於numpy,開源又免費用起來不香嗎?)。

完整代碼我就放在下面瞭

import numpy as np
import matplotlib.pyplot as plt

# 建立一個列表,存儲歷年銷售額數據
sales_2009_2019 = [
0.52 # year 2009
, 9.36 # year 2010
, 33.6
, 132
, 352
, 571
, 912
, 1207
, 1682
, 2135 # year 2018
, 2684 # year 2019
]

# 取出前面2009-2018年 數據, 用來預測 2019年數據
s = sales_2009_2019[:-1]
t = np.arange(len(s))
years = t + 2009

# 打印看下中間結果
print("years: ", years)
print('sales from {} to {}:'.format(years[0], years[-1]) + str(s))

#%%

# 先打印並觀察增長曲線的特征
plt.plot(range(len(s)), s)
# 在圖中添加每個點的數值
for x, y in zip(range(len(s)), s):
plt.text(x-0.4, y+0.2, '%.2f' % y, fontdict={'fontsize': 8})

# 設置x軸標簽為2009~2018
plt.xticks(range(len(s)), years)

# 設置顯示中文
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.xlabel('2009-2018年')
plt.ylabel('銷售額/億')
plt.show()

#%%

k = 5
# 計算插值多項式系數,使用5次擬合
c = np.polyfit(t, s, k)

#%%

# 計算插值多項式
y = 0
for i in range(k):
y += c[i] * len(s) ** (k-i)

s.append(y)

t = np.arange(len(s))
print("預計" + str(t[-1] + 2009) + '年**雙11銷售額為' + str(round(y,2)) + '億元')

赞(0)