使用 Python 查找两条线的交点

在线性代数中,如果两条线不相等或不平行,则称它们仅相交于一点。单点交点也称为两个线性方程的解。Python可以用来求这两个线性方程的解。这些线可以用许多不同的格式表示。X 和 Y 的解可以以每种格式导出。可以描述 Python 函数,其中可以使用针对每种格式导出的公式直接找到 X 和 Y。本文重点介绍了两种不同格式的线性方程以及如何实现函数来导出相同的方程。

为了使用两条线找到一点的交点,手动方法需要使两个方程在一个变量上相等。它将方程创建为单变量方程。进一步,使用简单的数学计算找到单个变量,并将其值放入前面的任一方程中以获得交点的第二个坐标。下面的文章对此进行了很好的说明,并将通过示例和推导进行阐明。

本文进行的线性方程的两种格式如下:

格式1:y=mx+c

格式2:ay=bx+c

需要注意的是,本文没有使用NumPy来实现两条线交点的查找。这里已经单独实现了一个类,以及一个在该类上工作的函数。请参阅本文以了解有关 NumPy 线性代数的更多信息。

为了使主题易于理解,还使用了图形分析。要按原样实现整个代码,需要导入 Matplotlib.pyplot。在代码开始之前可以按如下方式完成:

import matplotlib.pyplot as plt

求直线方程 y=mx+c 的交点

这是线方程最基本的格式。它最常用于线性代数和图形分析。这里 m 是方程的斜率,而 c 是方程的常数。这里将考虑两个相同格式的线性方程。首先,对X和Y进行推导。根据推导的公式,将在 Python 中创建一个函数。推导如下:

第一个方程的形式为 y=mx+c
第二个方程的形式为 y=mx+c
从 y=mx+c 直线方程推导 X 和 Y

从上面的推导可以看出,x变量可以很容易地从两个线性方程中使用以下公式找到:

x=(c 1 -c 2 )/(m 2 -m 1 )

上面的公式可以很容易地编码成Python函数。但在创建函数之前,有必要创建一个 Line 类,该类将 Line 封装在方程 y=mx+c 中。演示如下:

1
2
3
4
class Line:
  def __init__(self,slope,const):
    self.m=slope
    self.c=const

在上面的类声明中,还有一个使用__init__() 函数描述的构造函数它需要两个输入:方程的斜率和方程的常数。该类有两个变量:m 和 c。m 变量指定为斜率值,c 变量指定为常数值。现在已经声明了一个类,可以定义一个函数,该函数将两条线作为输入并显示它们的交点作为输出。下面的代码演示了这一点:

1
2
3
4
5
6
7
8
9
10
11
def findSolution(L1,L2):
  x=(L1.c-L2.c)/(L2.m-L1.m)
  y=L1.m*x+L1.c
  X=[x for x in range(-10,11)]
  Y1=[(L1.m*x)+L1.c for x in X]
  Y2=[(L2.m*x)+L2.c for x in X]
  plt.plot(X,Y1,'-r',label=f'y={L1.m}x+{L1.c}')
  plt.plot(X,Y2,'-b',label=f'y={L2.m}x+{L2.c}')
  plt.legend(loc='upper right')
  plt.show()
  return (x,y)

在上面的函数 findSolution() 中,有两行作为输入。它首先根据上面推导的公式分配 x 变量。Python 中的点(“.”)运算符允许类对象访问其公共变量,在本例中为 m 和 c。找到 x 变量后,只需将 x 变量放入第一行方程中即可对 y 变量进行赋值。代码的其余部分绘制了 (-10,10) 范围内两个方程的线图。本文清楚地解释了如何在图表中绘制图例以及如何在同一图表中为不同的线条绘制不同的颜色。该函数返回一个包含两个值的元组,即交点的 X 坐标和 Y 坐标。现在,让我们分别用方程 y=3x+5 和 y=2x+3 来检查函数在两条线上的工作情况。

12
13
14
15
L1=Line(3,5) #Equation of line y=3x+5
L2=Line(2,3) #Equation of line y=2x+3
sol=findSolution(L1,L2)
print(sol)

运行上述代码片段时会生成以下输出:

用 y=mx+c 求解的函数的输出

上面的函数告诉我们坐标 (-2,-1) 是两条线相交的位置。可以通过将值代入方程来检查。上图也证明了该函数,因为它是两个图相交的地方。

求直线方程 ay=bx+c 的交点

这种形式的线性方程通常用于线性代数。这里 y 变量也有一个系数。在这种情况下,方程的斜率变为b/a,常数变为 c/a 。这些值可以放入先前导出的 x 公式中,或者可以为这种格式的方程提供新的推导。新的推导如下:

