深入淺出logistic混沌映射

混沌映射是非線性動力學中經常出現的一個重要概念,它是一種簡單的模型,可以產生看起來隨機的複雜性。常見的混沌映射有 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 倉庫:

https://github.com/morvanzhou/neural-networks-and-deep-learning/blob/master/contents/section2/demo/script.py

四、結束語

總結一下,我們在本文中深入闡述了 Logistic 混沌映射的本質、計算方式、應用場合等。Logistic 混沌映射為我們研究非線性動力學問題提供了簡單粗暴的方法,例如模擬天氣預報、地震預警等。\n我們在本文中提供了多個 Code 示例,可以直接運行並修改。

原創文章,作者:ETOIY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369135.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ETOIY的頭像ETOIY
上一篇 2025-04-12 13:00
下一篇 2025-04-12 13:00

相關推薦

  • 深入淺出統計學

    統計學是一門關於收集、分析、解釋和呈現數據的學科。它在各行各業都有廣泛應用,包括社會科學、醫學、自然科學、商業、經濟學、政治學等等。深入淺出統計學是指想要學習統計學的人能夠理解統計…

    編程 2025-04-25
  • Logistic映射研究

    一、基礎介紹 Logistic映射是一種典型的混沌系統,具體表現為:任意一個不同的初始值在Logistic映射下迭代,最終都會趨向於一種在[0,1]區間內無規律的周期性變化。Log…

    編程 2025-04-25
  • 深入淺出torch.autograd

    一、介紹autograd torch.autograd 模塊是 PyTorch 中的自動微分引擎。它支持任意數量的計算圖,可以自動執行前向傳遞、後向傳遞和計算梯度,同時提供很多有用…

    編程 2025-04-24
  • 深入淺出SQL佔位符

    一、什麼是SQL佔位符 SQL佔位符是一種佔用SQL語句中某些值的標記或佔位符。當執行SQL時,將使用該標記替換為實際的值,並將這些值傳遞給查詢。SQL佔位符使查詢更加安全,防止S…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web伺服器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • 深入淺出ThinkPHP框架

    一、簡介 ThinkPHP是一款開源的PHP框架,它遵循Apache2開源協議發布。ThinkPHP具有快速的開發速度、簡便的使用方式、良好的擴展性和豐富的功能特性。它的核心思想是…

    編程 2025-04-24
  • 深入淺出arthas火焰圖

    arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。artha…

    編程 2025-04-24
  • 深入淺出AWK -v參數

    一、功能介紹 AWK是一種強大的文本處理工具,它可以用於數據分析、報告生成、日誌分析等多個領域。其中,-v參數是AWK中一個非常有用的參數,它用於定義一個變數並賦值。下面讓我們詳細…

    編程 2025-04-24
  • 深入淺出Markdown文字顏色

    一、Markdown文字顏色的背景 Markdown是一種輕量級標記語言,由於其簡單易學、易讀易寫,被廣泛應用於博客、文檔、代碼注釋等場景。Markdown支持使用HTML標籤,因…

    編程 2025-04-23
  • 深入淺出runafter——非同步任務調度器的實現

    一、runafter是什麼? runafter是一個基於JavaScript實現的非同步任務調度器,可以幫助開發人員高效地管理非同步任務。利用runafter,開發人員可以輕鬆地定義和…

    編程 2025-04-23

發表回復

登錄後才能評論