找到曲线与 X 轴相交的点

bro*_*ser 2 python matplotlib

我用一些数据点绘制了以下图,阴谋。找到曲线与 X 轴相交点的最佳 Python 方法是什么?谢谢你的帮助。

-2.0   -2.22537043
-1.9   -2.22609532
-1.8   -2.22075396
-1.7   -2.22729678
-1.6   -2.22353721
-1.5   -2.22341588
-1.4   -2.2180032
-1.3   -2.22850037
-1.2   -2.22553919
-1.1   -2.22866368
-1.0   -2.22400234
-0.9   -2.22865694
-0.8   -2.22058969
-0.7   -2.22399086
-0.6   -2.20372207
-0.5   -2.22639477
-0.4   -2.10633351
-0.3   -2.03573848
-0.2   -1.52582935
-0.1   -0.344812049
0.0     1.61330696
0.1     2.21013059
0.2     2.22698993
0.3     2.22698993
0.4     2.22698993
0.5     2.22698993
0.6   2.22698993
0.7   2.21522144
0.8   2.22699297
0.9   2.22361681
1.0   2.22055266
1.1   2.22299154
1.2   2.21155482
1.3   2.22212628
1.4   2.22437687
1.5   2.22365865
1.6   2.21749658
1.7   2.22603657
1.8   2.22736
1.9   2.22471317
2.0   2.22724296
Run Code Online (Sandbox Code Playgroud)

更新:这是数据点。我现在怎么找到了?我将鼠标移至绘图窗口并手动找到该点,为什么它不起作用?它很慢。

san*_*ank 6

这个问题中确实没有提供足够的信息来彻底解决问题。也就是说,如果我理解正确的话,您可能正在寻找任何两个函数(直线或曲线)相交的位置。

有几种方法。我想说的最简单的方法是使用强大的曲线相交方法,例如sukhbinder的实现:junction ,它本身就是现有Matlab 文件交换条目的 python 端口。

例如,给定一个类似于上图的 sigmoid 曲线和一个重叠的正弦波,找到交点:

from intersect import intersection
import matplotlib.pyplot as plt
import numpy as np

x1 = np.linspace(-1, 1, 100)
y1 = 1 / (1 + np.exp(-x1 * 25))

x2 = np.linspace(-1, 1, 100)
y2 = np.sin(x2 * 2.25) + 0.5

x, y = intersection(x1, y1, x2, y2)

plt.plot(x1, y1, c="r")
plt.plot(x2, y2, c="g")
plt.plot(x, y, "*k")
plt.show()
Run Code Online (Sandbox Code Playgroud)

显示 sigmoid 波函数和正弦波函数及其交点的图

编辑(#2 求解 y=0 处的 x)

我没有资格对原始帖子发表评论,但我会提到这听起来像是一个寻找根源的问题。

为了完整起见,这里使用 OP 提供的数据对相同方法进行了修改。在这种情况下,相交线是跨越最小/最大的线,x1其中。本质上,这是寻找根源的图形化视图。

from intersect import intersection
import matplotlib.pyplot as plt
import numpy as np

data = np.array(
    [
        [-2.0, -2.22537043],
        [-1.9, -2.22609532],
        [-1.8, -2.22075396],
        [-1.7, -2.22729678],
        [-1.6, -2.22353721],
        [-1.5, -2.22341588],
        [-1.4, -2.2180032],
        [-1.3, -2.22850037],
        [-1.2, -2.22553919],
        [-1.1, -2.22866368],
        [-1.0, -2.22400234],
        [-0.9, -2.22865694],
        [-0.8, -2.22058969],
        [-0.7, -2.22399086],
        [-0.6, -2.20372207],
        [-0.5, -2.22639477],
        [-0.4, -2.10633351],
        [-0.3, -2.03573848],
        [-0.2, -1.52582935],
        [-0.1, -0.344812049],
        [0.0, 1.61330696],
        [0.1, 2.21013059],
        [0.2, 2.22698993],
        [0.3, 2.22698993],
        [0.4, 2.22698993],
        [0.5, 2.22698993],
        [0.6, 2.22698993],
        [0.7, 2.21522144],
        [0.8, 2.22699297],
        [0.9, 2.22361681],
        [1.0, 2.22055266],
        [1.1, 2.22299154],
        [1.2, 2.21155482],
        [1.3, 2.22212628],
        [1.4, 2.22437687],
        [1.5, 2.22365865],
        [1.6, 2.21749658],
        [1.7, 2.22603657],
        [1.8, 2.22736],
        [1.9, 2.22471317],
        [2.0, 2.227242961]
    ]
)
x1, y1 = data[:, 0], data[:, 1]

x2 = [np.min(x1), np.max(x1)]
y2 = [0, 0]

x, y = intersection(x1, y1, x2, y2)

plt.plot(x1, y1, c="r")
plt.plot(x2, y2, c="g")
plt.plot(x, y, "*k")
plt.show()
Run Code Online (Sandbox Code Playgroud)

显示 OP 数据和 y=0 处直线交点的图