关于数学:如何在Python中执行三角形浮点数范围?

How to Do Trigonometric Range of Floats in Python?

本问题已经有最佳答案,请猛点这里访问。

MATLAB

1
2
3
x = 0:pi/100:2*pi;
y = sin(x);
plot(y)

我认为range()在这里不能工作,因为它只接受结束参数作为整数,但我需要浮点(0.0; 2*pi)。python 2.7.11中的伪代码+

1
2
import math
x = pseudoRange(0.0, 2*math.pi, math.pi/100);

ceil()不适用于整数。

如何在python中获得浮点的三角范围?


使用生成器表达式:

1
(math.pi/100*k for k in range(200))

如果要将结果作为列表使用:

1
[math.pi/100*k for k in range(200)]

您还可以使用列表理解方法获取相应的y值:

1
2
x = [math.pi/100*k for k in range(200)]
y = [math.sin(p) for p in x]

然后,可以使用matplotlib绘制一对x,y列表。

请注意,上述各点的范围是从0.01.99*math.pi。如果您希望最后一点是2*pi本身,您需要用range(201)替换range(200)


您可以使用numpy.arange

1
2
3
4
>>> np.arange(0, 2*math.pi, math.pi/100)
array([ 0.        ,  0.03141593,  0.06283185,  0.09424778,  0.12566371,
        # ... 190 more ...
        6.12610567,  6.1575216 ,  6.18893753,  6.22035345,  6.25176938])

您也可能对numpy.linspace感兴趣:

1
2
3
4
>>> np.linspace(0, 2*math.pi, 200)
array([ 0.        ,  0.0315738 ,  0.06314759,  0.09472139,  0.12629518,
        # ... 190 more ...
        6.15689013,  6.18846392,  6.22003772,  6.25161151,  6.28318531])

使用np.arange时,第三个参数是step,而使用np.linspace时,是间隔中均匀分布的值的总数。另请注意,linspace将包括2*pi,而arange不包括,而是停在step的最后一个倍数。

然后你可以用matplotlib.pyplot绘制这些图。对于sin,您只需使用np.sin,它将把正弦函数应用于输入数组的每个元素。对于其他函数,使用列表理解。

1
2
3
4
5
6
7
>>> from matplotlib import pyplot
>>> x = np.arange(0, 2*math.pi, math.pi/100)
>>> y = np.sin(x) # using np.sin
>>> y = [math.sin(r) for r in x] # using list comprehension
>>> pyplot.plot(x, y)
[<matplotlib.lines.Line2D at 0xb3c3210c>]
>>>pyplot.show()


假设您已经安装了matplotlib,或者您可以在系统上安装它,那么在pylab名称空间下提供了一种matlab克隆,

1
2
3
4
5
6
7
8
import pylab as pl

x = pl.linspace(0, 2*pl.pi,201) #  x is an array
y = pl.sin(x)                   #  y is computed with an array expression
pl.plot(x, y,"ro-", label="Sine(t)")
pl.legend(loc='best')
pl.xlabel('$\\omega_o t$')
pl.show()

还可以直接导入所有pylab的命名空间

1
2
3
4
5
from pylab import *

x = linspace(0, 2*pi, 201)
y = sin(x)
...

但不建议这样做,因为您的命名空间中现在有将近1000个新的、不合格的名称…

严格来说,x = 0:pi/100:2*pi;映射到不同的语法,x = pl.linspace(0, 2*pl.pi,201),其中不指定增量,而是指定点数(正如您所指出的,由于围栏效应,您必须指定201才能获得所需的结果)。