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

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);

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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值