You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何串联3个简谐振子?基于Python简谐振子代码实现级联

3个同参数串联简谐振子实现方案

修改逻辑

原代码实现的是单个无驱动自由简谐振子的数值求解,要实现3个相同振子串联,核心调整如下:

  • 单个振子包含「位移、速度」2个状态变量,3个串联振子共需维护6个状态变量,顺序为[x0, v0, x1, v1, x2, v2],分别对应第1/2/3个振子的位移和速度
  • 第一个振子保持原自由振荡的动力学规则,初始条件沿用原设置:初始位移0,初始速度2;其余两个振子初始状态为静止在平衡位置(位移0、速度0)
  • 串联振子为耦合动力学系统:后一个振子的受力由相邻前一个振子的位移差决定,所有振子保持相同的omega_sq参数
  • 一次性求解整个耦合系统的状态演化,最终同时绘制3个振子的位移随时间变化曲线方便对比

修改后完整代码

import numpy as np 
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

# 时间轴参数和原代码保持一致
t = np.linspace(0, 15, 1000)
omega_sq = 1
# 初始状态:[第1个振子位移, 第1个振子速度, 第2个振子位移, 第2个振子速度, 第3个振子位移, 第3个振子速度]
init_state = [0, 2, 0, 0, 0, 0]

def series_oscillator(t, state):
    x0, v0, x1, v1, x2, v2 = state
    # 位移的导数是速度,速度的导数是加速度(由弹簧弹力提供)
    dx0 = v0
    dv0 = -omega_sq * x0  # 第一个振子一端固定,回复力仅和自身位移相关
    dx1 = v1
    dv1 = -omega_sq * (x1 - x0)  # 第二个振子受力由前后位移差决定
    dx2 = v2
    dv2 = -omega_sq * (x2 - x1)  # 第三个振子受力由前后位移差决定
    return [dx0, dv0, dx1, dv1, dx2, dv2]

# 求解耦合系统
res = solve_ivp(series_oscillator, t_span=[t.min(), t.max()], y0=init_state, t_eval=t)

# 绘制三个振子的位移曲线
plt.plot(t, res.y[0], label='Oscillator 1')
plt.plot(t, res.y[2], label='Oscillator 2')
plt.plot(t, res.y[4], label='Oscillator 3')
plt.ylabel("Position")
plt.xlabel("Time")
plt.title('3 Series Coupled Simple Harmonic Oscillators', fontsize=16)
plt.legend()
plt.show()

补充说明

如果你需要的是信号级联模式(即前一个振子的输出作为独立外驱动信号输入给后级振子,而非物理弹簧刚性耦合),只需要把后级振子的动力学方程改为受迫振动形式,分三次依次求解即可:先算出第一个振子的位移序列,通过插值把该序列作为驱动项输入第二个振子求解,再用第二个振子的输出驱动第三个振子。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:03:33