繁体   English   中英

如何在 Python 中使用分段 function 得到三角波 plot?

[英]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介于00.5之间, 和4 * t - 30.51之间。

此外,您的 function 为t < 0t > 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()你得到t0.57142857142857141.1428571428571428但如果你使用num=9而不是num=8那么你会得到恰好0.51.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM