使用 Numpy 找到两个线性方程的交点

如何解决使用 Numpy 找到两个线性方程的交点

目标是找到两个线性方程的交点。这两个线性方程是使用 Numpy polyfit 函数导出的。

给定两个时间序列 (xLeft,yLeft) 和 (xRight,yRight),使用 {{1 }}如下图:

polyfit

在这种情况下,xLeft = [ 6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187 ] yLeft = [ 0.98288751,1.3639959,1.7550986,2.1539073,2.5580614,2.9651523,3.3727503,3.7784295,4.1797948,4.5745049,4.9602985,5.3350167,5.6966233,6.0432272,6.3730989,6.6846867,6.9766307,7.2477727,7.4971657,7.7240791 ] xRight = [ 6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288] yRight=[ 7.8625913,7.7713094,7.6833806,7.5997391,7.5211883,7.4483986,7.3819046,7.3221073,7.2692747,7.223547,7.1849418,7.1533613,7.1286001,7.1103559,7.0982385,7.0917811,7.0904517,7.0936642,7.100791,7.1111741,7.124136,7.1389918,7.1550579,7.1716633,7.1881566,7.2039142,7.218349,7.2309117,7.2410989,7.248455,7.2525721,7.2530937,7.249711,7.2421637,7.2302341,7.213747,7.1925621,7.1665707,7.1356878,7.0998487,7.0590014,7.0131001,6.9621005,6.9059525,6.8445964,6.7779589,6.7059474,6.6284504,6.5453324,6.4564347,6.3615761,6.2605534,6.1531439,6.0391097,5.9182019,5.7901659,5.6547484,5.5117044,5.360805,5.2018456,5.034656,4.8591075,4.6751242,4.4826899,4.281858,4.0727611,3.8556159,3.6307325,3.3985188,3.1594861,2.9142516,2.6635408,2.4081881,2.1491354,1.8874279,1.6242117,1.3607255,1.0982931,0.83831298 ] left_line = np.polyfit(xleft,yleft,1) right_line = np.polyfit(xRight,yRight,1) 分别输出 polyfit 的系数 mb

两个线性方程的交点可以计算如下:

y = mx + b

但是,我想知道是否存在 Numpy 内置方法来计算最后两个步骤?

解决方法

您可以将其建模为线性系统并使用简单的线性代数:

def get_intersection(m1,b1,m2,b2):
    A = np.array([[-m1,1],[-m2,1]])
    b = np.array([[b1],[b2]])
    # you have to solve linear System AX = b where X = [x y]'
    X = np.linalg.pinv(A) @ b
    x,y = np.round(np.squeeze(X),4)
    return x,y # returns point of intersection (x,y) with 4 decimal precision

m1,b2 = left_line(0),left_line(1),right_line(0),right_line(1)
print(get_intersection(m1,b2))

例如,对于线 y - x = 1 和 y + x = 1,我们期望交点为 (0,1):

m1,b2 = 1,1,-1,1
print(get_intersection(m1,b2))

输出:如预期的(0.0,1.0)

,

不完全是内置方法,但您可以简化问题。假设我的 y = m1 * x + b1y = m2 * x + b2 有几行。你可以很容易地找到一个等式来表示差异,这也是一条线:

y = (m1 - m2) * x + (b1 - b2)

请注意,如果两条原始线相交,这条线将在两条原始线的交点处有一个根。您可以使用 numpy.polynomial.Polynomial 类来执行这些操作:

>>> (np.polynomial.Polynomial(left_line[::-1]) - np.polynomial.Polynomial(right_line[::-1])).roots()
array([6192.0710885])

请注意,我必须交换系数的顺序,因为 Polynomial 期望从最小到最大,而 np.polyfit 返回相反的结果。实际上,不推荐使用 np.polyfit。相反,您可以使用 np.polynomial.Polynomial.fit 类方法直接获取 Polynomial 对象。您的代码将如下所示:

left_line = np.polynomial.Polynomial.fit(xLeft,yLeft,domain=[-1,1])
right_line = np.polynomial.Polynomial.fit(xRight,yRight,1])
x0 = (left_line - right_line).roots()
y0 = left_line(x0)

domain 映射到窗口 [-1,1]。如果您不指定 domain,则将使用 x 值的峰峰值。您不希望这样,因为它会导致输入值的映射。相反,我们明确指定域 [-1,1] 映射到同一窗口。另一种方法是使用默认域并设置例如window=[xLeft.min(),xLeft.max()]。这种方法的问题在于,它会为多项式创建不同的域,从而阻止操作 left_line - right_line

有关详细信息,请参阅 https://numpy.org/doc/stable/reference/routines.polynomials.classes.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res