有阻尼单自由度系统的自由振动

有阻尼单自由度系统的自由振动

单自由度粘性阻尼系统的自由振动响应就是求下列方程的解

\[\begin{cases} m\ddot{x}(t)+c\dot{x}(t)+kx(t)=0 &(1\text{a})\\ \tag{1} x(0)=x_0,\ \dot{x}(0)=\dot{x}_0 &(1\text{b}) \end{cases} \]

根据常微分方程理论,它的解具有如下形式

\[x(t)=\bar{x}e^{st} \tag{2} \]

将其代入式(1a),得到相应的特征方程

\[ms^2+cs+k=0 \tag{3} \]

解出一对特征根

\[s_{1,2}=-\frac{c}{2m}\pm\sqrt{\left(\frac{c}{2m}\right)^2-\frac{k}{m}} \tag{4} \]

引入一无量纲参数\(\zeta\),使它等于根号内\(c/2m\)\(\sqrt{k/m}\)之间相差的常数倍数,即

\[\zeta \stackrel{def}{=}\frac{c}{2m}\bigg/\sqrt{\frac{k}{m}}=\frac{c}{2\sqrt{mk}}=\frac{c}{2m\omega_n}=\frac{c}{c_c} \tag{5} \]

其中\(\omega_n\)是系统的固有频率,定义\(c_c=2m\omega_n\)为系统临界阻尼系数,参数\(\zeta\)称为阻尼比。
于是,式(4)可写成

\[s_{1,2}=-\zeta\omega_n \pm \omega_n\sqrt{\zeta^2-1} \tag{6} \]

显然,对于不同的阻尼比,上式将给出实特征根或复特征根。

