[英]How to plot a triangular wave using a piecewise function in Python?
我目前正在参加我的第一个 Python 编码课程,我非常坚持这项作业。 目标是使用分段 function 定义 function 'F(t)',这将使三角波图看起来与以下内容相同:
这是我试过的:
def F(t):
if (t >= 0) & (t <= 1/2):
return 4*t
elif (t >= 1/2) & (t < 1):
return -4*t
else:
return 0
f = np.vectorize(F)
t = np.linspace(0,4,num=8)
plt.plot(t,f(t))
显然,运气不好。 上面的代码匹配了从 0 到 1 的理想图形,所以我真的只是在为如何使图形成为所有 t > 0 的连续三角波而苦苦挣扎。
非常感谢任何提示或建议
你的 function 打错了。 如果您希望波谷为0.5
0.5
偶数倍,并且您希望值为1
和-1
,则您的 function 需要-4 * t + 1
介于0
和0.5
之间, 和4 * t - 3
在0.5
和1
之间。
此外,您的 function 为t < 0
和t > 1
返回0
,因此您的 output 与超出这些范围的预期 output 不匹配。
由于当您只有小数点后的输入部分时,您的if
条件描述了正确的行为,因此您可以提取该部分并使用它代替t
:
def F(t):
decimal_part = t % 1
if 0 <= decimal_part <= 0.5:
return -4*decimal_part + 1
else:
return 4*decimal_part - 3
这给出了这个:
请记住将 x 轴离散化,使其具有足够的点数。 我用t = np.linspace(0, 4, 1000)
绘制了蓝线,用t = np.linspace(0, 4, 10)
了红线,其他一切都保持不变。
np.vectorize()
function 并没有真正矢量化 function。 如果你想真正看到速度的提高,你将不得不通过将其逻辑表达为向量运算来自己对 function 进行向量化。
def g(t):
dec = (t % 1) - 0.5
return (np.abs(dec) - 0.25) * 4
两者都给出了相同的图,但执行时间显示了差异:
import timeit
t1 = timeit.timeit('f(t)', setup='from __main__ import np, f, t', number=10000)
t2 = timeit.timeit('g(t)', setup='from __main__ import np, g, t', number=10000)
# t1 = 3.322270042001037
# t2 = 0.17450489799375646
print(t1 / t2)
# 19.038262422410074
实际矢量化的 function 在我的电脑上快了 19 倍(Intel Python 3.7 在 Macbook Air 上带有 numpy+MKL)
首先,您可以使用print()
查看变量中的内容。
在F()
你得到t
像0.5714285714285714
, 1.1428571428571428
但如果你使用num=9
而不是num=8
那么你会得到恰好0.5
, 1.0
并且绘制它会容易得多。
并使用print()
显示我创建的不同组合的结果
def F(t):
return 1 - ((t*2) % 2)
可以减少到
def F(t):
return 1 - (t % 1)
我如何得到它:
您在 (-1, 1) 范围内有y
,它给出长度2
所以我从y = t % 2
开始以获得范围 (0, 2) 中的值,这也给出了长度2
。 因为对于0
我得到0
而我需要1
所以接下来我使用1 -...
来获得“镜像”。 所以我得到 y=1 for x=0 但下一个顶部是 y=2 但我需要 y=1 所以我不得不使用*2
来得到它。 最后我发布了(t*2) % 2
可以是(t % 2) * (2 % 2)
所以它给出了(t % 2) * 1
这给出了(t % 2)
最小的工作代码
import numpy as np
import matplotlib.pyplot as plt
def F(t):
#y = t % 2
#y = 1 - (t % 2)
#y = 1 - ((t*2) % 2)
y = 1 - (t % 1)
print(t, y)
return y
f = np.vectorize(F)
t = np.linspace(0, 4, num=9)
plt.plot(t, f(t))
plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.