繁体   English   中英

绘制弧线:图中的异常

[英]Plotted arc: anomaly in the plot

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轴。 我该怎么做才能解决这个问题?

获得所需内容的最佳方法是使用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的言论:

使用非整数步骤(例如0.1)时,结果通常不一致。 最好在这些情况下使用linspace。

通过使用可变步长生成0到1之间的一些范围,很容易证明这会导致不可预测的行为:

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

另见相关问题的答案

图形在右边没有一直到零的原因是因为arangestart (第一个参数)开始并添加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]

我改变了x = np.arange((-np.pi)/4, (np.pi)/4, 0.001)

至:

x = np.arange((-np.pi)/4, (np.pi)/4, 0.00001)

我得到了 更接近完美的情节

基本上,只需更改步骤即可更接近曲线的末端。 然而,这更像是一个不做的例子(我的猜测结果是错误的)。 正如@Bas Swinckels的建议更好:

x = np.linspace(-np.pi/4, np.pi/4, npoints)

它完全摆脱了将最后一个参数更改为接近零的值的需要,这只会使间隙变小(它没有消除差距)。 linspace更适合浮点不准确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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