标准二维圆拟合(matlab代码)

这篇具有很好参考价值的文章主要介绍了标准二维圆拟合(matlab代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.圆方程定义

常规圆方程定义为
( x − x 0 ) 2 + ( y − y 0 ) 2 = r 2 (x-x_0)^2+(y-y_0)^2 = r^2 (xx0)2+(yy0)2=r2
可以改写为
x 2 + y 2 + a x + b y + c = 0. x^2+y^2+ax+by+c=0. x2+y2+ax+by+c=0.
其中 a = − 2 x 0 , b = − 2 y 0 , c = x 0 2 + y 0 2 − r 2 a=-2x_0,b=-2y_0,c={x_0}^2+{y_0}^2-r^2 a=2x0,b=2y0,c=x02+y02r2

2.最小能量函数定义

要使得圆方程最为准确,则要是所有的点尽可能满足方程,因此需使函数F
F = ∑ ( x i 2 + y i 2 + a x i + b y i + c ) 2 = 0 , i ∈ [ 1 , N ] , N 为 点 数 目 F=\sum( {x_i}^2+{y_i}^2+a{x_i}+b{y_i}+c)^2 =0 , i\in [1,N],N为点数目 F=(xi2+yi2+axi+byi+c)2=0,i[1,N],N
但实际上其不可能为0,因此根据最小二乘法求解其最小值
对函数F求导可得
∂ F a = ∑ 2 ( x i 2 + y i 2 + a x i + b y i + c ) ∗ x i \frac{\partial{F}}{a} = \sum{2( {x_i}^2+{y_i}^2+a{x_i}+b{y_i}+c)*x_i} aF=2(xi2+yi2+axi+byi+c)xi
∂ F b = ∑ 2 ( x i 2 + y i 2 + a x i + b y i + c ) ∗ y i \frac{\partial{F}}{b} = \sum{2( {x_i}^2+{y_i}^2+a{x_i}+b{y_i}+c)*y_i} bF=2(xi2+yi2+axi+byi+c)yi
∂ F c = ∑ 2 ( x i 2 + y i 2 + a x i + b y i + c ) \frac{\partial{F}}{c} = \sum{2( {x_i}^2+{y_i}^2+a{x_i}+b{y_i}+c)} cF=2(xi2+yi2+axi+byi+c)
当这些导数为0是,函数最小
为方便求解,将其写成a,b,c的矩阵函数形式,则可得
标准二维圆拟合(matlab代码)
接下来便是求解方程AX=B文章来源地址https://www.toymoban.com/news/detail-421271.html

3.matlab代码

  1. 实例
% 圆拟合实例
clc;
close all;

%% 创建测试数据
num =1000;
% 噪声
rng(1);
noise1=0.2*randn(num,1);
rng(2);
noise2=0.2*randn(num,1);
% 创建初始数据
theta=(2*rand(num,1)-1)*pi;
center = [10,10];
r=3;
x= center(1) + r*cos(theta)+noise1;
y= center(2) + r*sin(theta)+noise2;

%% 拟合圆
figure;
scatter(x,y);
hold on;
[a,b,c] = fit_circle(x,y);
center_cal=[-a/2,-b/2];
r_cal = sqrt(a*a/4+b*b/4-c);
theta_cal =0:0.01:2*pi;
x_cal= center_cal(1) + r_cal*cos(theta_cal);
y_cal= center_cal(2) + r_cal*sin(theta_cal);
plot(x_cal,y_cal);

  1. 圆拟合函数
function [a,b,c] =  fit_circle(x,y)
% function fit_circle.m
% -------------------------------------------------------------------------
% 圆拟合
% 圆方程按照x^2+y^2+ax+by+c=0
% 最小化函数定义为 sum((x_i)^2+(y_i)^2+a(x_i)+b(y_i)+c),i为1到n的整数
% 计算导数,化为AX=B的形式,X为[a;b;c]
% Inputs:
%       x = 点x坐标,写成(1000,1)竖排格式
%       y = 点y坐标
% Output:
%       a,b,c = 圆方程对应参数
% Last updated: November 14, 2022

% 构建A
A1_1 = sum(x.^2);
A1_2 = sum(x.*y);
A1_3 = sum(x);
A2_1 = A1_2;
A2_2 = sum(y.^2);
A2_3 = sum(y);
A3_1 = A1_3;
A3_2 = A2_3;
A3_3 = size(x,1);
A=[A1_1,A1_2,A1_3;
  A2_1,A2_2,A2_3;
  A3_1,A3_2,A3_3];

% 构建B
B1 = -sum(x.^3+(y.^2).*x);
B2 = -sum(y.^3+(x.^2).*y);
B3 = -sum(x.^2+y.^2);
B = [B1;B2;B3];

% 计算
X = A\B;
a=X(1);
b=X(2);
c=X(3);

end

到了这里,关于标准二维圆拟合(matlab代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 调用matlab曲线拟合工具箱,自定义函数预测人口数量

    拟合所求函数值不需要在已知点精确等于原始函数值,目的为了使用更简单的函数更低次的多项式表示原函数。相比插值,面对大量节点情况下选择拟合求函数曲线不失为一种更好的方法,拟合得到的曲线为一条确定的曲线。 现有一组数据分布如下图:  我们要求一条直线

    2024年02月09日
    浏览(49)
  • 基于MATLAB的三维数据插值拟合与三次样条拟合算法(附完整代码)

    目录 一. 三维插值 例题1 二. 高维度插值拟合 格式一 格式二 格式三 格式四 格式五 例题2 三. 单变量三次样条插值 例题3 例题4 四. 多变量三次样条插值 例题6 首先三维网格生成是利用 meshgrid() 函数,在MATLAB中调用格式如下: 三维插值运算,主要利用griddata()函数与interp()函数

    2024年02月14日
    浏览(43)
  • 基于MATLAB的最小二乘法拟合与拟合工具箱使用教程(附完整代码与算法)

    给定一组数据满足某一函数模型,其中a为待定系数向量。 那么,最小二乘曲线拟合的目标就是:求出一组待定系数的值,使得以下表达式子最小: 在MATLAB中格式如下: 由以下MATLAB代码生成一组数据: 该组数据满足y(x),求出待定系数,使得目标函数的值为最小。 解: MATL

    2024年01月17日
    浏览(57)
  • 【重新定义matlab强大系列六】利用matlab进行一维滤波or二维滤波

    🔗 运行环境:matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥  推荐专栏:《算法研究》 ####  防伪水印—— 左手の明天 #### 💗 大家好🤗🤗🤗,我是 左手の明天 !好久不见💗 💗今天开启新的系列—— 重新定义matlab强大系列 💗 📆 

    2024年02月05日
    浏览(64)
  • 利用中心差分格式求解一阶波动方程(附Matlab代码)

    ∂ 2 u ∂ t 2 − ∂ 2 u ∂ x 2 = 0 , 0 x 1 , t 0 , frac{partial^2u}{partial t^2}-frac{partial^2u}{partial x^2}=0,0x1,t0, ∂ t 2 ∂ 2 u ​ − ∂ x 2 ∂ 2 u ​ = 0 , 0 x 1 , t 0 , 初始边值条件为: u ( 0 , x ) = 2 s i n ( π x ) , uleft(0,xright)=2sinleft(pi xright), u ( 0 , x ) = 2 s in ( π x ) , u t ( 0 , x ) = 0 , 0 x 1 , u_tle

    2024年02月06日
    浏览(79)
  • MATLAB小提琴仿真与代码实现(数学物理方程)大作业

    问题背景与介绍 振动是自然界最普遍的现象之一,也是所有物体发声的来源,可以说振动与我们的 生活息息相关。一直以来,科研人员在振动领域投入了大量研究,对振动过程和机理的 认识也日益深化,使振动能够趋利避害。振动力学是关于机械振动的一门重要学科,它

    2024年02月06日
    浏览(48)
  • Matlab读Zygo干涉仪面形数据并进行37阶Zernike拟合(附Matlab代码)

    本代码具有以下两个主要功能: 通过在Matlab中开发大量的反编译代码,我们成功地在Matlab中提取到Zygo .dat二进制文件中所包含的 137个测量参数 ,包括: 相位/面形数据(PhaseData)、干涉图(IntensityData)、干涉图像素标定(pixel_height和pixel_width)、测试波长(wavelength_in)和

    2024年02月03日
    浏览(21)
  • 【数值分析实验】(五)线性方程组的迭代解法(含matlab代码)

            迭代法就是用某种极限过程去逐步逼近线性方程精确解的方法。迭代法具有需要计算机的存储单元较少、程序设计简单、原始系数矩阵在计算过程中始终不变等优点,但存在收敛性及收敛速度问题。 3.1.1 算法过程 3.1.2 代码 3.1.3 计算结果 3.2.1 算法过程 3.2.2 代码

    2024年02月03日
    浏览(47)
  • 【数值分析实验】(八)常微分方程的数值解法(含matlab代码)

            科学技术中很多问题都可用常微分方程的定解问题来描述,主要有初值问题和边值问题两大类。常微分方程式描述连续变化的数学语言,微分方程的求解时确定满足给定方程的可微函数,要找出这类问题的解析解往往非常困难,甚至是不可能的。研究一阶常微分方

    2024年02月03日
    浏览(57)
  • 【数学建模】常用微分方程模型 + 详细手写公式推导 + Matlab代码实现

    微分方程基本概念 微分方程在数学建模中的应用 微分方程常用模型(人口增长模型、传染病模型) 2022.06.19 微分方程,是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中

    2024年02月09日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包