独立线性度 最佳直线

找到的散点线性拟合方法都是基于最小二乘法的(numpy.polyfit()scipy.optimize())

以下是根据 GB/T 18459-2001中附录 A2 提供的独立线性度拟合方法,求得的最佳拟合直线

import mathdef find_line(x0, y0):'''根据散点求得端基直线k,b,并得到每点对端基直线的偏差dy:param x0: x坐标数组:param y0: y坐标数组:return: 每点的偏差dy'''# 求得端基直线的k,bk = (y0[-1] - y0[0]) / (x0[-1] - x0[0])d = y0[-1] - (k * x0[-1])# 根据端基直线的k,b,求得每点对端基直线的偏差dydy = [(y0[i] - ((k * x0[i]) + d)) for i in range(len(x0))]return dydef find_poly(x_lst, y_lst):'''找到凸多边形,可以包含全部偏差点dy:param x_lst:x数组:param y_lst:偏差点dy数组:return:最佳凸多边形各个点'''g_x = []g_y = []# 从起始点开始,向右(x增大方向),找到最大斜率点,再从最大斜率点开始,向右继续寻找start_index = 0x_tmp = x_lst[1:]y_tmp = y_lst[1:]while len(x_tmp) > 0:k_lst = [((j - y_lst[start_index]) / (i - x_lst[start_index])) for i, j in zip(x_tmp, y_tmp)]start_index = k_lst.index(max(k_lst)) + 1 + start_indexg_x.append(x_lst[start_index])g_y.append(y_lst[start_index])x_tmp = x_lst[start_index + 1:]y_tmp = y_lst[start_index + 1:]# 从最末点开始,向左(x减小方向),也找到最大斜率点(有人说找最小斜率点,但是结果算出来不对),再从最大斜率点开始,向左继续寻找start_index = len(x_lst) - 1x_tmp = x_lst[:start_index]y_tmp = y_lst[:start_index]while len(x_tmp) > 0:k_lst = [((j - y_lst[start_index]) / (i - x_lst[start_index])) for i, j in zip(x_tmp, y_tmp)]start_index = k_lst.index(max(k_lst))g_x.append(x_lst[start_index])g_y.append(y_lst[start_index])x_tmp = x_lst[:start_index]y_tmp = y_lst[:start_index]return g_x, g_ydef find_cross(p1, p2, p3):'''根据一个点p1和一条直线(p2和p3的连线),求得该点对直线的铅垂线(平行于纵轴坐标的直线)和直线的交点:param p1: 点:param p2: 线上一点:param p3: 线上另一点:return: 铅垂线与线(p2-p3)的交点'''k = (p2[1] - p3[1]) / (p2[0] - p3[0])b = p2[1] - k * p2[0]p4 = [p1[0], (k * p1[0]) + b]return p4def find_perfect_line(a, b, x0, y0):'''根据凸多边形的每个点,找到凸多边形内最长的一根铅垂线,与最长垂线相交的直线l1的斜率就是最佳直线的斜率过最长铅垂线的中点作直线l2平行于直线l1,直线l2为最佳直线:param a:凸多边形的x轴数组:param b:凸多边形的y轴数组:param x0: 实际x轴数组:param y0: 实际y轴数组:return:最佳直线的斜率k, 截距b'''dic = {}point_lst = [[i, j] for i, j in zip(a, b)]for i in range(len(a)):p1 = (a[i], b[i])  # 凸多边形的每个点坐标rp1 = (x0[x0.index(p1[0])], y0[x0.index(p1[0])])for j in range(len(a)):p2 = (a[j], b[j])  # 凸多边形的每个点坐标rp2 = (x0[x0.index(p2[0])], y0[x0.index(p2[0])])if j == len(a) - 1:p3 = (a[0], b[0])else:p3 = (a[j + 1], b[j + 1])rp3 = (x0[x0.index(p3[0])], y0[x0.index(p3[0])])if p1 == p2 or p1 == p3:passelse:# print('====+++===', p1, p2, p3)# print('====+++===', rp1, rp2, rp3)# 铅垂线长度s_length = abs((p2[1] * (p1[0] - p3[0])) + (p1[1] * (p3[0] - p2[0]) + (p3[1] * (p2[0] - p1[0]))) / (p3[0] - p2[0]))s = find_cross(p1, p2, p3)if isPointinPolygon(s, point_lst):dic[s_length] = [rp1, rp2, rp3]print('铅垂线长度', s_length, s, dic[s_length])# print(dic)max_s_length = dic[max(dic)]rp1 = max_s_length[0]rp2 = max_s_length[1]rp3 = max_s_length[2]# 点和直线两端点中点连线的斜率k = (((rp1[1] + rp2[1]) / 2) - ((rp1[1] + rp3[1]) / 2)) / (((rp1[0] + rp2[0]) / 2) - ((rp1[0] + rp3[0]) / 2))b = ((rp1[1] + rp2[1]) / 2) - (k * ((rp1[0] + rp2[0]) / 2))return k, bdef isPointinPolygon(point, rangelist):  # [[0,0],[1,1],[0,1],[0,0]] [1,0.8]print(point)# 判断是否在外包矩形内,如果不在,直接返回falselnglist = []latlist = []for i in range(len(rangelist) - 1):lnglist.append(rangelist[i][0])latlist.append(rangelist[i][1])# print(lnglist, latlist)maxlng = max(lnglist)minlng = min(lnglist)maxlat = max(latlist)minlat = min(latlist)# print(maxlng, minlng, maxlat, minlat)if (point[0] > maxlng or point[0] < minlng orpoint[1] > maxlat or point[1] < minlat):return Falsecount = 0point1 = rangelist[0]for i in range(1, len(rangelist)):point2 = rangelist[i]# 点与多边形顶点重合if (point[0] == point1[0] and point[1] == point1[1]) or (point[0] == point2[0] and point[1] == point2[1]):print("在顶点上")return False# 判断线段两端点是否在射线两侧 不在肯定不相交 射线(-∞,lat)(lng,lat)if (point1[1] < point[1] and point2[1] >= point[1]) or (point1[1] >= point[1] and point2[1] < point[1]):# 求线段与射线交点 再和lat比较point12lng = point2[0] - (point2[1] - point[1]) * (point2[0] - point1[0]) / (point2[1] - point1[1])# print(point12lng)# 点在多边形边上if (point12lng == point[0]):print("点在多边形边上")return Trueif (point12lng < point[0]):count += 1point1 = point2print(count)if count % 2 == 0:return Trueelse:return Trueif __name__ == '__main__':x0 = [1.00, 2.00, 3.00, 4.00, 5.00, 6.00]y0 = [2.02, 4.00, 5.98, 7.90, 10.10, 12.05]dy = find_line(x0, y0)print(dy)a0, b0 = find_poly(x0, dy)print(a0, b0)print(find_perfect_line(a0, b0, x0, y0))