第一个方程的形式为 ay=bx+c
第二个方程的形式为 ay=bx+c
从 ay=bx+c 形式的方程推导 X 和 Y

上面得到的 x 公式,可以很容易地用 Python 函数编码。但用于早期格式的相同类定义不适用于此格式。需要新的类声明。它如下面的代码片段所示:

1
2
3
4
5
class Line:
  def __init__(self,ycoeff,xcoeff,const):
    self.a=ycoeff
    self.b=xcoeff
    self.c=const

Class Line 的这种实现与上面给出的实现不同。这里构造函数中有三个输入参数。第一个参数是 y 系数或方程格式中的“a”。第二个是 x 系数或方程格式中的“b”。最后一个是方程格式中的常数或“c”。该类由三个变量 a、b 和 c 组成,形成 ay=bx+c 格式的方程

下面的函数 findSolution() 通过使用 x 推导公式并将 x 的值放入一个线性方程中来求出 y,从而找到 ay=bx+c 格式的两个线性方程的解。下面的代码演示了这一点:

1
2
3
4
5
6
7
8
9
10
11
def findSolution(L1,L2):
  x=((L1.a*L2.c)-(L2.a*L1.c))/((L2.a*L1.b)-(L1.a*L2.b))
  y=(L1.b*x+L1.c)/L1.a
  X=[x for x in range(-10,11)]
  Y1=[((L1.b*x)+L1.c)/(L1.a) for x in X]
  Y2=[((L2.b*x)+L2.c)/(L2.a) for x in X]
  plt.plot(X,Y1,'-r',label=f'{L1.a}y={L1.b}x+{L1.c}')
  plt.plot(X,Y2,'-b',label=f'{L2.a}y={L2.b}x+{L2.c}')
  plt.legend(loc='upper right')
  plt.show()
  return (x,y)

这里,该函数将 L1 和 L2 线作为输入并找到交点,并将其作为元组返回。它使用 x 的导出公式。它还在图表上绘制两条线,以便更好地可视化和理解。让我们检查两个方程的函数 3y=4x+6 和 2y=5x+3 。

12
13
14
15
L1=Line(3,4,6) #Equation for line 3y=4x+6
L2=Line(2,5,3) #Equation for line 2y=5x+3
sol=findSolution(L1,L2)
print(sol)

上述代码片段的输出如下:

使用 ay=bx+c 求解的函数的输出

在上面的输出中,函数提供的交点为 (0.428,2.571),满足作为输入给出的两个方程。如上所示的两个方程的图形支持函数的输出。]

本文重点介绍寻找两点交点的简单实现。有关 Python 中线性代数的更多实现,强烈建议参考NumPy Linalg 文档。

参考代码

这是问题陈述的完整代码实现。

y=mx+c 直线方程的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 号
18
19
20
import matplotlib.pyplot as plt
class Line:
  def __init__(self,slope,const):
    self.m=slope
    self.c=const
def findSolution(L1,L2):
  x=(L1.c-L2.c)/(L2.m-L1.m)
  y=L1.m*x+L1.c
  X=[x for x in range(-10,11)]
  Y1=[(L1.m*x)+L1.c for x in X]
  Y2=[(L2.m*x)+L2.c for x in X]
  plt.plot(X,Y1,'-r',label=f'y={L1.m}x+{L1.c}')
  plt.plot(X,Y2,'-b',label=f'y={L2.m}x+{L2.c}')
  plt.legend(loc='upper right')
  plt.show()
  return (x,y)
L1=Line(3,5) #Equation of line y=3x+5
L2=Line(2,3) #Equation of line y=2x+3
sol=findSolution(L1,L2)
print(sol)

ay=bx+c 直线方程的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 号
18
19
20
21
import matplotlib.pyplot as plt
class Line:
  def __init__(self,ycoeff,xcoeff,const):
    self.a=ycoeff
    self.b=xcoeff
    self.c=const
def findSolution(L1,L2):
  x=((L1.a*L2.c)-(L2.a*L1.c))/((L2.a*L1.b)-(L1.a*L2.b))
  y=(L1.b*x+L1.c)/L1.a
  X=[x for x in range(-10,11)]
  Y1=[((L1.b*x)+L1.c)/(L1.a) for x in X]
  Y2=[((L2.b*x)+L2.c)/(L2.a) for x in X]
  plt.plot(X,Y1,'-r',label=f'{L1.a}y={L1.b}x+{L1.c}')
  plt.plot(X,Y2,'-b',label=f'{L2.a}y={L2.b}x+{L2.c}')
  plt.legend(loc='upper right')
  plt.show()
  return (x,y)
L1=Line(3,4,6) #Equation for line 3y=4x+6
L2=Line(2,5,3) #Equation for line 2y=5x+3
sol=findSolution(L1,L2)
print(sol)