情节在Jupyter中显示错误的点

时间:2019-04-07 22:55:14

标签: python python-3.x jupyter-notebook jupyter

我正在做一个Python测试以绘制一些功能。

问题是两个函数在同一X处相交的点不正确。


import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.arange(-10,10,1)

def f(x): 
    return x+30

def z(x):
    return x*x

plt.figure(figsize=(5,5))
plt.plot(x, f(x).astype(np.int))
plt.plot(x, z(x).astype(np.int))
plt.title("Gráfico de función" )
plt.xlabel("X")
plt.ylabel("Y")

idx = np.argwhere(np.diff(np.sign(f(x) - z(x)))).flatten()
plt.plot(x[idx], f(x[idx]), 'ro')

plt.legend(["F","Z"])

plt.show()

我希望只有两点,但是在情节中出现了四点。其中两个不正确。

1 个答案:

答案 0 :(得分:1)

此错误不在于绘图本身,而在于您在相交是整数值的情况下获取点的方法。当取np.sign的np.diff时,您在相交点处从-1变为0到1,从而在4个位置给您1。如果交集不是整数,则将得到-1到1并得到正确的答案。如果您尝试这样做,则可以找到整数相交点:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.arange(-10,10,1)

def f(x): 
    return x+30.

def z(x):
    return x*x

plt.figure(figsize=(5,5))
plt.plot(x, f(x).astype(np.int))
plt.plot(x, z(x).astype(np.int))
plt.xlabel("X")
plt.ylabel("Y")

#Say only get args where there is no sign (i.e. zero).
idx = np.argwhere((np.sign(f(x) - z(x))==0)) 

plt.plot(x[idx], f(x[idx]), 'ro')

plt.legend(["F","Z"])
plt.show()

enter image description here

编辑: 上面的代码仅在您具有完美的整数交集时才有效。为了任意地做这两项,您需要在决定使用哪种方法之前检查是否存在完美的整数交集。我只是使用一个简单的for循环来执行此操作,但是我敢肯定还有更优雅的方法可以做到这一点。

for v in np.sign(f(x) - z(x)):
    if v==0:
        idx = np.argwhere(np.sign(f(x) - z(x))==0)
        break
    else:
        idx = np.argwhere(np.diff(np.sign(f(x) - z(x))))