转载于:https://www.cnblogs.com/sunqim16/p/9121011.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第4章 使用 Spring Boot

使用 Spring Boot 本部分将详细介绍如何使用Spring Boot。 这部分涵盖诸如构建系统&#xff0c;自动配置以及如何运行应用程序等主题。 我们还介绍了一些Spring Boot的最佳实践(best practices)。 虽然Spring Boot没有什么特殊之处&#xff08;它只是一个可以使用的库&#xff…

按功能而不是按层打包课程

大多数企业Java应用程序在设计上都有一些相似之处。 这些应用程序的打包通常由它们使用的框架&#xff08;如Spring&#xff0c;EJB或Hibernate等&#xff09;驱动。或者&#xff0c;您可以按功能对打包进行分组。 像其他任何有关建模的项目一样&#xff0c;这也不是没有任何问…

go mod依赖离线安装_Go语言go mod包依赖管理工具使用详解

go modules 是 golang 1.11 新加的特性。现在 1.12 已经发布了,是时候用起来了。Modules 官方定义为: 模块是相关 Go 包的集合。modules 是源代码交换和版本控制的单元。go 命令直接支持使用 modules,包括记录和解析对其他模块的依赖性。modules 替换旧的基于 GOPATH 的方法…

总是助手服务器失败怎么回事,《遇见逆水寒》连接服务器失败解决方法汇总 服务器连接失败问题原因...

导读遇见逆水寒连接服务器失败怎么回事&#xff0c;近期不少小伙伴都在反映遇见逆水寒助手连接服务器失败&#xff0c;一直登不上去是怎么回事&#xff0c;小编这就为大家分享下遇见逆水寒连接服务器失败解决方法。遇见逆水寒连接服务器失败解决方法...遇见逆水寒连接服务器失败…

Linux常用开发环境软件-redis安装

linux下安装redis3.2.11版本  1、安装编译环境 yum install gcc  //安装编译环境 2、到官网下载redis 官网地址&#xff1a;https://redis.io/download 3、用WinScp工具&#xff0c;将下载好的redis-3.2.11.tar.gz传输到linux服务器下的opt目录下(opt就相当于window的d://so…

小程序css

样式导入 import /** common.wxss **/ .small-p { padding:5px; } /** app.wxss **/ import "common.wxss"; .middle-p { padding:15px; } 全局样式跟局部样式 定义在 app.wxss 中的样式为全局样式&#xff0c;作用于每一个页面。在 page 的 wxss 文件中定义的样式…

项目第十一天

站立式会议&#xff1a; 燃尽图&#xff1a; 项目&#xff1a; 项目进展&#xff1a;系统完成&#xff0c;进行测试。 问题&#xff1a;测试的时候发现不知道如何进行系统的测试&#xff0c;所以测试内容的比较乱。 体会&#xff1a;从无到有完成一个项目&#xff0c;需要很多步…

JPA:确定关系的归属方

