最小二乘圆拟合模型公式推导&MATLAB代码求圆拟合

2023-05-16

理论部分1:
https://wenku.baidu.com/view/ecda32525beef8c75fbfc77da26925c52dc59156.html
最小二乘圆拟合模型公式推导
理论部分2:
https://blog.csdn.net/liyuanbhu/article/details/52891868
三点确定一个圆的计算方法
理论部分3:
https://blog.csdn.net/Sppy_z/article/details/104877864?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0-104877864-blog-6607930.pc_relevant_antiscanv3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
由圆上三点确定圆心和半径

代码部分:采用一般方程直接拟合
https://wenku.baidu.com/view/f38f72f36c1aff00bed5b9f3f90f76c661374c94.html
MATLAB代码求圆拟合

代码部分2:采用公式推导拟合
https://www.docin.com/p-260086637.html
matlab代码公式推导拟合

稍作整理,直接拟合:

%%
% https://wenku.baidu.com/view/ecda32525beef8c75fbfc77da26925c52dc59156.html
% https://wenku.baidu.com/view/f38f72f36c1aff00bed5b9f3f90f76c661374c94.html
%%
clear;close all;clc;
format compact;
figure
t=0:0.01:pi;
a=20;
b=30;
r=5;
x=a+r*cos(t)+randn(1,315);
y=b+r*sin(t)+randn(1,315);
plot(x,y,'b.')
hold on;grid on;
x=x(:); % Transpose
y=y(:); 
Mole=[x y ones(size(x))];
Deno=[-(x.^2+y.^2)];
Result1=Mole\Deno
% x^2+y^2+ax+by+c=0 ---> ax+by+c=-(x^2+y^2)
% [x y 1]*[a;b;c]=-(x^2+y^2)
% [a;b;c]=[x y 1]\[-(x^2+y^2)]
% Column principal elimination method
% Least square fitting can also be used
m=[x y ones(size(x))]\[-(x.^2+y.^2)] 
xc=-0.5*m(1);
yc=-0.5*m(2);
R=sqrt((m(1)^2+m(2)^2)/4-m(3))
plot(xc,yc,'r-x',(xc+R*cos(t)),(yc+R*sin(t)),'r.');
axis equal;

稍作整理,公式推导拟合:

%% https://www.docin.com/p-260086637.html
%%
function [R,xc,yc]=circle(x,y,N)

clc;close all;clear;
t=0:0.01:pi;
a=20;b=30;r=5;
% point(x,y)
x=a+r*cos(t)+randn(1,315);
y=b+r*sin(t)+randn(1,315);
figure(1)
plot(x,y,'b.')
hold on;grid on;axis equal;
% (x-xc)^2+(y-yc)^2=R^2
% x^2+y^2+ax+by+c=0
% xc=-a/2  yc=-b/2  R=sqrt(a^2+b^2-4c)/2
N=315; % Number of points
x1=0;x2=0;x3=0;
y1=0;y2=0;y3=0;
x1y1=0;
x1y2=0;
x2y1=0;
 for i=1:N
     x1=x1+x(i);
     x2=x2+x(i)*x(i);
     x3=x3+x(i)*x(i)*x(i);
     y1=y1+y(i);
     y2=y2+y(i)*y(i);
     y3=y3+y(i)*y(i)*y(i);
     x1y1=x1y1+x(i)*y(i);
     x1y2=x1y2+x(i)*y(i)*y(i);
     x2y1=x2y1+x(i)*x(i)*y(i);
 end
 
 C=N*x2-x1*x1;
 D=N*x1y1-x1*y1;
 E=N*x3+N*x1y2-(x2+y2)*x1;
 G=N*y2-y1*y1;
 H=N*x2y1+N*y3-(x2+y2)*y1;
 
 a=(H*D-E*G)/(C*G-D*D);
 b=(H*C-E*D)/(D*D-G*C);
 c=-(a*x1+b*y1+x2+y2)/N
 % Center and radius
 xc=a/(-2)
 yc=b/(-2)
 R=sqrt(a*a+b*b-4*c)/2

 plot(xc,yc,'r-x',(xc+R*cos(t)),(yc+R*sin(t)),'r.');


