import matplotlib.pyplot as plt
import numpy as np
def arc():
x = np.arange((-np.pi)/4, (np.pi)/4, 0.001)
f1 = lambda x: 3 * (np.cos(2 * x) )**0.5
plt.vlines(0, 0, 5)
plt.plot(x, f1(x), label = '$r=3\sqrt{\cos{2\phi}}$')
plt.xlabel('$\phi$')
plt.ylabel('$r(\phi)$')
plt.legend(loc='best')
axes = plt.gca()
axes.set_xlim([-np.pi, np.pi])
axes.set_ylim([0, 5])
plt.show()
arc()
我不明白为什么它不会一直走到右侧的\phi
轴。我该怎么做才能解决这个问题?
答案 0 :(得分:6)
获得所需内容的最佳方式是使用linspace。要获得与示例中几乎相同的向量x
,您应该执行
x = np.linspace(-np.pi/4, np.pi/4, round(np.pi / 2 / 0.001) + 1)
或只是
x = np.linspace(-np.pi/4, np.pi/4, npoints)
这为您提供了完全 npoints
点,并且保证包含起始值和停止值。
使用np.arange(start, stop, step)
为start, start+step, start+2*step, ...
提供分数start+n*step < stop
,直到n
为止。由于浮点不准确,最终点的arange
是什么并不明显。 In [21]: for i in range(97,109):
...: r = np.arange(0, 1, 1. / i)
...: print 'step = 1.0 / {}, length = {}, last value = {}'.format(
...: i, len(r), r[-1])
...:
step = 1.0 / 97, length = 97, last value = 0.989690721649
step = 1.0 / 98, length = 99, last value = 1.0
step = 1.0 / 99, length = 99, last value = 0.989898989899
step = 1.0 / 100, length = 100, last value = 0.99
step = 1.0 / 101, length = 101, last value = 0.990099009901
step = 1.0 / 102, length = 102, last value = 0.990196078431
step = 1.0 / 103, length = 104, last value = 1.0
step = 1.0 / 104, length = 104, last value = 0.990384615385
step = 1.0 / 105, length = 105, last value = 0.990476190476
step = 1.0 / 106, length = 106, last value = 0.990566037736
step = 1.0 / 107, length = 108, last value = 1.0
step = 1.0 / 108, length = 108, last value = 0.990740740741
评论的manual:
使用非整数步骤(例如0.1)时,结果通常不会 始终如一。最好在这些情况下使用linspace。
通过使用可变步长生成0到1之间的一些范围,很容易证明这会导致不可预测的行为:
UIImageView
另请参阅this answer相关问题。
答案 1 :(得分:1)
图表在右边一直没有变为零的原因是arange
从start
(第一个参数)开始并添加step
(第三个)参数)直到达到end
(第二个参数。但是,end
最后没有添加。
你应该做的是:
x = np.concatenate((np.arange(-np.pi/4, np.pi/4, 0.001), [np.pi/4]))
或使用简写np.r_
:
x = np.r_[np.arange(-np.pi/4, np.pi/4, 0.001), np.pi/4]
答案 2 :(得分:1)
x = np.arange((-np.pi)/4, (np.pi)/4, 0.001)
为:
x = np.arange((-np.pi)/4, (np.pi)/4, 0.00001)
我得到了
基本上,只需更改步骤即可更接近曲线的末端。 然而,这更像是一个不做的例子(我的猜测结果是错误的)。 正如@Bas Swinckels&#39;建议甚至更好:
x = np.linspace(-np.pi/4, np.pi/4, npoints)
完全摆脱了将最后一个参数更改为接近零的值的需要,这只会使间隙变小(它没有消除差距)。 linspace更适合浮点不准确。