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

在这里插入图片描述

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

运行结果

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

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

算法介绍

1. 功能概述

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

  • 拟合方法

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

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

2. 核心公式

(1) 圆的方程

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

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

其中:

  • ( x c , y c ) (x_c, y_c) (xc,yc) 为圆心坐标
  • r r r 为半径

(2) 代数法推导

将圆方程展开:

x 2 + y 2 − 2 x c x − 2 y c y + ( x c 2 + y c 2 − r 2 ) = 0 x^2 + y^2 - 2x_c x - 2y_c y + (x_c^2 + y_c^2 - r^2) = 0 x2+y22xcx2ycy+(xc2+yc2r2)=0

设:

D = − 2 x c , E = − 2 y c , F = x c 2 + y c 2 − r 2 D = -2x_c,\quad E = -2y_c,\quad F = x_c^2 + y_c^2 - r^2 D=2xc,E=2yc,F=xc2+yc2r2

则有:

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

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

进而得到半径:

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

(3) 非线性最小二乘法

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

J ( x c , y c , r ) = ∑ i = 1 n ( ( x i − x c ) 2 + ( y i − y c ) 2 − r ) 2 J(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)2 r)2

使用 fmincon 在半径 r > 0 r > 0 r>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.youkuaiyun.com/download/callmeup/91632602

方法选择建议

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

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值