您好,我需要找到2个图之间的交点,如下图所示,一个是曲线,另一个是直线
plt.figure()
plt.plot(lst)
plt.plot([x1, x2], [y1, y2], marker='o')
plt.show()
有没有简单的方法
答案 0 :(得分:2)
我怀疑您遇到数学问题,而不是代码问题。
交点是,其中f1,f2由定义
为什么在“定义”周围加引号?嗯,这定义了输入采样点上的函数,但不能保证交集是其中之一。因此,您需要以某种方式猜测采样点之间的函数相等。这是内插的问题,从“琐碎的”到“写关于最佳方法的博士学位”的任何地方。
在您的情况下,我将假设使用线性插值法(在数据点之间绘制直线)。在这种情况下,每当更改这些数据点之间的符号时,连续数据点之间的分段中就会有一个交点。
在您确切的情况下,函数之一是常量:,它简化了解决方案。 (如果不是这种情况,则必须沿着每条曲线的各段走动并检查相交;这可以在线性时间内完成(两个数组的长度之和),但是需要更多的编码。) / p>
import matplotlib.pyplot as plt
import numpy as np
def find_intersections(x, y, C):
# Contains numpy indexing tricks that can be hard to reproduce
# in the case where both functions are non-constants
ii, = np.nonzero((y[1:]-C)*(y[:-1]-C) < 0.) # intersection indices
x_intersections = x[ii] + (C - y[ii])/(y[1+ii] - y[ii])*(x[1+ii] - x[ii])
y_intersections = C * np.ones(len(ii))
return x_intersections, y_intersections
# parabolic data for example
x1 = np.linspace(-2., 2)
y1 = x1 ** 2
C = 2.0
x2 = np.asarray([min(x1), max(x1)])
y2 = np.asarray([C, C])
xint, yint = find_intersections(x1, y1, C)
plt.figure()
plt.plot(x1, y1)
plt.plot(x2, y2)
plt.plot(xint, yint, 'ro')
plt.show()
答案 1 :(得分:1)
尝试一下
import numpy as np
n = len(lst)
y = np.linspace(y1, y2, n)
close = np.argwhere(np.isclose(lst, y, rtol = 1/n)
print(close)
如有必要,以相对公差rtol
进行比赛。