注解

此笔记本可在此处下载: 04_ODE_Energy_Harvesting.ipynb

教程:振动能量采集

在本教程中,您将使用谐波振荡器模拟能量收集。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from scipy import fftpack, signal
%matplotlib nbagg

机械谐振子

您的任务是最大化谐波振荡器所获得的功率,如以下方程式所述:

\[\ d dot x+\dfrac h m \ dot x+\dfrac k m x=-\ddot x_d\]

在哪里?

  • \(x\) 是位置,

  • \(\dot x\)\(\ddot x\) 分别是速度和加速度,

  • \(m = 15\) G是质量,是固定的,

  • \(h\) 收割术语(可调)。

  • \(k\) 刚度(可调)

  • \(\ddot x_d\) 如果振荡器是自由的,驱动加速度为零。

在以下内容中,我们将使用方程的规范形式,其定义如下:

\[\ddot{x}+2\zeta\omega_0\dot x+\omega_0^2 x=-\ddot{x_d}\]
  • \(\zeta = \displaystyle \frac{{h}}{{2 \sqrt{{k m}}}}\) 收获期(可调),

  • \(\omega_0\) 脉搏(可以调谐),

环境激励

我们认为大气加速度 \(\ddot x_d\) 对应于正弦激励:

\[\ddot x_d(T)=A\sin(\omega_d t)\]

哪里 \(A\) 是振幅和 \(\omega_d\) 就是激励的脉动。

任务1:对特定激励进行编码

首先,定义激励函数。用一张图检查一下。

任务2:对谐振子进行编码

使用示例4中的工作对谐振器进行编码,并使用上面定义的环境加速度对其进行模拟。

你可以带上 \(\zeta = 0.1\) ,以及 \(\omega_0 = 2 \pi\) 例如。

任务3:能源计算

计算动能 \(E_c\) 和弹性能 \(E_k\) 。您必须定义方法。把它画出来。

任务4:收获的能量表达式

找到控制力量的方程式 \(P_h\) 这是由振荡器收获的。把它画出来。计算缔合能 \(E_h\)

任务5:测量收获的功率

对于给定的配置, \(\zeta\)\(\omega_0\) ,测量振荡器获取的功率。计算RMS值。

任务6 : Compute the harvested power as a function of \(\zeta\)\(\omega_0\)

测试以下各项的多个组合 \(\zeta\)\(\omega_0\) 找出哪一个是最好的。你可以和你的同事比较你的结果。

额外好处:使用更复杂的激励进行测试(更真实)

噪声型环境加速度

我们假设设备可用的环境加速度通过以下功能重现。

def noise(N = 1000, D = 10.):
    """
    Noise generator.

    Inputs:
    * N: number of samples.
    * D: signal duration.
    """
    N = int(N)
    dt = D / (N-1)
    t = np.linspace(0., D, N)
    a = np.random.rand(N)
    a -= a.mean()
    A = fftpack.fft(a)
    F = fftpack.fftfreq(N, dt)
    win = fftpack.fftshift(signal.gaussian(N, std=N/10))
    A *= win
    a2 = fftpack.ifft(A)
    return t, np.real(a2), A[:N//2], F[:N//2]
# generate the ambient acceleration
t, a, A, F = noise()
# plot it
fig = plt.figure()
ax = fig.add_subplot(2,1,1)
plt.title("Ambient Acceleration")
plt.plot(t, a)
plt.grid()
plt.xlabel("Time, $t$")
plt.ylabel(r"Amplitude, $\ddot x_d$")
ax = fig.add_subplot(2,1,2)
plt.plot(F, abs(A))
plt.grid()
plt.xlabel("Frequency, $f$")
plt.ylabel(r"Amplitude, $|\ddot X_d|$")
plt.tight_layout()
plt.show();
<IPython.core.display.Javascript object>

定义时间离散化 \([0,5]\) 并且内插上面定义的白噪声激励以模拟扰动振荡器。使用 interp1d 方法(参见scipy文档)。画出激励和数值解的曲线图 odeint

三角函数加窗激励

现在我们要对一段时间内的正弦激励信号加窗。 \(D = 10\) 仿真的%s。为此,我们将使用具有等于时间间隔的紧支承度的三角函数 \(I = [0, D]\) 并以此为中心。此开窗函数通过以下方式定义:

\[\begin{split}\operatorname{Tri}_{[0, D]}(t) = \left\{ \begin{array}{ll} \displaystyle 1 - \frac{|t - m|}{m} \qquad \text{if} \ |t - m| \leq 1\\ 0 \qquad \qquad \qquad \text{otherwise} \end{array} \right.\end{split}\]

也可以更简洁地写成:

\[\operatorname{Tri}_{ [0, D] }(T)=\max\Left(1-\frac{|t-m|}{m},0\right)\]

哪里 \(m\) 对应于时间间隔的中间位置 \(I = [0, D]\)

激励表达式为:

\[\text{for all}\t\in i,\qquad x_d(T)=\操作员名称{tri}_{ [0, D] }\Left(\displaystyle t\right)\sin(\omega_d t)\]

对此加窗激励信号执行相同的操作