当前位置: 首页 > news >正文

平面曲线参数拟合

对于平面曲线,参数方法一般可以表示为:
\begin{align} \begin{cases} x = x(t) \\ y = y(t) \end{cases} \end{align}

在拟合时,需要选择一些基函数$B_{i}(t)$,使得:

\begin{align} \begin{cases} x = x(t) = \sum_{i=0}^{m} a_{i} B_{i}(t) \\ y = y(t) = \sum_{i=0}^{m} b_{i} B_{i}(t) \end{cases} \end{align}

比如使用幂基函数:

\begin{align} B_{i}(t) = t^{i} \end{align}

假如现在平面上已经有了一些点集(序号是顺序):

 

最简单和直白的方式是连起来,如上图右。但是这样不够平滑,我们一般会进行拟合。

拟合方法一般使用最小二乘法,可以将$x(t)$和$y(t)$分别进行拟合。对于$i\in [1,2,...,n]$:

\begin{align} \begin{cases} x_{i} = \sum_{i=0}^{m} a_{i} B_{i}(t_{i}) \\ y_{i} = \sum_{i=0}^{m} b_{i} B_{i}(t_{i}) \end{cases} \end{align}

我们需要确定 $t$ 的取值位置。比如令 $t_{i}$ 均匀地分布在$[0,1]$之间(分布在任意的$[a,b]$之间都可以):

\begin{align} t_{i} = \frac{i}{n}\ \ \ \end{align}

但是这样往往不够细致,比如如果有两个点$p_{3}$和$p_{4}$距离比较远,那么$t_{3}$和$t_{4}$也应该要比较远:

 

因此可以根据两点距离除以总距离来生成不均匀的$t_{i}$:

\begin{align} & t_{1} = 0 \notag \\ & t_{i} = \frac{ \sum_{k=1}^{i} || D_{k} - D_{k-1} || }{\sum_{k=1}^{n} || D_{k} - D_{k-1} || } \ \ \ \ 2\leq i \leq n \end{align}

\section{拟合方法}

当我们使用基函数时,可以写为一个矩阵形式:

\begin{align} & \begin{bmatrix} 1 & B_{1}(t_{1}) & B_{2}(t_{1}) & ... & B_{m}(t_{1}) \\ 1 & B_{1}(t_{2}) & B_{2}(t_{2}) & ... & B_{m}(t_{2}) \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & B_{1}(t_{n-1}) & B_{2}(t_{n-1}) & ... & B_{m}(t_{n-1})\\ 1 & B_{1}(t_{n}) & B_{2}(t_{n}) & ... & B_{m}(t_{n}) \end{bmatrix} \begin{bmatrix} a_{0} & b_{0} \\ a_{1} & b_{1} \\ \vdots & \vdots \\ a_{m} & b_{m} \end{bmatrix} = \begin{bmatrix} x_{1} & y_{1} \\ x_{2} & y_{2} \\ \vdots & \vdots \\ x_{n-1} & y_{n-1} \\ x_{n} & y_{n} \end{bmatrix} \\ & write\ as\ :\ \mathbf{A}\mathbf{X}=\mathbf{P} \end{align}

令$m=n-1$,$\mathbf{A}$是一个$n\times n$的矩阵,可以直接求解线性系统,但是此时有可能$\mathbf{A}$是一个很接近奇异矩阵的矩阵,因此求逆会有很大的误差。

当$n<m$时,可以应用最小二乘法。我们计算拟合的误差函数:

\begin{align} & E = \sum_{i=1}^{n} \Big|\Big| \begin{pmatrix} x(t_{i}) \\ y(t_{i}) \end{pmatrix} - \begin{pmatrix} x_{i} \\ y_{i} \end{pmatrix} \Big|\Big|^{2} \\ &E = (\mathbf{A}\mathbf{X}-\mathbf{Y})^{T} (\mathbf{A}\mathbf{X}-\mathbf{Y}) \end{align}
对误差函数进行求导,令导数为$0$,得到:

\begin{align} & (\mathbf{A}^{T}\mathbf{A})\mathbf{X}=(\mathbf{A}^{T})\mathbf{P} \notag \\ & \mathbf{X}= (\mathbf{A}^{T}\mathbf{A})^{-1} (\mathbf{A}^{T})\mathbf{P} \end{align}
 

相关文章:

  • 计算机图形学(几何与建模方向)学习全攻略——学术科研篇
  • Latex: subfloat取消编号
  • 各种开发工具的历史版本网页合集
  • 图形学模型资源
  • 信号分析——学习全攻略
  • 每天一个PS技巧(原理+实践)——制作熊猫人表情包
  • 每天一个PS技巧(原理+实践)——简单背景的抠图与毛发抠图
  • 去掉PDF内容的换行符
  • 使用SigmaPlot绘制折线图
  • LaTex报错:xtra alignment tab has been changed to \cr.
  • TypeError: ‘int‘ object is not callable
  • 零基础从意义和公式两个层面深入了解傅里叶变换
  • 数据结构浙江大学 全部思考题+每周练习答案(已完结)
  • QT程序设计系列
  • VTK程序设计系列
  • [NodeJS] 关于Buffer
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Java 网络编程(2):UDP 的使用
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python 基础起步 (十) 什么叫函数?
  • vue-cli3搭建项目
  • Vue学习第二天
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 手写双向链表LinkedList的几个常用功能
  • 赢得Docker挑战最佳实践
  • 转载:[译] 内容加速黑科技趣谈
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (七)理解angular中的module和injector,即依赖注入
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)认识微服务
  • (译)2019年前端性能优化清单 — 下篇
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET连接数据库方式
  • .NET命名规范和开发约定
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .NET委托:一个关于C#的睡前故事
  • ::
  • [ linux ] linux 命令英文全称及解释
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [Android]使用Android打包Unity工程
  • [BZOJ] 3262: 陌上花开
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C++]:for循环for(int num : nums)