如何用Python生成重复抛物线信号?求类MATLAB GENSIG的优雅实现
优雅实现周期为2的f(x)=x²重复信号绘制(范围-10到10)
需求:绘制周期为2的函数$f(x)=x^2$的重复信号,基于[-1,1]区间的函数值扩展到[-10,10]范围。现有如下Python实现,希望找到更简洁优雅的写法(用于作业提交),比如Scipy中类似MATLAB gensig函数的方案:
import numpy as np import matplotlib.pyplot as plt t3 = np.linspace(-1,1,1000) x3 = t3**2 x = np.array_split(x3,2)[1] for i in range(9): x = np.concatenate((x, x3)) x = np.concatenate((x,np.array_split(x3,2)[0])) t = np.linspace(-10,10,10000) plt.plot(t, x, linewidth=1, color='blue') plt.show()
目标效果如下:
优化方案:向量化周期映射(推荐)
利用Numpy的向量化运算直接计算每个时间点在周期内的等效位置,避免循环和数组拼接,代码简洁且高效:
import numpy as np import matplotlib.pyplot as plt # 生成完整时间范围的数组 t = np.linspace(-10, 10, 10000) # 将每个时间点映射到[-1, 1]的周期区间(周期为2) # 原理:通过模运算把t转换到[0,2)区间,再偏移到[-1,1) t_periodic = np.mod(t + 1, 2) - 1 # 计算周期函数值 x = t_periodic ** 2 plt.plot(t, x, linewidth=1, color='blue') plt.show()
关于Scipy中类似gensig的方法
Scipy的scipy.signal.gensig主要用于生成正弦、方波、脉冲等标准周期信号,无法直接生成自定义的$f(x)=x^2$周期信号。因此上面的向量化映射方法是更适合自定义周期函数的优雅实现,逻辑清晰、可读性强,完全符合作业提交的要求。
内容的提问来源于stack exchange,提问作者MoritzMoreira
相关产品推荐
相关产品推荐

