如何编写支持自定义时间延迟的正弦函数交叉递归图(CRP)生成代码
如何编写支持自定义时间延迟的正弦函数交叉递归图(CRP)生成代码
嘿,我完全懂你想要的效果——本质就是对比sin(x)和延迟了tau后的sin(x+tau)序列,生成它们的交叉递归图(CRP)对吧?我给你写一段Python实现,步骤清晰还能让你自定义参数,直接就能跑起来!
核心思路
交叉递归图的本质是一个二维矩阵,其中每个元素CRP[i][j]标记的是:原始序列的第i个点和延迟后序列的第j个点是否满足「距离小于设定阈值」的递归条件,满足就标1,不满足标0,最后把这个矩阵绘制成热力图就行。
完整实现代码
import numpy as np import matplotlib.pyplot as plt def generate_crp_sin(tau, x_start=0, x_end=10*np.pi, num_points=500, epsilon=0.1): # 1. 生成原始sin(x)序列和延迟后的sin(x+tau)序列 x = np.linspace(x_start, x_end, num_points) y = np.sin(x) z = np.sin(x + tau) # 这里就是你要的延迟tau后的序列 # 2. 计算交叉递归矩阵 crp_matrix = np.zeros((num_points, num_points), dtype=int) for i in range(num_points): for j in range(num_points): # 判断两个点的距离是否小于阈值epsilon if np.abs(y[i] - z[j]) < epsilon: crp_matrix[i][j] = 1 # 3. 绘制交叉递归图 plt.figure(figsize=(8, 8)) plt.imshow(crp_matrix, cmap='binary', origin='lower', extent=[x_start, x_end, x_start, x_end]) plt.xlabel('sin(x) 序列索引/时间') plt.ylabel('sin(x+tau) 序列索引/时间') plt.title(f'交叉递归图 (时间延迟 tau = {tau:.2f})') plt.colorbar(ticks=[0, 1], label='递归状态 (1=满足, 0=不满足)') plt.show() # 示例:用户输入时间延迟tau,比如tau=np.pi/2 user_tau = float(input("请输入时间延迟tau: ")) generate_crp_sin(user_tau)
代码说明
- 自定义参数:你可以调整
x_start/x_end来改变x的范围,num_points控制序列的点数(点数越多图越精细),epsilon是递归判断的阈值——阈值越小,图里的白色点(满足递归)越少,你可以根据需要调整。 - 核心逻辑:双重循环遍历两个序列的所有点对,计算欧氏距离(这里因为是一维序列,就是绝对值差),判断是否小于阈值,生成0/1矩阵。
- 绘图部分:用
imshow绘制热力图,binary配色能清晰展示黑白的递归状态,origin='lower'让坐标轴从左下开始,符合常规的时间序列展示习惯。
效果说明
当你输入不同的tau时,图里的图案会跟着变化——比如tau=π/2时,sin(x)和sin(x+π/2)=cos(x)的交叉递归图会呈现出斜向的条纹,这正是两个正交正弦序列的递归特征。
备注:内容来源于stack exchange,提问作者Vitoria
相关产品推荐
相关产品推荐

