最小二乘拟合椭圆

目录

  • 1.拟合椭圆
  • 2.示例代码

在这里插入图片描述

爬虫网站自重。

1.拟合椭圆

  二次曲线的一般方程为:
A x 2 + B x y + C y 2 + D x + E y + F = 0 Ax^2+Bxy+Cy^2+Dx+Ey+F=0 Ax2+Bxy+Cy2+Dx+Ey+F=0

  令:
Δ = B 2 − 4 A C Δ =B^2-4AC Δ=B24AC
那么,当 Δ > 0 Δ >0 Δ>0时方程表示双曲线;当 Δ = 0 Δ =0 Δ=0时方程表示抛物线;当 Δ < 0 Δ <0 Δ<0时方程表示椭圆。
  即对于椭圆的一般方程:
A x 2 + B x y + C y 2 + D x + E y + F = 0 Ax^2+Bxy+Cy^2+Dx+Ey+F=0 Ax2+Bxy+Cy2+Dx+Ey+F=0
需要有约束条件:
Δ = B 2 − 4 A C < 0 Δ =B^2-4AC<0 Δ=B24AC<0
  称二元函数 f ( x , y ) f(x,y) f(x,y) 为点 ( x , y ) (x,y) (x,y)到椭圆的代数距离, f ( x , y ) f(x,y) f(x,y)的表达式为:
f ( x , y ) = A x 2 + B x y + C y 2 + D x + E y + F f(x,y)=Ax^2+Bxy+Cy^2+Dx+Ey+F f(x,y)=Ax2+Bxy+Cy2+Dx+Ey+F
如果令向量 a ⃗ \vec{a} a 为:
a ⃗ = [ A , B , C , D , E , F ] T \vec{a}=[A,B,C,D,E,F]^T a =[ABCDEF]T
令向量 x ⃗ \vec{x} x 为:
x ⃗ = [ x 2 , x y , y 2 , x , y , 1 ] \vec{x}=[x^2,xy,y^2,x,y,1] x =[x2xyy2xy1]
那么椭圆的一般方程就可以改写为:
a ⃗ ⋅ x ⃗ = 0 \vec{a}\cdot\vec{x}=0 a x =0

  即代数距离为: a ⃗ ⋅ x ⃗ \vec{a}\cdot\vec{x} a x 。设有 N N N个数据点: ( x i , y i ) , i = 1 , 2 , 3 … N (x_i,y_i),i=1,2,3…N (xiyi)i=123N,那么如果要求最佳拟合的椭圆,便需要求 ∑ i = 1 N ( a ⃗ ⋅ X i ⃗ ) 2 \sum_{i=1}^N(\vec{a}\cdot\vec{X_i})^2 i=1N(a Xi )2的最小值。这可以运用最小二乘法求解,但所得到的结果是圆锥曲线而不是一定椭圆。
  所以,如果要获得椭圆解,就需要加入约束条件:
Δ = B 2 − 4 A C < 0 Δ =B^2-4AC<0 Δ=B24AC<0
  一般地,在一个合适的尺度下,上述形式为不等式的约束条件可以转化为形式为等式的约束条件,即有:
B 2 − 4 A C = − 1 B^2-4AC=-1 B24AC=1
  那么,如果定义一个 N × 6 N×6 N×6的矩阵 D D D
D = [ x 1 2 x 1 y 1 y 1 2 x 1 y 1 1 x 2 2 x 2 y 2 y 2 2 x 2 y 2 1 x 3 2 x 3 y 3 y 3 2 x 3 y 3 1 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ x n 2 x n y n y n 2 x n y n 1 ] D=\left[ \begin{matrix} x_1^2& x_1y_1 & y_1^2 &x_1&y_1&1 \\ x_2^2& x_2y_2 & y_2^2 &x_2&y_2&1 \\ x_3^2& x_3y_3 & y_3^2 &x_3&y_3&1 \\ \vdots & \vdots & \vdots & \vdots& \vdots& \vdots \\ x_n^2& x_ny_n & y_n^2 &x_n&y_n&1 \\ \end{matrix} \right] D= x12x22x32xn2x1y1x2y2x3y3xnyny12y22y32yn2x1x2x3xny1y2y3yn1111
  定义一个 6 × 6 6×6 6×6的矩阵 C C C
