最小二乘法求解圆方程圆形及半径

2023-11-17

ci最小二乘法定义(摘抄于百度百科):

基本思路(摘抄于百度百科):

简单的来说,最小二乘法为一类线性算法,将需要求解的系数当作未知数,f(x)与x当作已知数,通过多组对应关系求得系数的方法。

所以,最小二乘法仅适合f(x)=\alpha 1\varphi 1(x)+\alpha 2\varphi 2(x)+\alpha 3\varphi 3(x)+\alpha 4\varphi 4(x)+......+\alpha m\varphi m(x)系数为一次项方程式

例如:y=kx+b,k与b作为系数是可通过最小二乘法求的

而:y=x^{A},A作为系数,是不可通过最小二乘法求得的

理论过程:

当圆心为(0,0),半径为r时,可得圆的方程式为:

x^{2}+y^{2}=r^{2}

令圆心为(h,k)时,

圆方程为:(x-h)^{2}+(y-k)^{2}=r^{2}

这是在连续数据的情况下,我们将其代入离散数据点的情况:

圆方程为:\left ( \sum_{i=1}^{n}X_{n}-h\right )^{2}+\left ( \sum_{i=1}^{n}Y_{n}-k\right )^{2}=r^{2}

展开式为:\sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}-2k\sum_{i=1}^{n}Y_{i}+h^{2}+k^{2}-r^{2}=0

为了简化方程式,令h^{2}+k^{2}-r^{2}=p

则方程为:\sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}-2k\sum_{i=1}^{n}Y_{i}+p=0

既误差函数为:E=\sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}-2k\sum_{i=1}^{n}Y_{i}+p\sum_{i=1}^{n}X_{i}^{0}=0

对误差函数的二次进行求导,已知E=0,既误差函数的二次方对任何数求导均为0:

所以:\frac{\partial \left | E \right |^2 }{\partial h}=0;\frac{\partial \left | E \right |^2 }{\partial k}=0;\frac{\partial \left | E \right |^2 }{\partial p}=0

推得:

\small 2\left ( \sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}-2k\sum_{i=1}^{n}Y_{i}+p\sum_{i=1}^{n}X_{i}^{0} \right )\times (-2\sum_{i=1}^{n}X_{i})=0\small 2\left ( \sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}-2k\sum_{i=1}^{n}Y_{i}+p\sum_{i=1}^{n}X_{i}^{0} \right )\times (-2\sum_{i=1}^{n}Y_{i})=0

 \small 2\left ( \sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}-2k\sum_{i=1}^{n}Y_{i}+p\sum_{i=1}^{n}X_{i}^{0} \right )\times\left (\sum_{i=1}^{n}{X_{i}}^{0} \right )=0

展开并化简得:

\small \sum_{i=1}^{n}X_{i}^{3}+\sum_{i=1}^{n}X_{i}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}^{2}-2k\sum_{i=1}^{n}X_{i}Y_{i}+p\sum_{i=1}^{n}X_{i}=0

\small \sum_{i=1}^{n}X_{i}^{2}Y_{i}+\sum_{i=1}^{n}Y_{i}^{3}-2h\sum_{i=1}^{n}X_{i}Y_{i}-2k\sum_{i=1}^{n}{Y_{i}}^{2}+p\sum_{i=1}^{n}Y_{i}=0

\small \sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}-2h\sum_{i=1}^{n}X_{i}-2k\sum_{i=1}^{n}{Y_{i}}+p\sum_{i=1}^{n}Y_{i}=0

系数放等号左边,常数放等号右边

\small 2h\sum_{i=1}^{n}X_{i}^{2}+2k\sum_{i=1}^{n}X_{i}Y_{i}-p\sum_{i=1}^{n}X_{i}=\sum_{i=1}^{n}X_{i}^{3}+\sum_{i=1}^{n}X_{i}Y_{i}^{2}

\small 2h\sum_{i=1}^{n}X_{i}Y_{i}+2k\sum_{i=1}^{n}{Y_{i}}^{2}-p\sum_{i=1}^{n}Y_{i}=\sum_{i=1}^{n}X_{i}^{2}Y_{i}+\sum_{i=1}^{n}Y_{i}^{3}

\small 2h\sum_{i=1}^{n}X_{i}+2k\sum_{i=1}^{n}{Y_{i}}-p\sum_{i=1}^{n}Y_{i}=\sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}

使用矩阵表示既为

\small \begin{bmatrix} C11&C12&C13 \\ C21&C21&C23 \\ \ C31&C32&C33 \end{bmatrix}\times\begin{bmatrix} h\\ k\\ p \end{bmatrix}=\begin{bmatrix} R1\\ R2\\R3 \end{bmatrix}

其中

\small C11=\sum_{i=1}^{n}X_{i}^{2}\small C12=\sum_{i=1}^{n}X_{i}Y_{i}\small C13=\sum_{i=1}^{n}X_{i}

\small C21=\sum_{i=1}^{n}X_{i}Y_{i}\small C22\sum_{i=1}^{n}{Y_{i}}^{2}\small C23\sum_{i=1}^{n}Y_{i}

\small C31=\sum_{i=1}^{n}X_{i}\small C32=\sum_{i=1}^{n}{Y_{i}}\small C33=\sum_{i=1}^{n}Y_{i}

\small R1=\sum_{i=1}^{n}X_{i}^{3}+\sum_{i=1}^{n}X_{i}Y_{i}^{2}

\small R2=\sum_{i=1}^{n}X_{i}^{2}Y_{i}+\sum_{i=1}^{n}Y_{i}^{3}

\small R3=\sum_{i=1}^{n}X_{i}^{2}+\sum_{i=1}^{n}Y_{i}^{2}

