如何在matplotlib中找到两条绘制曲线之间的交点? [英] How to find the intersection points between two plotted curves in matplotlib?

查看:110
本文介绍了如何在matplotlib中找到两条绘制曲线之间的交点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想找到两条曲线的交点.例如下面的示例.可以有多个交点.现在,我正在通过找到 x,y 坐标之间的距离来找到交点.但是这种方法有时无法在交点位于(17-18 x轴)之间时给出准确的点,如在图中所示.

I want to find the intersection of two curves. For example below. There can be multiple intersection points. Right now I am finding the intersection points by finding the distance between x,y coordinates. But this method not giving accurate points sometimes when point of intersection is in between(17-18 x-axis) as you can see in the plot.

我需要从曲线中获取所有点才能解决此问题.有什么方法可以让所有人都得到吗?

I need to get all the points from the curve to solve this. Is there any method to get all of them?

推荐答案

这是我的方法.我首先仅使用12个采样点创建了两条测试曲线,以说明这一概念.创建带有采样点的数组后,曲线的精确方程式丢失了.

Here is my approach. I first created two test curves, using only 12 sample points, just to illustrate the concept. The exact equations of the curves are lost after creating the arrays with sample points.

然后,搜索两条曲线之间的交点.通过逐点遍历数组,检查一条曲线何时从另一条曲线的下方到另一条曲线的上方(或反向),可以通过求解线性方程来计算交点.

Then, the intersections between the two curves are searched. By going through the array point by point, and check when one curve goes from below the other to above (or the reverse), the intersection point can be calculated by solving a linear equation.

然后绘制交点以直观地检查结果.

Afterwards the intersection points are plotted to visually check the result.

import numpy as np
from matplotlib import pyplot as plt

N = 12
t = np.linspace(0, 50, N)
curve1 = np.sin(t*.08+1.4)*np.random.uniform(0.5, 0.9) + 1
curve2 = -np.cos(t*.07+.1)*np.random.uniform(0.7, 1.0) + 1
# note that from now on, we don't have the exact formula of the curves, as we didn't save the random numbers
# we only have the points correspondent to the given t values

fig, ax = plt.subplots()
ax.plot(t, curve1,'b-')
ax.plot(t, curve1,'bo')
ax.plot(t, curve2,'r-')
ax.plot(t, curve2,'ro')

intersections = []
prev_dif = 0
t0, prev_c1, prev_c2 = None, None, None
for t1, c1, c2 in zip(t, curve1, curve2):
    new_dif = c2 - c1
    if np.abs(new_dif) < 1e-12: # found an exact zero, this is very unprobable
        intersections.append((t1, c1))
    elif new_dif * prev_dif < 0:  # the function changed signs between this point and the previous
        # do a linear interpolation to find the t between t0 and t1 where the curves would be equal
        # this is the intersection between the line [(t0, prev_c1), (t1, c1)] and the line [(t0, prev_c2), (t1, c2)]
        # because of the sign change, we know that there is an intersection between t0 and t1
        denom = prev_dif - new_dif
        intersections.append(((-new_dif*t0  + prev_dif*t1) / denom, (c1*prev_c2 - c2*prev_c1) / denom))
    t0, prev_c1, prev_c2, prev_dif = t1, c1, c2, new_dif
print(intersections)

ax.plot(*zip(*intersections), 'go', alpha=0.7, ms=10)
plt.show()

这篇关于如何在matplotlib中找到两条绘制曲线之间的交点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