利萨如图形详解:原理与Python动态绘制
一、利萨如图形简介
利萨如图形(Lissajous curve) 是一种由两个正弦波在垂直方向叠加产生的二维曲线,常用于信号处理、振动分析、视觉艺术等领域。
数学表达式:
其中:
A,B:振幅(控制图形在 x 和 y 方向的大小)
a,b:频率(控制图形的重复次数与形状)
δ:相位差(控制图形的旋转或对称性)
二、图形特性分析
当 a:b为简单整数比时,利萨如图形为闭合图案;
δ=0:图形通常关于 x=y 或 x=-y 对称;
不同的频率比 a:b 会产生不同形状的“花瓣”、“∞”型、椭圆等图形;
改变相位差 δ 会让图形“旋转”或发生对称变化。
三、Python 动态绘制源码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation# 设置基本参数
A = 1 # x方向振幅
B = 1 # y方向振幅
a = 5 # x方向频率
b = 4 # y方向频率# 时间序列:生成足够平滑的曲线
t = np.linspace(0, 2 * np.pi, 1000)# 创建图形窗口和坐标轴
fig, ax = plt.subplots()
ax.set_aspect('equal') # 保持 x/y 比例一致
ax.set_xlim(-1.2, 1.2)
ax.set_ylim(-1.2, 1.2)
ax.set_title("Lissajous Curve Animation")
ax.grid(True)# 初始化一条曲线(动态更新的数据)
line, = ax.plot([], [], lw=2, color='blue')# 初始化函数:清空线条
def init():line.set_data([], [])return line,# 动画函数:每一帧更新图像
def animate(i):# i: 帧编号,从 0 到 frames-1# 将相位差 delta 作为动态变化的量delta = 2 * np.pi * i / 100# 计算当前帧的曲线x = A * np.sin(a * t + delta)y = B * np.sin(b * t)# 更新曲线数据line.set_data(x, y)return line,# 创建动画对象
ani = animation.FuncAnimation(fig, # 图形窗口animate, # 动画更新函数frames=100, # 动画帧数init_func=init, # 初始化函数interval=50, # 每帧间隔(ms)blit=True # 启用 blitting 优化
)plt.show()