求解矩阵方程既可得到圆心(h,k)

r=\sqrt{h^{2}+k^{2}-p}

可以利用克莱姆求解矩阵方程

\Delta=\begin{vmatrix} C11&C12&C13 \\ C21&C21&C23 \\ C31&C32&C33 \end{vmatrix}

\Delta h=\begin{vmatrix} R1&C12&C13 \\ R2&C21&C23 \\ R3&C32&C33 \end{vmatrix}

\Delta k=\begin{vmatrix} C11&R2&C13 \\ C21&R2&C23 \\ C31&R3&C33 \end{vmatrix}

\Delta p=\begin{vmatrix} C11&C12&R1\\ C21&C21&R2\\ C31&C32&R3\end{vmatrix}

解得:

h=\frac{\Delta h}{\Delta}k=\frac{\Delta k}{\Delta}p=\frac{\Delta p}{\Delta}

此方法和推导同样适合多项式方程、椭圆方程等,这边不再做详细介绍

MATLAB代码(为MATLAB R2022版本下.mlapp回调代码):

            [file,path] = uigetfile;
            if isempty(file)
                return;
            end 
            if ~contains(file,'.csv')
                msgbox("请确定选择文件为<.csv>文件后重试!")
                return;
            end
            filepath=strcat(path,file);
            LineData=readtable(filepath);
            LineAll=table2array(LineData);
            LineX=LineAll(:,1);
            Liney=LineAll(:,2);

            nSum=0;
            XSum=0;
            YSum=0;
            XYSum=0;
            X2Sum=0;            
            Y2Sum=0;

            X2YSum=0;
            XY2Sum=0;
            X3Sum=0;
            Y3Sum=0;


            N=size(LineX);
          
            for i=1:N
                nSum=nSum+1;
                XSum=XSum+LineX(i);
                YSum=YSum+Liney(i);
                XYSum=XYSum+LineX(i)*Liney(i);
                X2Sum=X2Sum+LineX(i)*LineX(i);
                Y2Sum=Y2Sum+Liney(i)*Liney(i);

                X2YSum=X2YSum+LineX(i)*LineX(i)*Liney(i);
                XY2Sum=XY2Sum+LineX(i)*Liney(i)*Liney(i);
                X3Sum=X3Sum+LineX(i)*LineX(i)*LineX(i);
                Y3Sum=Y3Sum+Liney(i)*Liney(i)*Liney(i);
            end 
            
            C11=2*X2Sum;
            C12=2*XYSum;
            C13=-1*XSum;
            C21=2*XYSum;
            C22=2*Y2Sum;
            C23=-1*YSum;
            C31=2*XSum;
            C32=2*YSum;
            C33=-1*nSum;

            R1=X3Sum+XY2Sum;
            R2=X2YSum+Y3Sum;
            R3=X2Sum+Y2Sum;
            
            M1=[C11,C12,C13;
                C21,C22,C23;
                C31,C32,C33;];

            M2=[R1;R2;R3];

            M3=M1\M2;

            A=M3(1);
            B=M3(2);
            R=sqrt((A^2+B^2-M3(3)));
            Resultstring=strcat("圆心(",num2str(A),",",num2str(B),")","半径:",num2str(R));
            msgbox(Resultstring);

此文章为个人知识点总结文章, 转载请标注来源。

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

最小二乘法求解圆方程圆形及半径 的相关文章

  • 带 if 语句的可向量化 FIND 函数 MATLAB

    我有一个矩阵u 我想遍历所有行和所有列并执行以下操作 如果元素非零 我返回行索引的值 如果元素为零 则查找该元素之后的下一个非零元素的行索引 我可以使用两个带有 find 函数的 for 循环轻松完成此操作 但我需要多次执行此操作 不是因为
  • MATLAB 中元胞数组的左连接

    I ve 2 cellMATLAB 中的数组 例如 A jim 4 paul 5 sean 5 rose 1 第二个 B jim paul george bill sean rose 我想做一个 SQL 左连接 这样我就可以得到 B 中的所
  • 在 Matlab 2014b 中移动等高线图的 z 值

    我正在尝试绘制曲面图 在曲面下方我希望显示轮廓线 但我希望轮廓位于z 1而不是默认值0 我找到了之前关于这个问题的帖子here https stackoverflow com questions 8054966 matlab how to
  • MATLAB 链表

    有哪些可能的方法来实现链表MATLAB http en wikipedia org wiki MATLAB 注意 我问这个问题是为了教学价值 而不是实用价值 我意识到 如果您实际上在 MATLAB 中滚动自己的链表 那么您可能做错了什么 然
  • 将 Android 应用程序与服务器上的 Matlab 应用程序连接

    我正在 Android 上开发一个应用程序 它将获取图像输入 并将该输入传递到安装 MATLAB 应用程序的服务器 MATLAB 应用程序将计算结果并将其返回到该 Android 应用程序 我想知道我可以使用哪个服务器 如何将 MATLAB
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n
  • 如何在 R 或 MATLAB 中为散点图创建阴影误差条“框”

    我想在 R 或 MATLAB 中创建一个简单的散点图 涉及两个变量 x 和 y 它们有与之相关的错误 epsilon x 和 epsilon y 然而 我不是添加误差线 而是希望在每个 x y 对周围创建一个 阴影框 其中框的高度范围从 y
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 傅里叶变换定理 matlab

    我目前正在尝试理解二维傅里叶位移定理 根据我到目前为止所了解到的情况 图像空间中的平移会导致相位差异 但不会导致频率空间中的幅度差异 我试图用一个小例子来演示这一点 但它只适用于行的移位 而不适用于列的移位 这是一个小演示 我只在这里显示幅
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han

随机推荐