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

【MATLAB技巧】已知平面上的一些点,拟合得到一个圆的例程,给出最小二乘与非线性迭代两种解法,附下载链接

在这里插入图片描述

本文所述代码用于对带噪声的圆形数据进行拟合,并比较代数法非线性最小二乘法的效果。
代码先生成已知圆心与半径的测试点并加噪声,然后用线性方程组解法快速估计圆心与半径(代数法),再以此结果为初值,通过最小化点到圆的距离平方和(非线性法)获得更精确参数,最后绘制原始点与两种拟合圆进行对比。

文章目录

  • 运行结果
  • 算法介绍
    • 1. 功能概述
    • 2. 核心公式
  • MATLAB源代码
  • 方法选择建议

运行结果

原始数据点与拟合后的圆形绘图示例:
在这里插入图片描述

数据输出:
在这里插入图片描述

算法介绍

1. 功能概述

  • 数据生成:首先构造一个已知圆心 (2,3)、半径 5 的圆形点集,并加入随机噪声。

  • 拟合方法

    1. 代数拟合法(线性法):通过解线性方程组快速估计圆心和半径。
    2. 非线性拟合法:以代数拟合结果为初值,利用 fmincon 最小化点到圆的距离平方和,得到更精确结果。
  • 结果对比:输出两种方法的圆心、半径以及残差。

  • 可视化:绘制原始数据点、两种拟合圆及其圆心,比较拟合效果。

2. 核心公式

(1) 圆的方程

一个圆在二维平面上的标准方程为:

(x−xc)2+(y−yc)2=r2(x - x_c)^2 + (y - y_c)^2 = r^2 (xxc)2+(yyc)2=r2

其中:

  • (xc,yc)(x_c, y_c)(xc,yc) 为圆心坐标
  • rrr 为半径

(2) 代数法推导

将圆方程展开:

x2+y2−2xcx−2ycy+(xc2+yc2−r2)=0x^2 + y^2 - 2x_c x - 2y_c y + (x_c^2 + y_c^2 - r^2) = 0 x2+y22xcx2ycy+(xc2+yc2r2)=0

设:

D=−2xc,E=−2yc,F=xc2+yc2−r2D = -2x_c,\quad E = -2y_c,\quad F = x_c^2 + y_c^2 - r^2 D=2xc,E=2yc,F=xc2+yc2r2

则有:

x2+y2+Dx+Ey+F=0x^2 + y^2 + D x + E y + F = 0 x2+y2+Dx+Ey+F=0

p=A−1bp = A^{-1}b p=A1b

进而得到半径:

r=c+xc2+yc2r = \sqrt{c + x_c^2 + y_c^2} r=c+xc2+yc2

(3) 非线性最小二乘法

目标是最小化点到圆的距离与半径差的平方和:

J(xc,yc,r)=∑i=1n((xi−xc)2+(yi−yc)2−r)2J(x_c, y_c, r) = \sum_{i=1}^n \left( \sqrt{(x_i - x_c)^2 + (y_i - y_c)^2} - r \right)^2 J(xc,yc,r)=i=1n((xixc)2+(yiyc)2r)2

使用 fmincon 在半径 r>0r > 0r>0 的约束下进行优化。

MATLAB源代码

程序结构:
在这里插入图片描述
部分代码:

clc;clear;close all;
rng(0);
% 生成测试数据(带噪声的圆)
true_center = [2, 3];
true_radius = 5;
theta = linspace(0, 2*pi, 20);
noise = 0.1 * randn(size(theta));x = true_center(1) + true_radius * cos(theta) + noise;
y = true_center(2) + true_radius * sin(theta) + noise;% 方法一:代数拟合
[center1, radius1, residual1] = fitCircle(x, y);% 方法二:非线性拟合
[center2, radius2] = fitCircleNonlinear(x, y);% 显示结果
fprintf('真实圆心: (%.2f, %.2f), 真实半径: %.2f\n', true_center, true_radius);
fprintf('代数拟合 - 圆心: (%.2f, %.2f), 半径: %.2f, 残差: %.4f\n', center1, radius1, residual1);
fprintf('非线性拟合 - 圆心: (%.2f, %.2f), 半径: %.2f\n', center2, radius2);

完整的代码(包括原创函数)的下载链接:
https://download.csdn.net/download/callmeup/91632602

方法选择建议

一共提供了两种方法,各有优势,区别如下:

  1. 代数拟合(方法一):计算速度快,适合大多数情况,但在噪声较大时可能不够准确
  2. 非线性拟合(方法二):更准确,特别是在存在噪声的情况下,但计算量更大
  • 如果数据噪声不大且需要快速处理,推荐使用方法一;
  • 如果追求高精度,推荐使用方法二。

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

http://www.lryc.cn/news/620907.html

相关文章:

  • Swift 数据类型全景解析(基础到高阶)
  • Gradle(四)Maven 项目迁移 Gradle 项目实践
  • [激光原理与应用-274]:理论 - 波动光学 - 光是电磁波,无线电磁波可以通过天线接收和发送,为什么可见光不可以?
  • 滑动窗口题目:定长子串中元音的最大数目
  • 【读代码】开源流式语音编码器SecoustiCodec
  • MySQL的索引(索引的创建和设计原则):
  • python自学笔记8 二维和三维可视化
  • 业务敏捷性对SAP驱动型企业意味着什么?如何保持企业敏捷性?
  • 网络通信全过程:sk_buff的关键作用
  • ⭐CVPR2025 3D 高斯探测视觉基础模型3D能力
  • Mybatis学习笔记(五)
  • 3D-R1、Scene-R1、SpaceR论文解读
  • 区块链 + 域名Web3时代域名投资的新风口(上)
  • CTFSHOW | nodejs题解 web334 - web344
  • 一颗TTS语音芯片给产品增加智能语音播报能力
  • 关于RSA和AES加密
  • vue+后端
  • vue3使用leaflet地图
  • 最新去水印小程序系统 前端+后端全套源码 多套模版 免授权(源码下载)
  • 跨域及解决方案
  • python+vue扫盲
  • langchain入门笔记03:使用fastapi部署本地大模型后端接口,优化局域网内的问答响应速度
  • Room 数据存储
  • AI 赋能:从智能编码提速到金融行业革新的实践之路
  • 机器翻译:Hugging Face库详解
  • 【51单片机学习】定时器、串口、LED点阵屏、DS1302实时时钟、蜂鸣器
  • 深入解析Prompt缓存机制:原理、优化与实践经验
  • (第十五期)HTML文本格式化标签详解:让文字更有表现力
  • 若依前后端分离版学习笔记(十)——数据权限
  • 阿里云TranslateGeneral - 机器翻译SDK-自己封账单文件版本—仙盟创梦IDE