注解
此笔记本可在此处下载: 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
机械谐振子
您的任务是最大化谐波振荡器所获得的功率,如以下方程式所述:
在哪里?
\(x\) 是位置,
\(\dot x\) 和 \(\ddot x\) 分别是速度和加速度,
\(m = 15\) G是质量,是固定的,
\(h\) 收割术语(可调)。
\(k\) 刚度(可调)
和 \(\ddot x_d\) 如果振荡器是自由的,驱动加速度为零。
在以下内容中,我们将使用方程的规范形式,其定义如下:
\(\zeta = \displaystyle \frac{{h}}{{2 \sqrt{{k m}}}}\) 收获期(可调),
\(\omega_0\) 脉搏(可以调谐),
环境激励
我们认为大气加速度 \(\ddot x_d\) 对应于正弦激励:
哪里 \(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]\) 并以此为中心。此开窗函数通过以下方式定义:
也可以更简洁地写成:
哪里 \(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)\]
对此加窗激励信号执行相同的操作