使用Java Persistence API&#xff08;JPA&#xff09;时&#xff0c;通常需要在两个实体之间创建关系。 这些关系是通过使用外键在数据模型&#xff08;例如数据库&#xff09;中定义的&#xff0c;而在我们的对象模型&#xff08;例如Java&#xff09;中则使用注释来定义关联…

huffman编码python_Huffman coding python实现

python实现的Huffman coding&#xff0c;给26个英文字母编码&#xff0c;inspired by Dave. 他只给出了Huffman tree的构建&#xff0c;并将walk_tree留给了提问者自己完成。我将walk_tree实现了一下并输出结果&#xff0c;做个记录&#xff0c;也顺便分享给有需要的同学。impo…

服务器芯片镜像测试,模拟镜像服务器磁盘问题的两个测试【转】

我们知道在高安全模式下&#xff0c;在主服务器上提交的事务必须同时在镜像服务器上提交成功&#xff0c;否则该事务无法在主数据库上提交。在上面的图中&#xff0c;一个事务在主数据库上提交的步骤包含&#xff1a;客户端程序将事务发送给主数据库服务器SQLServer主数据库服务…

运用Arc Hydro提取河网

Arc hydro 插件需要 spatial analyst 支持&#xff1a; 解决方法&#xff1a;Tools菜单>>Extensions...&#xff0c;勾选Spatial Analyst 1.设置存储路径 ApUtilities-set target locations 2.导入dem 3.拼接dem Dataset Name 设置为.tif,即存为tif格式&#xff0c;否则…

Java EE CDI依赖注入(@Inject)教程

在本教程中&#xff0c;我们将向您展示如何在CDI管理的Bean中实现依赖注入。 特别是&#xff0c;我们将利用CDI API提供的Inject批注将CDI bean注入另一个bean。 这样&#xff0c;可以在应用程序&#xff08;例如JavaServer Faces应用程序&#xff09;中使用bean。 CDI提供了几…

js 字符串减去字符串_JS去掉字符串前后空格或去掉所有空格的用法

1、 去掉字符串前后所有空格&#xff1a;代码如下&#xff1a;function Trim(str){return str.replace(/(^\s*)|(\s*$)/g, "");}说明&#xff1a;如果使用jQuery直接使用$.trim(str)方法即可&#xff0c;str表示要去掉前后所有空格的字符串。2、 去掉字符串中所有空…

文本强制不换行并隐藏

记录一个简单的css样式&#xff0c;重点&#xff1a;style"width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;",必须要有个宽度&#xff0c;white-space:nowrap;禁止换 行&#xff0c;overflow:hidden;隐藏多余的文本&#xff0c;text-overfl…

服务器性能是什么,什么是服务器性能的显卡,怎么理解?

什么是服务器性能的显卡&#xff0c;怎么理解&#xff1f;如果单说“”二字就是个伪命题&#xff0c;服务分不同的性能级别&#xff0c;有些刀片器的性能甚至还不如某些发烧级的游戏台式机&#xff0c;那它所用的显卡性能也会比较一般&#xff0c;如果是说哪些显卡是专门为服务…

JSON处理的Java API(JSR-353)–流API

Java很快将具有一组标准的API&#xff0c;作为Java EE 7的一部分处理JSON。此标准定义为JSR 353 – JSON处理的Java API &#xff08;JSON-P&#xff09;&#xff0c;目前正在最终批准投票中。 JSON-P提供面向对象和基于流的方法&#xff0c;在本文中&#xff0c;我将介绍流API…

判的质数的三种方法

方法一&#xff1a;bool判断法 Console.Write("q请输入一个数&#xff1a;"); int aint.Parse(Console.ReadLine()); bool isFind false; for (int i 2; i < a - 1; i) {   if (a % i 0)   {     isFind true;     break;   } } if (isFind tr…

记录工作中常用的CSS3

1.边框圆角,边框阴影 border-radius:6px; // border-radius:50%; //圆形 box-shadow: 1px 1px 1px #666; //box-shadow: h-shadow v-shadow blur spread color inset(outset); 2.背景图片的大小 background-size: 100% 100%; //对背景图片进行拉伸&#xff0c;使其完成填充内…

pcb成型板aoi检测_基于AOI技术的PCB常见质量缺陷检测

..优质资料..基于AOI技术的PCB常见质量缺陷检测摘要&#xff1a;印制电路板简称PCB&#xff0c;作为电子元器件的支撑体和电子元器件电气连接的载体&#xff0c;是重要的电子部件&#xff0c;由于它采用的是电子印刷术制作的&#xff0c;所以被称为印制电路板。AOI全称自动光学…

直接从JBoss AS 7组件使用JGroups

JGroups是Bela Ban的用于可靠消息交换的软件&#xff0c;该软件高度可配置&#xff0c;可以使用TCP或UDP作为传输协议。 基本上&#xff0c;您在多个客户端上运行JGroup&#xff0c;它们构成一个集群&#xff0c;它们可以在集群内发送和接收消息。 JGroups由JBoss Infinispan内…