我正在做一个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()
我希望只有两点,但是在情节中出现了四点。其中两个不正确。
答案 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()
编辑:
上面的代码仅在您具有完美的整数交集时才有效。为了任意地做这两项,您需要在决定使用哪种方法之前检查是否存在完美的整数交集。我只是使用一个简单的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))))