混沌映射是非線性動力學中經常出現的一個重要概念,它是一種簡單的模型,可以產生看起來隨機的複雜性。常見的混沌映射有 Logistic 映射、Henon 映射、Ikeda 映射等等。本文將深入淺出地介紹 Logistic 混沌映射及它的一些應用。我們首先從 Logistic 函數的定義開始。
一、Logistic 函數
Logistic 函數的定義如下:
def logistic(r, x):
return r*x*(1-x)
其中,r 為參數,用於控制複雜度,常常取值在 3.6 到 4.0 之間。x 為輸入,取值範圍為 [0,1]。該函數將一個輸入值映射為 [0,1] 之間的新值。
下面是一個 Logistic 函數輸出-輸入的圖像,它展示了 Logistic 函數的性質:
import matplotlib.pyplot as plt
def show_logistic():
r = 3.8
x = [0.5]
for i in range(200):
x.append(logistic(r, x[-1]))
fig, ax = plt.subplots()
ax.plot(x, 'b-', label='logistic map')
ax.plot([0, 200], [0.5, 0.5], 'r--', label='y=0.5')
ax.legend()
ax.set_xlabel('time')
ax.set_ylabel('Xt')
plt.show()
show_logistic()
二、Logistic 映射及混沌性質
Logistic 函數可以進一步用來定義 Logistic 映射,即:使用一個初始值,通過反覆使用 Logistic 函數,得到一個序列,稱之為 Logistic 映射序列。
def logistic_map(r, x0, n):
result = []
xt = x0
for i in range(n):
result.append(xt)
xt = logistic(r, xt)
return result
下面是 Logistic 映射在不同參數下的輸出結果:
def show_logistic_map():
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(10, 6))
x0 = 0.2
n = 1000
r_values = [2.4, 2.8, 3.2, 3.6, 3.8, 4.0]
for r, ax in zip(r_values, axes.flatten()):
ax.plot(logistic_map(r, x0, n), 'b.', markersize=1)
ax.set_title(f"r = {r}")
plt.tight_layout()
plt.show()
show_logistic_map()
可以看到,當 r 取不同的值時,序列會展現出不同的路徑,部分路徑會變得非常複雜。
Logistic 映射的混沌性質,體現在它的輸出序列的初值敏感性上。即,微小的初始變化,可能會導致序列朝著完全不同的方向發展。例如,下面是兩個 Logistic 映射序列在初始值上僅相差 0.0001 的情況下的對比:
r = 3.9
x0_1 = 0.6
x0_2 = 0.6001
plt.plot(logistic_map(r, x0_1, 500), 'b-', label=f'x0 = {x0_1}')
plt.plot(logistic_map(r, x0_2, 500), 'r-', label=f'x0 = {x0_2}')
plt.legend()
plt.show()
這說明 Logistic 映射序列對於初始值的依賴性越來越大,進而畫出的圖像變得亂糟糟的。
三、應用
1. 圖像加密
Logistic 映射可以廣泛應用於圖像加密。基本思路是,將圖像像素的灰度值作為輸入初始值,產生 Logistic 映射序列,然後將序列的值乘以 255 得到一組新的灰度值,至此完成加密。解密時,將新的灰度值輸入到 Logistic 映射中,得到的序列再次乘以 255 就可以得到原始的灰度值。
def logistic_encryption(image, r, x0):
rows, cols = image.shape
data_len = rows*cols
logistic_seq = np.array(logistic_map(r, x0, data_len))
encryption_data = (logistic_seq * 255).reshape(rows, cols)
encrypted_image = image ^ encryption_data.astype(np.uint8)
return encrypted_image
def logistic_decryption(encrypted_image, r, x0):
rows, cols = encrypted_image.shape
data_len = rows*cols
logistic_seq = np.array(logistic_map(r, x0, data_len))
encryption_data = (logistic_seq * 255).reshape(rows, cols)
decrypted_image = encrypted_image ^ encryption_data.astype(np.uint8)
return decrypted_image
2. 人工神經元
Logistic 映射可以用於神經元,它的特點是可以在 0 和 1 之間緩慢地變化,並以某個 r 值為中心,單調減小或增加。
神經元的核心公式就是 Logistic 映射:
def logistic_neuron(w, x, theta):
return logistic(np.dot(w, x)-theta, 1)
w = np.array([1, -2])
x = np.array([1, 0.5])
theta = 0
logistic_neuron(w, x, theta)
其中,w 和 x 是權重和輸入的向量,theta 是閾值。實現代碼參考下面的 Github 倉庫:
四、結束語
總結一下,我們在本文中深入闡述了 Logistic 混沌映射的本質、計算方式、應用場合等。Logistic 混沌映射為我們研究非線性動力學問題提供了簡單粗暴的方法,例如模擬天氣預報、地震預警等。\n我們在本文中提供了多個 Code 示例,可以直接運行並修改。
原創文章,作者:ETOIY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369135.html