end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小二乘圆拟合模型公式推导&MATLAB代码求圆拟合 的相关文章

  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • 在Matlab中对字符进行分组并形成矩阵

    我有 26 个字符 A 到 Z 我将 4 个字符组合在一起 并用空格分隔以下 4 个字符 如下所示 abcd efgh ijkl mnop qrst uvwx yz 我的Matlab编码如下 str abcdefghijklmnopqrst
  • 我如何编写一个名为 dedbi 的 MATLAB 函数,它将输入 xtx 作为字符串并返回另一个字符串 xtxx 作为输出。

    dedbi 反转单词 即 a 将被 z 替换 b 将被 y 替换 c 将被 x 替换 依此类推 dedbi 将对大写字母执行相同的操作 即将字符串 A 替换为 Z 将 B 替换为 Y 将 C 替换为 X 依此类推 如果我给函数这个字符串 a
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • matlab中更快的插值方法

    我正在使用 interp1 来插值一些数据 temp 4 30 4 rand 365 10 depth 1 10 dz 0 5 define new depth interval bthD min depth dz max depth ne
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • MATLAB - 通过垂直连接子矩阵重新排列矩阵

    我在执行以下任务时遇到问题 假设一个 3x6 矩阵 A 0 2787 0 2948 0 4635 0 8388 0 0627 0 0435 0 6917 0 1185 0 3660 0 1867 0 2383 0 7577 0 6179 0
  • 帮助我理解FFT函数(Matlab)

    1 除了负频率之外 FFT 函数提供的最小频率是多少 是零吗 2 如果它为零 我们如何在对数刻度上绘制零 3 结果总是对称的 或者只是看起来是对称的 4 如果我使用abs fft y 来比较2个信号 我是否会失去一些准确性 1 除了负频率之
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • 像matlab一样在python中连接数组而不知道输出数组的大小

    我正在尝试在 python 中连接数组 类似于 matlab array1 zeros 3 500 array2 ones 3 700 array array1 array2 我在 python 中做了以下操作 array1 np zero
  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp
  • 氡变换线检测

    我正在尝试检测灰度图像中的线条 为此 我在 MATLAB 中使用 Radon 变换 我的 m 文件的示例如下所示 我可以使用此代码检测多行 我还使用线条的移位和旋转属性来绘制线条 但是 我不明白在获取rho和theta值后如何获取检测线的起
  • 基本矩阵错误?

    我试图通过扫描从相机拍摄的两个图像 检测图像中的特征 匹配它们 创建基本矩阵 使用相机内在函数计算基本矩阵 然后分解它以找到旋转和翻译 这是matlab代码 I1 rgb2gray imread 1 png I2 rgb2gray imre
  • 如何在matlab中使矩阵图平滑

    就像上图一样 怎样才能让画面更流畅呢 或者缩小y轴的范围 数据来自二维矩阵 然后我用plot data 请随意提出任何想法 平滑线条的一种方法涉及样本点之间数据的非线性插值 当你这样做时plot x y o http www mathwor
  • 二维随机微分方程 (SDE)

    我第一次研究随机微分方程 我正在寻求模拟和求解二维随机微分方程 模型如下 dp F t p dt G t p dW t where p 是一个 2 1 向量 p theta t phi t F是列向量 F sin theta Psi cos
  • MATLAB 子图标题和轴标签

    我有以下脚本来最终绘制 4 x 2 子图 files getAllFiles preliminaries n size files cases cell 1 n m cell 1 n for i 1 1 n S load files i c
  • 在 Matlab/Java 中将手部运动建模为 3D 曲线

    我只需要一些关于我遇到的问题 在哪里查看等的指导 我在我的一个项目中使用了运动跟踪手套 它返回每个手指和手掌的 X Y 和 Z 值 我想做的是首先根据这些坐标创建每个手指运动的表示 然后将它们每个附加到手掌的运动 以获得手的表示 一旦我完成
  • 用于读取csv写入数组的c++程序;然后操作并打印到文本文件中(已经用 matlab 编写)

    我想知道是否有人可以帮助我 我正在尝试构建一个程序 从 csv 文件中读取大小未知的浮点数大数据块 我已经在 MATLAB 中编写了此代码 但想要编译和分发此代码 因此转向 C 我只是在学习并尝试阅读本文以开始 7 5 19892 4 23
  • 使用网络计算机进行 Matlab 并行处理

    我熟悉matlabpool and parfor用法 但我仍然需要加快计算速度 我的 1GB 网络中有一台功能更强大的计算机 两台计算机都有 R2010b 并且具有相同的代码和路径 使用两台计算机进行并行计算的最简单方法是什么 我今天使用的
  • MATLAB - 从目录读取文件?

    我希望从目录中读取文件并对每个文件迭代执行操作 此操作不需要更改文件 我知道我应该为此使用 for 循环 到目前为止我已经尝试过 FILES ls path to folder for i 1 size FILES 1 STRU pdbre

随机推荐