C = [ 0 0 2 0 0 0 0 − 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] C=\left[ \begin{matrix} 0& 0 & 2 & 0 & 0 & 0\\ 0 & -1 & 0 & 0 & 0 &0 \\ 2& 0 & 0 & 0 & 0 & 0 \\ 0& 0 & 0 & 0 & 0 & 0 \\ 0& 0 & 0 & 0 & 0 & 0 \\ 0& 0 & 0 & 0 & 0 & 0 \\ \end{matrix} \right] C= 002000010000200000000000000000000000
那么,约束条件就可以写为:
a ˉ T C a ˉ = 1 \bar{a}^TC\bar{a}=1 aˉTCaˉ=1
在此条件下,求下式的最小值:
∣ ∣ D a ˉ ∣ ∣ 2 = a ˉ T D T D a ˉ ||D\bar{a}||^2=\bar{a}^TD^TD\bar{a} ∣∣Daˉ2=aˉTDTDaˉ
构造拉格朗日函数为:
L ( D , λ ) = a ˉ T D T a ˉ − λ ( a ˉ T C a ˉ − 1 ) L(D,\lambda)=\bar{a}^TD^T\bar{a}-\lambda(\bar{a}^TC\bar{a}-1) L(D,λ)=aˉTDTaˉλ(aˉTCaˉ1)
为求极值,可令偏导数为0:
δ L ( D , λ ) δ a ˉ = D T D a ˉ − λ C a ˉ = 0 \frac{\delta L(D,\lambda)}{\delta \bar{a}}=D^TD\bar{a}-\lambda C\bar{a}=0 δaˉδL(D,λ)=DTDaˉλCaˉ=0
于是:
D T D a ˉ = λ C a ˉ D^TD\bar{a}=\lambda C\bar{a} DTDaˉ=λCaˉ
如果令:
S = D T D S=D^TD S=DTD
那么,等式就可以化为:
S a ⃗ = λ C a ⃗ S\vec{a}=\lambda C\vec{a} Sa =λCa
如果 S S S可逆,并且令 X = S − 1 C X=S^{-1}C X=S1C,那么可以将其转化为求取矩阵的特征值的形式:
X a ⃗ = 1 λ a ⃗ X\vec{a}=\frac{1}{\lambda}\vec{a} Xa =λ1a
可以知道,上面的矩阵 X X X为6 阶方阵,其特征多项式为6 阶多项式。
  事实上,可以证明,问题的结果对应着 X X X的特征值的绝对值最大的特征向量。
在实际操作中,是可以采用求极限的算法进行求解的。
  如果矩阵 X X X n n n个不同的特征值: λ 1 , λ 2 , λ 3 , … , λ n λ_1,λ_2,λ_3,…,λ_n λ1λ2λ3λn其对应的特征向量分别为:
a ⃗ 1 , a ⃗ 2 , a ⃗ 3 , … , a ⃗ n \vec{a}_1,\vec{a}_2,\vec{a}_3,…,\vec{a}_n a 1,a 2,a 3,,a n
  可以知道,这些特征向量线性无关,于是, n n n维向量 x ⃗ \vec{x} x 可以表示为:
x ⃗ = k 1 a ⃗ 1 + k 2 a ⃗ 2 + k 3 a ⃗ 3 + . . . + k n a ⃗ n \vec{x}=k_1\vec{a}_1+k_2\vec{a}_2+k_3\vec{a}_3+...+k_n\vec{a}_n x =k1a 1+k2a 2+k3a 3+...+kna n
那么,可以得到:
X m x ⃗ = k 1 m a ⃗ 1 + k 2 m a ⃗ 2 + k 3 m a ⃗ 3 + . . . + k n m a ⃗ n X^m\vec{x}=k_1^m\vec{a}_1+k_2^m\vec{a}_2+k_3^m\vec{a}_3+...+k_n^m\vec{a}_n Xmx =k1ma 1+k2ma 2+k3ma 3+...+knma n
  令 k k k k 1 , k 2 , k 3 … k n k_1,k_2,k_3…k_n k1,k2,k3kn 中的绝对值最大的值,其对应的特征向量为 a ⃗ \vec{a} a ,即:
k = m a x ( ∣ k 1 ∣ , ∣ k 2 ∣ , ∣ k 3 ∣ , … , ∣ k n ∣ ) k=max({|k_1|,|k_2|,|k_3|,…,|k_n|}) k=max(k1k2k3kn)
那么,当 m → + ∞ m → + ∞ m+时,有 X m m ⃗ → k m a ⃗ X^m\vec{m}→k^m\vec{a} Xmm kma 。所得的 a ⃗ \vec{a} a 即为所求的椭圆的参数所组成的向量。

2.示例代码

在这里插入代码片

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

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

相关文章

js基础-练习三

九九乘法表&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthsc, initial-scale1.0"><title>九九乘法表</title><style&g…

NLP杂记

来京一周余&#xff0c;初病将愈&#xff0c;终跑通llama及ViT&#xff0c;记于此—— 之前都是做的图像&#xff0c;大模型迁移基本上都是NLP相关的知识&#xff0c;很多东西和CV差距还是有点&#xff0c;再加上大模型对算力要求较高&#xff0c;基于云的操作对我一个习惯在本…

【uniapp学习之】uni-forms必填项校验

代码块 <uni-forms ref"baseForm" :modelValue"baseFormData" label-widthauto :rules"rules"><uni-forms-item label"企业名称" required name"principalName"><uni-easyinput v-model"baseFormData.…

node中间件-koa框架

文章目录 1. koa 基本使用2. 参数解析3. 请求路径区分4. 路由5 参数解析5.1 params 与query解析5.2 body参数与urlencoded 解析5.3 form-data参数 6 . 文件上传7. 静态服务器8 响应数据9 错误处理 1. koa 基本使用 安装 npm i koakoa导出的是一个类&#xff0c;必须用new关键字…

Linux 用户组相关命令

