You need to enable JavaScript to run this app. 如何在matplotlib共振振幅动画中正确调整共振频率实现峰值平移
优惠活动
大模型
产品
解决方案
定价
更多

如何在matplotlib共振振幅动画中正确调整共振频率实现峰值平移

核心问题根因

你当前代码的动画逻辑存在三处根本性偏差,直接导致曲线上下跳动而非左右平移:

  • 动画更新阶段错误修改了x轴的采样点偏移(A(f + i/5)),完全没有调整公式里的共振频率核心参数fRes,计算出的曲线既存在x方向的错位,也会因为参数不匹配出现幅值乱跳
  • 原始振幅公式的峰值随fRes变化,没有做归一化处理的话,哪怕正确更新fRes,曲线也会出现峰值高度浮动的问题
  • 存在低级变量名拼写错误:定义的上限变量写为fresMax(小写r),后续调用会直接触发未定义报错
正确实现逻辑

要实现“x轴固定、峰值高度恒定、共振峰在x轴上左右往复平移”的效果,每帧动画只需要做3件事:

  1. 固定x轴的采样范围始终为[32600, 32800],不随帧变化修改x轴坐标
  2. 每帧动态更新振幅公式里的共振频率fRes值,让它在你设定的上下限之间做线性往复运动,驱动共振峰左右移动
  3. 对每帧算出的振幅曲线做归一化处理,把每个fRes对应的峰值拉到统一高度,彻底消除曲线上下跳动的问题
可直接运行的修正代码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# 固定参数配置
fMin, fMax = 32600, 32800  # 固定x轴范围,全程不变化
B = 0.5
fResMin, fResMax = fMin * 1.00005, fMax * 0.9995  # 修正之前的拼写错误
f = np.linspace(fMin, fMax, 1000)  # 提高采样点密度,让曲线更平滑

# 振幅计算函数,支持传入动态的fRes参数
def calc_amp(f, f_res, damping):
    raw_amp = 1 / ((f_res**2 - f**2)**2 + 4*(damping**2)*(f**2))
    # 归一化:让每个共振曲线的峰值固定为1,消除上下跳动
    norm_amp = raw_amp / raw_amp.max()
    return norm_amp

# 初始化画布,固定轴范围避免自适应缩放导致的跳动
fig, ax = plt.subplots(figsize=(8,4))
ax.set_xlim(fMin, fMax)
ax.set_ylim(0, 1.1)
line, = ax.plot(f, calc_amp(f, (fResMin+fResMax)/2, B), lw=2)

def animate(i):
    # 让fRes在上下限之间做三角往复运动:从下限到上限,再回到下限
    frame_count = 100  # 一个完整往复周期的总帧数
    cycle_pos = i % (2 * frame_count)
    if cycle_pos < frame_count:
        current_fres = fResMin + (fResMax - fResMin) * cycle_pos / frame_count
    else:
        current_fres = fResMax - (fResMax - fResMin) * (cycle_pos - frame_count) / frame_count
    # 只更新y轴的数值,x轴全程固定不动
    updated_amp = calc_amp(f, current_fres, B)
    line.set_ydata(updated_amp)
    return line,

ani = animation.FuncAnimation(
    fig, animate, interval=30, blit=True, save_count=200)

# 如果需要导出GIF,需提前配置imagemagick支持
# ani.save("resonance_animation.gif", dpi=150)
plt.show()
关键逻辑说明
  • 采用三角波方式生成fRes的动态值,不需要额外依赖就能实现自然的左右往复滑动,不会出现突然跳回起点的生硬感
  • 强制固定x、y轴的显示范围,关闭matplotlib的自适应缩放,哪怕曲线移动位置,坐标框也不会跟着晃动
  • 归一化处理是解决峰值上下跳动的核心:每个fRes对应的共振曲线峰值理论上出现在f≈fRes的位置,把这个位置的幅值固定为1,就完全实现了“只有位置变、高度不变”的效果
  • 将采样点从200提升到1000,是为了避免fRes变化时曲线出现锯齿感,让移动过程更顺滑

内容的提问来源于stack exchange,提问作者ExactPlace441

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 11:45:04