数字水印 | 混沌逻辑斯谛映射(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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法