1.过阻尼情况(\(\boldsymbol{\zeta>1}\)

这时特征根(6)是一对互异实根,方程(1)的通解是

\[\begin{align*} x(t) &= \bar{x}_1 e^{s_1 t}+\bar{x}_2 e^{s_2 t}\\ &= A_1 e^{\left(-\zeta+\sqrt{\zeta^2-1}\right)\omega_n t}+A_2 e^{\left(-\zeta-\sqrt{\zeta^2-1}\right)\omega_n t} \end{align*} \tag{7} \]

其中\(A_1\)\(A_2\)是由初始条件确定的两个积分常数。
命上式及其导数中\(t=0\),代入式(1b)左端,解出这两个积分常数

\[A_1=\frac{\dot{x}_0+(\zeta+\sqrt{\zeta^2-1})\omega_n x_0}{2\omega_n\sqrt{\zeta^2-1}},\quad A_2=\frac{-\dot{x}_0-(\zeta-\sqrt{\zeta^2-1})\omega_n x_0}{2\omega_n\sqrt{\zeta^2-1}} \tag{8} \]

将它们代入式(7)即得系统位移响应。
注:
下图实线是典型时间历程,运动按指数规律衰减。可以证明,这种运动至多只过平衡位置一次就会逐渐回到平衡位置,没有振荡特性。
绘图代码见代码1,虚线是两个解,详细推导见附录1
这是位移初始值为0的情况,如果初始值是最大的值,曲线是从最大衰减到0,单调递减。

Figure_1

2.临界阻尼情况(\(\boldsymbol{\zeta=1}\)

这时特征根是一对相等的实根

\[s_{1,2}=-\omega_n \tag{9} \]

方程(1a)的通解为

\[x(t)=(A_1+A_2 t)e^{-\omega_n t} \tag{10} \]

命上式及其导数中\(t=0\),代入式(1b)左端,解出积分常数

\[A_1=x_0,\quad A_2=\dot{x}_0+\omega_n x_0 \tag{11} \]

代入式(10)得到系统的位移响应。

Figure_1

注:
这种运动也按指数规律很快衰减,至多只过平衡点一次,没有振荡特性。实线是临界阻尼条件下典型的位移时间历程。
运动层面:

  • \(\zeta>1\)过阻尼:两个不同衰减指数,回落慢;
  • \(\zeta\to1\)两根靠拢,衰减速度不断加快;
  • \(\zeta=1\)临界阻尼:到达无振荡回落的最快速度;
    解的详细推导见附录2,画图代码见 代码2

3.欠阻尼情况(\(\boldsymbol{0<\zeta<1}\)

这时特征根是一对共轭复根

\[s_{1,2}=-\zeta\omega_n \pm j\omega_n\sqrt{1-\zeta^2} \tag{12} \]

方程(1a)的通解是

\[x(t)=e^{-\zeta\omega_n t}\left(A_1 \cos\omega_d t+A_2 \sin\omega_d t\right) \tag{13} \]

其中

\[\omega_d=\omega_n\sqrt{1-\zeta^2} \tag{14} \]

称为系统的阻尼振动频率或自然频率。显然,它小于系统的固有频率。

令式(13)及其导数中\(t=0\),代入式(1b),解出积分常数

\[A_1=x_0,\quad A_2=\frac{\dot{x}_0+\zeta\omega_n x_0}{\omega_d} \tag{15} \]

将其代入式(13),得到系统的位移

\[x(t)=e^{-\zeta\omega_n t}\left(x_0 \cos\omega_d t+\frac{\dot{x}_0+\zeta\omega_n x_0}{\omega_d}\sin\omega_d t\right)=U(t)x_0+V(t)\dot{x}_0 \tag{16} \]

其中

\[U(t)=e^{-\zeta\omega_n t}\left(\cos\omega_d t+\frac{\zeta}{\sqrt{1-\zeta^2}}\sin\omega_d t\right),\quad V(t)=\frac{e^{-\zeta\omega_n t}}{\omega_d}\sin\omega_d t \tag{17} \]

分别是单位初始位移和单位初始速度引起的自由振动。
式(16)还可等价写作

\[x(t)=A e^{-\zeta\omega_n t}\sin(\omega_d t+\varphi) \tag{18} \]

其中

\[A=\sqrt{x_0^2+\left(\frac{\dot{x}_0+\zeta\omega_n x_0}{\omega_d}\right)^2},\quad \varphi=\tan^{-1}\frac{\omega_d x_0}{\dot{x}_0+\zeta\omega_n x_0} \tag{19} \]

实线是典型的位移时间历程。它是在系统平衡位置附近的往复振动,但幅值不断衰减,不再是周期振动。

Figure_1

实际系统多属于欠阻尼情况,且一般\(\zeta<0.2\)。所以,通常所说的阻尼系统自由振动,都是指欠阻尼情况。现在来分析其振动特性:

  • a.欠阻尼系统的自由振动振幅按指数规律\(A e^{-\zeta\omega_n t}\)衰减。
  • b. 阻尼系统的自由振动是非周期振动,但其相邻两次沿同一方向经过平衡位置的时间间隔均为

\[T_d=\frac{2\pi}{\omega_d}=\frac{2\pi}{\omega_n\sqrt{1-\zeta^2}}=\frac{T_n}{\sqrt{1-\zeta^2}} \tag{20} \]

这种性质称为等时性。借用周期这一术语,称该时间间隔\(T_d\)为阻尼固有周期或自然周期。显然它大于无阻尼自由振动的周期\(T_n\)。必须指出,衰减振动的周期只是说明它具有等时性,并不意味着它具有周期性。

  • c. 阻尼固有频率\(\omega_d\)和阻尼固有周期\(T_d\)是阻尼系统自由振动的重要参数。当阻尼比很小时,它们与系统的固有频率\(\omega_n\)、固有周期\(T_n\)差别很小,甚至可忽略。
  • d. 为了描述振幅衰减的快慢,引入振幅对数衰减率。它定义为经过一个自然周期相邻两个振幅之比的自然对数

\[\delta=\ln\frac{e^{-\zeta\omega_n t}}{e^{-\zeta\omega_n(t+T_d)}}=\zeta\omega_n T_d=\frac{2\pi\zeta}{\sqrt{1-\zeta^2}} \tag{21} \]

由此可见,振幅对数衰减率仅取决于阻尼比。实线是两者间关系曲线。对于小阻尼比情况,式(21)可近似取为

\[\delta \approx 2\pi \zeta \tag{22} \]

虚线即是这一线性化近似。当阻尼比\(\zeta\)为0.1、0.2和0.3时,这一近似式的误差分别为0.5%、2%和4.6%。

  • e. 自由振动中含有的阻尼信息提供了由实验确定系统阻尼的可能性。通常,可根据实测的自由振动,通过计算振幅对数衰减率来确定系统的阻尼比。

附录

附录1 过阻尼下公式说明

过阻尼通解:

\[u(t)=a_1 e^{s_1 t}+a_2 e^{s_2 t} \]

图对应初始条件:初始位移 \(u(0)=0\)、初始速度不为0
\(t=0\) 代入:

\[u(0)=a_1 e^{0}+a_2 e^{0}=a_1+a_2=0 \]

直接得到:\(\boldsymbol{a_2=-a_1}\)
原式改写:

\[u(t)=a_1\left(e^{s_1 t}-e^{s_2 t}\right) \]

也就是两项天然符号相反,一项正、一项负。
教材为了直观拆分,把式子拆成两项单独绘图:

\[\frac{u}{a}=C\cdot e^{s_1 t}+C\cdot(-e^{s_2 t}) \]

因此一条虚线是 \(e^{s_1 t}\)(恒正),另一条是 \(-e^{s_2 t}\)

附录2 过阻尼\(\zeta>1\)\(\zeta\to1^+\)的极限推导

1. 先写出过阻尼完整通解

单自由度有阻尼自由振动微分方程:

\[\ddot x+2\zeta\omega_n \dot x+\omega_n^2 x=0 \]

过阻尼:\(\boldsymbol{\zeta>1}\),特征根为两个不等实根:

\[\begin{cases} s_1=-\zeta\omega_n+\omega_n\sqrt{\zeta^2-1}\\ s_2=-\zeta\omega_n-\omega_n\sqrt{\zeta^2-1} \end{cases} \]

过阻尼通解:

\[x(t)=A_1 e^{s_1 t}+A_2 e^{s_2 t} \]

利用初始条件 \(x(0)=x_0,\dot x(0)=\dot x_0\) 求解系数:
\(t=0\)

\[\begin{cases} x_0=A_1+A_2 \\ \dot x_0 = A_1 s_1+A_2 s_2 \end{cases} \]

联立解得:

\[A_1=\frac{\dot x_0-s_2 x_0}{s_1-s_2},\quad A_2=\frac{s_1 x_0-\dot x_0}{s_1-s_2} \]

\(s_1、s_2\)代入,记\(\lambda=\omega_n\sqrt{\zeta^2-1}\),则\(s_1=-\zeta\omega_n+\lambda,s_2=-\zeta\omega_n-\lambda,s_1-s_2=2\lambda\)

\[A_1=\frac{\dot x_0 +(\zeta\omega_n+\lambda)x_0}{2\lambda},\quad A_2=\frac{-(\dot x_0 +(\zeta\omega_n-\lambda)x_0)}{2\lambda} \]

带回通解整理:

\[x(t)=e^{-\zeta\omega_n t}\left[ x_0 \cosh(\lambda t)+\frac{\dot x_0+\zeta\omega_n x_0}{\lambda}\sinh(\lambda t) \right] \]

双曲函数定义:\(\cosh x=\dfrac{e^x+e^{-x}}{2},\sinh x=\dfrac{e^x-e^{-x}}{2}\)

2. 取极限\(\boldsymbol{\zeta\to1^+}\),趋近临界阻尼

\(\zeta\)无限靠近1(从大于1的过阻尼侧逼近临界阻尼):

\[\lambda=\omega_n\sqrt{\zeta^2-1}\xrightarrow{\zeta\to1}0 \]

现在需要求极限:

\[\lim_{\lambda\to0} x(t)=e^{-\omega_n t}\lim_{\lambda\to0}\left[ x_0\cosh(\lambda t)+\frac{\dot x_0+\omega_n x_0}{\lambda}\sinh(\lambda t) \right] \]

使用无穷小等价:\(\lambda\to0\)
\(\cosh(\lambda t)\approx 1+\dfrac{(\lambda t)^2}{2}\to 1\)
\(\sinh(\lambda t)\approx \lambda t\)
代入替换:

\[\begin{align*} \lim_{\lambda\to0} \left[x_0\cdot1+\frac{\dot x_0+\omega_n x_0}{\lambda}\cdot \lambda t\right] &=x_0+(\dot x_0+\omega_n x_0)\,t \end{align*} \]

因此极限为:

\[x(t)=(x_0+(\dot x_0+\omega_n x_0)\,t)e^{-\omega_n t} \]

3. 和临界阻尼标准形式完全对应

临界阻尼通解:\(x(t)=(A_1+A_2 t)e^{-\omega_n t}\)
对比直接得到:

\[A_1=x_0,\quad A_2=\dot x_0+\omega_n x_0 \]

和图片公式(11)完全一致。

4. 物理+数学总结
  1. 数学本质:临界阻尼是过阻尼两根不断靠近、最终重合的极限状态。
    过阻尼两个指数项随\(\zeta\to1\)高度耦合,无法继续写成两个独立指数,极限自然诞生\(t\cdot e^{-\omega_n t}\)项;
  2. 运动层面:
    • \(\zeta>1\)过阻尼:两个不同衰减指数,回落慢;
    • \(\zeta\to1\)两根靠拢,衰减速度不断加快;
    • \(\zeta=1\)临界阻尼:到达无振荡回落的最快速度;
  3. 为什么会出现\(t\)项:
    过阻尼\(\lambda\neq0\)\(\sinh(\lambda t)/\lambda\)是有限量;\(\lambda\to0\)\(\sinh(\lambda t)\sim\lambda t\),约分后多出\(t\)因子,这就是临界阻尼通解含\(t\)的来源。
补充:用洛必达严格证明极限

\(\dfrac{\sinh(\lambda t)}{\lambda}\)\(\lambda\to0\)洛必达:

\[\lim_{\lambda\to0}\frac{\sinh(\lambda t)}{\lambda} =\lim_{\lambda\to0}\frac{t\cosh(\lambda t)}{1}=t \]

严谨证明极限结果正确。

附录3 欠阻尼\(0<\zeta<1\)完整推导全过程

1.基础微分方程回顾

单自由度有阻尼自由振动标准齐次微分方程:

\[m\ddot x+c\dot x+kx=0 \]

两边除以质量\(m\),定义固有角频率、阻尼比:

\[\omega_n=\sqrt{\frac{k}{m}},\quad \zeta=\frac{c}{2m\omega_n}=\frac{c}{2\sqrt{mk}} \]

整理为标准二阶常系数齐次线性微分方程(式1a):

\[\ddot x+2\zeta\omega_n \dot x+\omega_n^2 x=0 \tag{1a} \]

2.列特征方程

设指数试解 \(x=e^{st}\),求导 \(\dot x=se^{st},\ddot x=s^2e^{st}\),代入微分方程,\(e^{st}\neq0\) 可约去,得到特征方程:

\[s^2+2\zeta\omega_n s+\omega_n^2=0 \]

一元二次求根公式:

\[s=\frac{-2\zeta\omega_n \pm\sqrt{(2\zeta\omega_n)^2-4\omega_n^2}}{2}=-\zeta\omega_n \pm\omega_n\sqrt{\zeta^2-1} \]

3.欠阻尼条件:\(0<\zeta<1\),特征根为共轭复根

\(0<\zeta<1\),根号内\(\zeta^2-1<0\),引入虚数单位\(j=\sqrt{-1}\),改写根号项:

\[\sqrt{\zeta^2-1}=j\sqrt{1-\zeta^2} \]

代入根表达式:

\[s_{1,2}=-\zeta\omega_n \pm j\omega_n\sqrt{1-\zeta^2} \]

定义阻尼固有角频率(阻尼振动频率):

\[\omega_d=\omega_n\sqrt{1-\zeta^2} \tag{14} \]

最终特征根写为一对共轭复数:

\[s_1=-\zeta\omega_n+j\omega_d,\quad s_2=-\zeta\omega_n-j\omega_d \tag{12} \]

4.由复指数解推实数通解(欧拉公式转换)

复根对应的两个复值特解:

\[x_1(t)=e^{s_1 t}=e^{(-\zeta\omega_n+j\omega_d)t}=e^{-\zeta\omega_n t}\cdot e^{j\omega_d t} \]

\[x_2(t)=e^{s_2 t}=e^{(-\zeta\omega_n-j\omega_d)t}=e^{-\zeta\omega_n t}\cdot e^{-j\omega_d t} \]

根据欧拉公式

\[e^{j\theta}=\cos\theta+j\sin\theta,\quad e^{-j\theta}=\cos\theta-j\sin\theta \]

两个复解线性组合,构造实数域上线性无关的实特解:

\[\begin{cases} X_1(t)=\dfrac{x_1+x_2}{2}=e^{-\zeta\omega_n t}\cos\omega_d t\\ X_2(t)=\dfrac{x_1-x_2}{2j}=e^{-\zeta\omega_n t}\sin\omega_d t \end{cases} \]

\(X_1(t)\)\(X_2(t)\)是两个线性无关的实函数,二阶齐次ODE通解为二者任意线性叠加:

\[x(t)=A_1 X_1(t)+A_2 X_2(t) \]

带入得到最终通解:

\[x(t)=e^{-\zeta\omega_n t}\big(A_1 \cos\omega_d t+A_2 \sin\omega_d t\big) \tag{13} \]

\(A_1,A_2\)是由初始位移\(x(0)=x_0\)、初始速度\(\dot x(0)=\dot x_0\)确定的积分常数。

5.利用初始条件求解\(A_1,A_2\)
  1. 代入\(t=0\)\(A_1\)

\[x(0)=e^{0}(A_1\cos0+A_2\sin0)=A_1=x_0 \]

\(\boldsymbol{A_1=x_0}\)

  1. \(x(t)\)求导:

\[\begin{align*} \dot x(t) =& -\zeta\omega_n e^{-\zeta\omega_n t}\big(A_1\cos\omega_d t+A_2\sin\omega_d t\big) \\ &+e^{-\zeta\omega_n t}\big(-A_1\omega_d\sin\omega_d t+A_2\omega_d\cos\omega_d t\big) \end{align*} \]

\(t=0\)

\[\dot x(0)= -\zeta\omega_n A_1 +A_2\omega_d=\dot x_0 \]

\(A_1=x_0\)带入整理:

\[A_2=\frac{\dot x_0+\zeta\omega_n x_0}{\omega_d} \]

6.通解的振幅相位形式(对应绘图\(a\sin\varphi\)

利用三角恒等变换,\(A_1\cos\omega_d t+A_2\sin\omega_d t\)可合并为单一正弦/余弦函数:

\[A_1\cos\omega_d t+A_2\sin\omega_d t=A\sin(\omega_d t+\varphi) \]

其中总振幅 \(A=\sqrt{A_1^2+A_2^2}\),初相位\(\varphi=\arctan\dfrac{A_1}{A_2}\)
位移改写为:

\[x(t)=A e^{-\zeta\omega_n t}\sin(\omega_d t+\varphi) \]

物理含义:

  1. \(e^{-\zeta\omega_n t}\):指数衰减包络,决定振动振幅随时间不断变小;
  2. \(\sin(\omega_d t+\varphi)\):等频简谐振荡,振荡频率是阻尼频率\(\omega_d<\omega_n\)
  3. 整体为衰减振荡,也就是欠阻尼自由振动。
7.关键物理总结
  1. 特征根实部\(-\zeta\omega_n<0\):指数项永远衰减,振动最终归零;
  2. 虚部\(\omega_d\):系统做往复振动的角频率,阻尼越大\(\zeta\)越大,\(\omega_d\)越小,振动越慢;
  3. \(0<\zeta<1\):存在往复振荡;
    \(\zeta=1\)临界阻尼、\(\zeta>1\)过阻尼:无振荡,单调回归平衡。
  4. 常数\(A_1,A_2\)完全由运动初始状态唯一确定。

代码

代码1 过阻尼下振动曲线

import numpy as np
import matplotlib.pyplot as plt
# 中文设置
plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False
# 系统参数
zeta = 1.1
omega_n = 1
s1 = (-zeta + np.sqrt(zeta ** 2 - 1)) * omega_n
s2 = (-zeta - np.sqrt(zeta ** 2 - 1)) * omega_n
tau = np.linspace(0, 4 * np.pi, 6000)
t = tau / omega_n
# 两条虚线函数
term_dash1 = np.exp(s1 * t)
term_dash2 = -np.exp(s2 * t)
# 初始条件 u(0)=0,du/dt(0)=omega_n*a
v0 = omega_n
a1 = v0 / (s1 - s2)
a2 = -v0 / (s1 - s2)
u_over_a = a1 * np.exp(s1 * t) + a2 * np.exp(s2 * t)
# 绘图
fig, ax = plt.subplots(figsize=(10, 7.2), dpi=130)
ax.plot(tau, u_over_a, color="black", linewidth=2)
ax.plot(tau, term_dash1, color="black", linestyle="--", linewidth=2)
ax.plot(tau, term_dash2, color="black", linestyle="--", linewidth=2)
ax.text(8.1, 0.86, r"$\zeta=1.1$", fontsize=14)
# ----------------核心精准定位----------------
# 取横坐标tau=0.7,计算该点两条虚线真实y值
tau_arrow = 0.7
y_dash1 = np.exp(s1 * tau_arrow)
y_dash2 = -np.exp(s2 * tau_arrow)
# 上箭头:终点xy精准落在上方虚线,文字向外引出
ax.annotate(r'$e^{s_1 t}$',
            xy=(tau_arrow, y_dash1),
            xytext=(1.9, 0.68),
            arrowprops=dict(arrowstyle="->", color="black", lw=1),
            fontsize=13)
# 下箭头:终点xy精准落在下方虚线,文字向外引出
ax.annotate(r'$-e^{s_2 t}$',
            xy=(tau_arrow, y_dash2),
            xytext=(1.9, -0.46),
            arrowprops=dict(arrowstyle="->", color="black", lw=1),
            fontsize=13)
# 坐标轴设置完全不变
ax.set_xlabel(r"$\omega_n t$", fontsize=15)
ax.set_ylabel(r"$\dfrac{u}{a}$", fontsize=17)
ax.set_xlim(0, 4 * np.pi)
ax.set_xticks([0, 2*np.pi, 4*np.pi])
ax.set_xticklabels(["0", r"$2\pi$", r"$4\pi$"])
ax.set_ylim(-1.05, 1.05)
ax.set_yticks([-1.0, -0.5, 0.0, 0.5, 1.0])
ax.axhline(y=0, color="black", linewidth=1)
ax.grid(False)
# 标题、底部标注
plt.title("(1) 过阻尼情况($\zeta>1$)", fontsize=15, pad=20)
plt.figtext(0.5, 0.02, "过阻尼系统的自由衰减运动", ha="center", fontsize=14)
plt.tight_layout()
plt.subplots_adjust(bottom=0.14)
plt.show()

代码2 临界阻尼下振动曲线

import numpy as np
import matplotlib.pyplot as plt
# --------------------------全局字体与分辨率配置--------------------------
plt.rcParams["font.family"] = ["SimHei", "Times New Roman"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["figure.dpi"] = 250
# --------------------------无量纲时间 τ=ωₙt --------------------------
tau = np.linspace(0, 4 * np.pi, 6000)
# 曲线公式:总响应=两项虚线相加
total_line = np.exp(-tau) - tau * np.exp(-tau)   # 实线总位移,τ=1穿过零点
dashed_upper = np.exp(-tau)                     # 上虚线 e^(-ωₙt)
dashed_lower = -tau * np.exp(-tau)              # 下虚线 -t e^(-ωₙt)
# --------------------------画布创建--------------------------
fig, ax = plt.subplots(figsize=(7, 5.4))
ax.plot(tau, total_line, color="black", linewidth=1.2)
ax.plot(tau, dashed_upper, color="black", linestyle="--", linewidth=1)
ax.plot(tau, dashed_lower, color="black", linestyle="--", linewidth=1)
# --------------------------坐标轴严格标准化(修复所有坐标格式错误)--------------------------
ax.set_xlim(0, 4 * np.pi)
ax.set_ylim(-1.0, 1.0)
# X刻度:刻度数字为0、2π、4π,X轴物理坐标名称ωₙt
ax.set_xticks([0, 2*np.pi, 4*np.pi])
ax.set_xticklabels([r"$0$", r"$2\pi$", r"$4\pi$"])
ax.set_xlabel(r"$\omega_n t$", fontsize=13)
# Y轴保持原样
ax.set_yticks([-1.0, -0.5, 0, 0.5, 1.0])
ax.set_yticklabels(["-1.0", "-0.5", "0.0", "0.5", "1.0"])
ax.set_ylabel(r"$\dfrac{u}{a}$", fontsize=14)
# 零基准横线
ax.axhline(y=0, color="black", linewidth=0.8)
# --------------------------箭头严格落在虚线上(坐标用函数实时计算,杜绝偏移)--------------------------
# 上箭头:精准命中上虚线
ax.annotate(
    r'$e^{-\omega_n t}$',
    xy=(1.05, np.exp(-1.05)),
    xytext=(1.7, 0.36),
    arrowprops=dict(arrowstyle="->", color="black", lw=1)
)
# 下箭头:精准命中下虚线
ax.annotate(
    r'$-te^{-\omega_n t}$',
    xy=(1.05, -1.05 * np.exp(-1.05)),
    xytext=(1.7, -0.44),
    arrowprops=dict(arrowstyle="->", color="black", lw=1)
)
# 右上角阻尼标注
ax.text(x=3.35, y=0.88, s=r"$\zeta=1.0$", fontsize=15)
# 图标题
plt.title("临界阻尼系统的自由衰减运动", fontsize=12, pad=13)
ax.grid(False)
plt.tight_layout()
plt.show()

代码3 欠阻尼下的振动曲线

import numpy as np
import matplotlib.pyplot as plt

# 全局样式配置
plt.rcParams["font.family"] = ["SimHei", "Times New Roman"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["figure.dpi"] = 250

# 振动基础参数
zeta = 0.1
tau = np.linspace(0, 10 * np.pi, 10000)
omega_d = np.sqrt(1 - zeta ** 2)

# 三条曲线:振动实线、上下包络虚线
u_over_a = np.exp(-zeta * tau) * np.cos(omega_d * tau)
envelope_upper = np.exp(-zeta * tau)
envelope_lower = -np.exp(-zeta * tau)

# 画布初始化
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(tau, u_over_a, color="black", linewidth=1.2)
ax.plot(tau, envelope_upper, color="black", linestyle="--", linewidth=1)
ax.plot(tau, envelope_lower, color="black", linestyle="--", linewidth=1)

# 坐标轴严格复刻原图
ax.set_xlim(0, 10 * np.pi)
ax.set_ylim(-1.0, 1.0)
ax.set_xticks([0, 2*np.pi, 4*np.pi, 6*np.pi, 8*np.pi, 10*np.pi])
ax.set_xticklabels([r"$0$", r"$2\pi$", r"$4\pi$", r"$6\pi$", r"$8\pi$", r"$10\pi$"])
ax.set_xlabel(r"$\omega_n t$", fontsize=14)

ax.set_yticks([-1.0, -0.5, 0, 0.5, 1.0])
ax.set_yticklabels(["-1.0", "-0.5", "0.0", "0.5", "1.0"])
ax.set_ylabel(r"$\dfrac{u}{a}$", fontsize=15)
ax.axhline(y=0, color="black", linewidth=0.8)

# 右上角标注阻尼值
ax.text(8, 0.88, r"$\zeta=0.1$", fontsize=16)

# ---------------------------标注优化:箭头变长、尖点锁死虚线、文字远离曲线---------------------------
arrow_touch_x = 1.6
# 上包络 e^(-ζωₙt)
y_upper = np.exp(-zeta * arrow_touch_x)
ax.annotate(
    r'$e^{-\zeta \omega_n t}$',
    xy=(arrow_touch_x, y_upper),
    xytext=(3.0, 0.75),  # 文字大幅右移,远离曲线
    arrowprops=dict(arrowstyle="->", color="black", lw=1, shrinkA=0, shrinkB=0)  # 无缩进,箭头全长
)

# 下包络 -e^(-ζωₙt)
y_lower = -np.exp(-zeta * arrow_touch_x)
ax.annotate(
    r'$-e^{-\zeta \omega_n t}$',
    xy=(arrow_touch_x, y_lower),
    xytext=(3.0, -0.82),
    arrowprops=dict(arrowstyle="->", color="black", lw=1, shrinkA=0, shrinkB=0)
)

# a sinφ 标注与辅助线
phi_x = 3.2
phi_y = np.exp(-zeta * phi_x)
ax.hlines(y=phi_y, xmin=0, xmax=phi_x, color="black", lw=0.8)
ax.annotate("", xy=(phi_x, phi_y), xytext=(phi_x, 0),
            arrowprops=dict(arrowstyle="<->", color="black", lw=1.2, shrinkA=0, shrinkB=0))
ax.text(phi_x + 0.3, 0.26, r"$a\sin\varphi$", fontsize=14)

# 图标题
plt.title("欠阻尼系统的衰减振动", fontsize=13, pad=14)
ax.grid(False)
plt.tight_layout()
plt.show()
posted @ 2026-07-25 17:54  redufa  阅读(9)  评论(0)    收藏  举报