python - 在python中查找交点坐标
问题描述
我有 3 个线性线方程。
x1= np.linspace(-1,1,100)
y1= x1
y2=-x1
y3= -2*x1 +2
plt.plot(x1,y1)
plt.plot(x1,y2)
plt.plot(x1,y3)
有没有一种简单快捷的方法来找到三条线的交点坐标?
我在 Python 中尝试过两个图的交集,找到 x 值,并且只有 x 坐标。
但实际上我有更多的线性方程,因此获得交叉点的 (x,y) 坐标的最有效方法将是最有帮助的。
解决方案
如果主要目的是找到方程之间的交点,符号数学库sympy可能会有所帮助:
from sympy import symbols, Eq, solve
x, y = symbols('x y')
eq1 = Eq(y, x)
eq2 = Eq(y, -x)
eq3 = Eq(y, -2 * x + 2)
print(solve([eq1, eq2]))
print(solve([eq1, eq3]))
print(solve([eq2, eq3]))
输出:
{x: 0, y: 0}
{x: 2/3, y: 2/3}
{x: 2, y: -2}
要查找 numpy 数组之间的插值交点,您可以使用这篇find_roots()
文章中的函数:
from matplotlib import pyplot as plt
import numpy as np
def find_roots(x, y):
s = np.abs(np.diff(np.sign(y))).astype(bool)
return x[:-1][s] + np.diff(x)[s] / (np.abs(y[1:][s] / y[:-1][s]) + 1)
x1 = np.linspace(-1, 1, 100)
y1 = x1
y2 = -x1
y3 = -2 * x1 + 2
plt.plot(x1, y1, color='dodgerblue')
plt.plot(x1, y2, color='dodgerblue')
plt.plot(x1, y3, color='dodgerblue')
for ya, yb in [(y1, y2), (y1, y3), (y2, y3)]:
x0 = find_roots(x1, ya - yb)
y0 = np.interp(x0, x1, ya)
print(x0, y0)
plt.plot(x0, y0, marker='o', ls='', ms=4, color='crimson')
plt.show()
输出:
[0.] [0.]
[0.66666667] [0.66666667]
[] []
放大交叉点并标记 numpy 数组的点,您会注意到交叉点通常与数组的公共点不重合。因此,插值步骤是必要的。
推荐阅读
- html - 当我们给一个元素一个固定宽度时,为什么当它附近的内容在 display flex 的情况下发生变化时它占用的宽度小于固定宽度
- python - 为什么我不能杀死这个循环,为什么 0 不等于 0?
- java - 如何解决此问题“无法连接到主机,端口:smtp.gmail.com,587;超时 -1”
- spring-boot - 在詹金斯上运行 Wiremock 时如何修复“NoHttpResponseException”?
- apache-flink - Flink 窗口聚合(和其他操作)的结果是否保留在快照中?
- viterbi - 在unetstack中使用维特比算法进行卷积解码
- python - django raw query根据select查询返回无序的dict位置
- graphql - 带有 JSON 补丁的 GraphQL 突变
- logging - Feign 客户端请求和响应以及 URL 日志记录
- excel - 检查整个列以查看文本是否存在。如果确实如此,则将其记录在不同的单元格中