当前位置: 首页 > 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.dtcms.com/a/331969.html

相关文章:

  • ROS机器人云实践设计十年-2025-2015-
  • 速通 OpenPI 本地部署(远端推理)简易实现 —— WSL2 + Ubuntu 24.04 环境完整指南
  • 会议系统完整流程简版解析:创建会议、加入会议与消息转发
  • 【框架】跨平台开发框架自用整理
  • HTB Busqueda writeup
  • 经典蓝牙(BR/EDR)配对连接全过程:从 HCI 命令到 Profile 交互
  • C++编程学习(第23天)
  • Mybatis 源码解读-Plugin插件源码
  • 数据结构---关于复杂度的基础解析与梳理
  • 2025年缩水甘油苯基醚市场深度全景调研:投资前景分析及趋势预测
  • 机器学习——TF-IDF算法
  • 捉迷藏(BFS)
  • NY219NY220美光固态闪存NY224NY229
  • 数据结构---链式结构二叉树
  • PostgreSQL——触发器
  • 【慕伏白】CTFHub 技能树学习笔记 -- 基础知识 签到
  • leetcode-python-344反转字符串
  • Wireshark 与 Fiddler 的对比与适用场景
  • 宋红康 JVM 笔记 Day01|JVM介绍
  • Flink on YARN启动全流程深度解析
  • AI生成视频大纲(AI生成视频摘要功能)
  • python中的map函数
  • 记录LiveData使用及原理
  • Unity宝箱随机事件实现指南
  • AI三国杀:马斯克炮轰苹果“偏袒”OpenAI,Grok与ChatGPT的应用商店战争揭秘
  • 【昇腾】VirtualBox虚拟机下搭建Ubuntu 22.04环境给TF卡制卡报读写IO错误的问题处理_20250814
  • 【CF】Day127——杂题 (数论 gcd | 数论 gcd | 博弈论 | 二分图判断 | 贪心 + 暴力 / 二分答案 | 数论 gcd + 动态规划)
  • linux 主机驱动(SPI)与外设驱动分离的设计思想
  • 把大模型当“温度计”——基于 LLM 的分布式系统异常根因定位实战
  • 企业可商用的conda:「Miniforge」+「conda-forge」