数字水印 | 混沌逻辑斯谛映射(Chaotic Logistic Map)基本原理及 Python 代码实现

本文主要是介绍数字水印 | 混沌逻辑斯谛映射(Chaotic Logistic Map)基本原理及 Python 代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

      • 1 基本原理
      • 2 代码实现
      • 3 分岔图代码实现



1 基本原理

参考:维基百科 - 逻辑斯谛映射

逻辑斯谛映射(Logistic Map)是一种二次多项式的映射递推关系式,是一个由简单非线性方程式产生混沌现象的经典范例。其数学表达为:
x n + 1 = μ x n ( 1 − x n ) x_{n+1}=\mu x_n(1-x_n) xn+1=μxn(1xn)
其中,参数 μ \mu μ 通常取 ( 0 , 4 ] (0, 4] (0,4] 区间内的值,因此 x n x_n xn [ 0 , 1 ] [0, 1] [0,1] 上保持有界。

个人理解:可以把 x n x_n xn 看作是变量 X X X 在第 n n n 时刻的值,把 x n + 1 x_{n+1} xn+1 看作是变量 X X X 在第 n + 1 n+1 n+1 时刻的值。根据上述公式可知, x n + 1 x_{n+1} xn+1 的值是根据 x n x_n xn 的值计算出来的,即当前时刻的值是由上一时刻的值计算而来的,因此被称为递推关系式。

针对 x n x_n xn [ 0 , 1 ] [0, 1] [0,1] 上保持有界,参考下图:

在这里插入图片描述

个人理解:如果初值 x 0 x_0 x0 的值在 0 0 0 1 1 1 之间,那么根据二次函数的表达式, x n x_n xn 的值也必定在 0 0 0 1 1 1 之间。因此,我们说 x n x_n xn [ 0 , 1 ] [0, 1] [0,1] 上保持有界。




参数 μ \mu μ 的取值

  • 0 0 0 1 1 1 之间:不论起始数值 x 0 x_0 x0 为何, x n x_n xn 会越来越少,最后趋近于 0 0 0
  • 1 1 1 2 2 2 之间:不论起始数值 x 0 x_0 x0 为何, x n x_n xn 会快速地趋近 μ − 1 μ \frac{\mu-1}{\mu} μμ1
  • 2 2 2 3 3 3 之间:经过几次迭代, x n x_n xn 会越来越接近 μ − 1 μ \frac{\mu-1}{\mu} μμ1,而且收敛速度是线性的;
  • 3 3 3 x n x_n xn 仍然会越来越接近 μ − 1 μ \frac{\mu-1}{\mu} μμ1,但收敛速度较为缓慢,而且不是线性的;

个人理解:迭代次数就是指 x n + 1 = μ x n ( 1 − x n ) x_{n+1}=\mu x_n(1-x_n) xn+1=μxn(1xn) 计算了多少次,即 x n + 1 x_{n+1} xn+1 是初值 x 0 x_0 x0 迭代 n + 1 n+1 n+1 次的结果。

在这里插入图片描述

说明:由于散点图中的点粘在一起,看不出值的变化,因此我画的是折线图。但需要注意的是, x n + 1 x_{n+1} xn+1 的取值只会是一个个的点,而不包含图中的直线。

  • 3 3 3 1 + 6 ≈ 3.45 1+\sqrt{6}\approx3.45 1+6 3.45 之间:不论起始数值 x 0 x_0 x0 为何, x n x_n xn 最终会在 2 2 2 个值之间持续震荡;
  • 1 + 6 ≈ 3.45 1+\sqrt{6}\approx3.45 1+6 3.45 ≈ 3.54 \approx3.54 3.54 之间: x n x_n xn 最终会在 8 , 16 , 32 , . . . 8,16,32,... 8,16,32,... 个值之间持续震荡;
  • ≈ 3.5699 \approx3.5699 3.5699:震荡消失,系统进入混沌状态。不论起始数值 x 0 x_0 x0 为何,都不会再出现固定周期的震荡;

在这里插入图片描述

可以看出 μ \mu μ 越大, x n x_{n} xn 的震荡越没有周期性。



2 代码实现

参考:https://www.jianshu.com/p/580e36a34378

控制参数 μ \mu μ 的值不变,迭代 100 100 100 次,观察这 100 100 100 次中 x n x_{n} xn 值的变化:

import matplotlib.pyplot as plt
import numpy as npn = 1  # 控制迭代次数
x = 0.2  # 初值
mu = 2  # 参数μnum = []  # 存放x轴坐标
logistic_num = []  # 存放y轴坐标while n < 100:x = mu * x * (1.0 - x)  # 计算x_{n+1}的值num.append(n)  # 纳入该点的x轴坐标logistic_num.append(x)  # 纳入该点的y轴坐标n = n + 1# 画图
plt.plot(num, logistic_num, linestyle='-', linewidth=1.0)
plt.ylim(0, 1)
plt.yticks(np.arange(0, 1.2, 0.2))plt.savefig('{mu}.jpg'.format(mu=mu), dpi=400, bbox_inches='tight')
plt.show()

前文的两张图就是用这段代码绘制的。



3 分岔图代码实现

参考:https://blog.csdn.net/laplacebh/article/details/104598545

为参数 μ \mu μ 设置不同的值,迭代 1100 1100 1100 次,观察 1000 1000 1000 1100 1100 1100 次中 x n x_{n} xn 值的变化:

import matplotlib.pyplot as plt
import numpy as npdef logistic_map():mu = np.arange(2, 4, 0.0001)print(mu)  # [2.     2.0001 2.0002 ... 3.9997 3.9998 3.9999]x = 0.2  # 初值t1 = 1000  # 前1000次t2 = 100  # 后100次for i in range(t1 + t2):x = mu * x * (1 - x)if i >= t1:  # 只绘制1000~1100次的结果plt.plot(mu, x, ',k', alpha=0.25)plt.show()logistic_map()

由于我们想要观察的是 x n x_n xn 最终收敛或者未收敛的值,因此虽然做了 1100 1100 1100 次的迭代,但是我们只会绘制最后 100 100 100 x n ( x 1000 , . . . , x 1100 ) x_n(x_{1000},...,x_{1100}) xn(x1000,...,x1100) 的值。

效果如下图所示:

在这里插入图片描述
个人理解:

μ \mu μ 2 2 2 3 3 3 之间时,由于 x n x_n xn 最终会收敛到一个固定的值上,因此迭代 1000 1000 1000 1100 1100 1100 次之间的 x n x_n xn 值相同,汇聚在了上图中的一个点上。当 μ \mu μ 3 3 3 ≈ 3.45 \approx3.45 3.45 之间时,由于 x n x_n xn 最终会在 2 2 2 个值之间震荡,因此汇聚在了上图中的两个点上。

在这里插入图片描述

我们也可以反过来看,即根据结果推测原因。当 μ \mu μ ≈ 3.45 \approx3.45 3.45 ≈ 3.54 \approx3.54 3.54 之间时,由于 x n x_n xn 的值汇聚在了上图中的四个点上,因此可以看出 x n x_n xn 最终会在 4 4 4 个值之间震荡。



这篇关于数字水印 | 混沌逻辑斯谛映射(Chaotic Logistic Map)基本原理及 Python 代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010686

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可