李萨如图形是一种复杂的周期性曲线,由两个简谐振动在垂直方向上的合成而成。这种图形以19世纪法国数学家朱尔·安托万·李萨如(Jules Antoine Lissajous)的名字命名,因为他首次系统地研究了这些图形。
以下是关于李萨如图形的一些关键点:
形成原理:
李萨如图形是由两个正交方向(通常是x轴和y轴)上的简谐运动合成而成。这两个运动可以用正弦或余弦函数表示。
数学表达式:
一般形式可以表示为:
x = A sin(at + δ)
y = B sin(bt)
其中,A和B是振幅,a和b是角频率,δ是相位差,t是时间变量。
影响图形的因素:
频率比(a:b):决定了图形的基本形状
相位差(δ):影响图形的具体形态
振幅比(A:B):决定图形的宽高比
常见图形:
当频率比为1:1时,可能形成圆形、椭圆形或直线(取决于相位差)
当频率比为1:2时,可能形成类似8字形的图案
更复杂的频率比会产生更复杂的图案
应用:
音乐和声学:分析声音波形
电子学:测量相位差和频率
物理学:研究振动和波动现象
艺术:创作视觉艺术作品
为了更好地理解李萨如图形,让我们创建一个简单的交互式示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>交互式李萨如图形</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>
<style>
body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f0f0f0; }
#controls { margin-left: 20px; }
</style>
</head>
<body>
<div id="sketch-holder"></div>
<div id="controls">
<label for="freqX">X频率: </label>
<input type="range" id="freqX" min="1" max="10" value="1"><br>
<label for="freqY">Y频率: </label>
<input type="range" id="freqY" min="1" max="10" value="1"><br>
<label for="phase">相位差: </label>
<input type="range" id="phase" min="0" max="360" value="0">
</div>
<script>
let t = 0;
let freqX, freqY, phase;
function setup() {
let canvas = createCanvas(400, 400);
canvas.parent('sketch-holder');
freqX = select('#freqX');
freqY = select('#freqY');
phase = select('#phase');
}
function draw() {
background(240);
translate(width/2, height/2);
let x = sin(t * freqX.value()) * 150;
let y = sin(t * freqY.value() + radians(phase.value())) * 150;
stroke(0);
noFill();
ellipse(x, y, 5, 5);
t += 0.05;
if (t > TWO_PI) {
t = 0;
}
}
</script>
</body>
</html>
将上述代码保存为html结尾的文件,打开后可以通过调整X轴频率、Y轴频率和相位差来探索不同的李萨如图形。
当X和Y频率相等时,会看到圆或椭圆形。
当频率比为简单的整数比(如1:2, 2:3等)时,会看到稳定的封闭图形。
改变相位差会使图形旋转或改变形状。
当然也可以使用python来绘制李萨如图形:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号'-'显示为方块的问题
# 初始参数
a = 1 # x频率
b = 1 # y频率
delta = np.pi/2 # 相位差
t = np.linspace(0, 2*np.pi, 1000)
# 创建图形
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.3)
x = np.sin(a * t)
y = np.sin(b * t + delta)
line, = ax.plot(x, y)
ax.set_xlim(-1.1, 1.1)
ax.set_ylim(-1.1, 1.1)
ax.set_aspect('equal', adjustable='box')
ax.set_title('李萨如图形')
# 创建滑块
ax_freq_x = plt.axes([0.2, 0.15, 0.6, 0.03])
ax_freq_y = plt.axes([0.2, 0.1, 0.6, 0.03])
ax_phase = plt.axes([0.2, 0.05, 0.6, 0.03])
s_freq_x = Slider(ax_freq_x, 'X频率', 1, 10, valinit=a, valstep=1)
s_freq_y = Slider(ax_freq_y, 'Y频率', 1, 10, valinit=b, valstep=1)
s_phase = Slider(ax_phase, '相位差', 0, 2*np.pi, valinit=delta)
# 更新函数
def update(val):
a = s_freq_x.val
b = s_freq_y.val
delta = s_phase.val
x = np.sin(a * t)
y = np.sin(b * t + delta)
line.set_xdata(x)
line.set_ydata(y)
fig.canvas.draw_idle()
# 连接滑块到更新函数
s_freq_x.on_changed(update)
s_freq_y.on_changed(update)
s_phase.on_changed(update)
# 重置按钮
reset_ax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(reset_ax, '重置', hovercolor='0.975')
def reset(event):
s_freq_x.reset()
s_freq_y.reset()
s_phase.reset()
button.on_clicked(reset)
plt.show()
在有相应的库的情况下可以运行代码得到上图。