添加用户组的命令是 groupadd&#xff0c;命令格式如下: [rootlocalhost ~]# groupadd [选项] 组名 选项&#xff1a; -g GID&#xff1a;指定组 ID&#xff1b;-r&#xff1a;创建系统群组。 使用 groupadd 命令创建新群组非常简单&#xff0c;例如&#xff1a; [rootlocalh…

Pytorch个人学习记录总结 05

目录 神经网络的基本骨架 卷积操作 torch.nn.functional.conv2d 神经网络的基本骨架 搭建Neural Network骨架主要用到的包是torch.nn&#xff0c;官方文档网址&#xff1a;torch.nn — PyTorch 2.0 documentation&#xff0c;其中torch.nn.Module很重要&#xff0c;是所有所…

springboot mybatis-plus 多数据源配置(HikariCP)

1.导入依赖jar <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgres…

【JVM】浅看JVM的运行流程和垃圾回收

1.JVM是什么 JVM&#xff08; Java Virtual Machine&#xff09;就是Java虚拟机。 Java的程序都运行在JVM中。 2.JVM的运行流程 JVM的执行流程&#xff1a; 程序在执行之前先要把java代码转换成字节码&#xff08;class文件&#xff09;&#xff0c;JVM 首先需要把字节码通过…

springboot中logback日志配置

springboot中logback日志配置 前言默认配置logback-spring.xml详细配置 前言 Spring Boot使用Apache的Commons Logging作为内部的日志框架&#xff0c;其仅仅是一个日志接口&#xff0c;在实际应用中需要为该接口来指定相应的日志实现。 Spring Boot从1.4版本开始内置的日志框…

程序员面试系列,kafka常见面试题

原文链接 Kafka是什么&#xff1f;它的主要作用是什么&#xff1f;什么是Kafka的主题&#xff08;Topic&#xff09;和分区&#xff08;Partition&#xff09;&#xff1f;Kafka中的消息是如何被生产者发送和消费者接收的&#xff1f;Kafka中的分区有什么作用&#xff1f;为什…

聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法

聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法 当使用LINQ查询数据时&#xff0c;我们常常会面临选择使用.AsEnumerable(), .AsQueryable(), 和 .ToList()方法的情况。这些方法在使用时有不同的效果和影响&#xff0c;需要根据具体场景来选择合适的方法。…

springboot热加载spring-boot-devtools:

springboot热加载 基于idea开发springboot项目使用热加载 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</op…

金融领域:产业链知识图谱包括上市公司、行业和产品共3类实体,构建并形成了一个节点10w+,关系边16w的十万级别产业链图谱

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

前端 | ( 十三)CSS3简介及基本语法(下)| 伸缩盒模型 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 系列笔记&#xff1a; 【HTML4】&#xff08;一&#xff09;前端简介【HTML4】&#xff08;二&#xff09;各种各样的常用标签【HTML4】&#xff08;三&#xff09;表单及HTML4收尾…

Go 语言 值类型和引用类型

Go 语言 值类型和引用类型 值类型&#xff1a; 概述&#xff1a; 值类型的人变量直接存储其值&#xff0c;他们通常在栈上分配内存。当把一个值类型的变量赋值给另外一个变量、作为函数参数传递或从函数返回时&#xff0c;进行值的复制。因此每个变量都有自己独立的存储&…

Flutter 自定义 虚线 分割线

学习使用Flutter 进行 虚线 自定义控件 练习 // 自定义虚线 &#xff08;默认是垂直方向&#xff09; class DashedLind extends StatelessWidget {final Axis axis; // 虚线方向final double dashedWidth; // 根据虚线的方向确定自己虚线的宽度final double dashedHeight; //…

实训笔记7.24

实训笔记7.24 7.24笔记一、Hadoop中MapReduce框架的使用原理和流程1.1 涉及到一些框架核心组件1.1.1 InputFotmat1.1.2 MapTask1.1. 3Partitioner1.1.4 WritableComparable1.1.5 Combiner&#xff08;可选&#xff09;1.1.6 WritableComparator(GroupingComparator)1.1.7 Reduc…

c++ 之 dynamic_pointer_cast

/* * dynamic_pointer_cast */ 描述 (Description) 它返回一个正确类型的sp副本&#xff0c;其存储的指针从U *动态地转换为T *。 声明 (Declaration) 以下是std :: dynamic_pointer_cast的声明。 template <class T, class U> shar…

微服务保护——Sentinel【实战篇二】

一、线程隔离 &#x1f349; 线程隔离有两种方式实现&#xff1a; 线程池隔离信号量隔离&#xff08;Sentinel默认采用&#xff09; 线程隔离&#xff08;舱壁模式&#xff09;&#x1f95d; 在添加限流规则时&#xff0c;可以选择两种阈值类型&#xff1a; QPS&#xff1a;…

SpringBoot-4

Spring Boot 使用 slf4j 日志 在开发中经常使用 System.out.println()来打印一些信息&#xff0c;但是这样不好&#xff0c;因为大量的使用 System.out 会增加资源的消耗。实际项目中使用的是 slf4j 的 logback 来输出日志&#xff0c;效率挺高的&#xff0c;Spring Boot 提供…