如何找到曲线和直线之间的交点

时间:2019-06-11 05:13:06

标签: python matplotlib geometry

您好,我需要找到2个图之间的交点,如下图所示,一个是曲线,另一个是直线

enter image description here

plt.figure()
plt.plot(lst)
plt.plot([x1, x2], [y1, y2], marker='o')
plt.show()

有没有简单的方法

2 个答案:

答案 0 :(得分:2)

我怀疑您遇到数学问题,而不是代码问题。

数学

交点是f1==f2,其中f1,f2由def f_i from x_i, y_i定义

为什么在“定义”周围加引号?嗯,这定义了输入采样点上的函数,但不能保证交集是其中之一。因此,您需要以某种方式猜测采样点之间的函数相等。这是内插的问题,从“琐碎的”到“写关于最佳方法的博士学位”的任何地方。

在您的情况下,我将假设使用线性插值法(在数据点之间绘制直线)。在这种情况下,每当f1(x)-f2(x)更改这些数据点之间的符号时,连续数据点之间的分段中就会有一个交点。

代码

在您确切的情况下,函数之一是常量:f2 == C,它简化了解决方案。 (如果不是这种情况,则必须沿着每条曲线的各段走动并检查相交;这可以在线性时间内完成(两个数组的长度之和),但是需要更多的编码。) / 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进行比赛。