(转)最小二乘法拟合圆公式推导及vc实现[r]

(下文内容为转载,不过已经不清楚原创的是哪里了,特此说明)

转自: http://www.cnblogs.com/dotLive/archive/2006/10/09/524633.html

该网址下面有更多的讨论。

最小二乘法(least squares analysis)是一种 数学 优化 技术,它通过 最小化 误差 的平方和找到一组数据的最佳 函数 匹配。 最小二乘法是用最简的方法求得一些绝对不可知的真值,而令误差平方之和为最小。 最小二乘法通常用于 曲线拟合 (least squares fitting) 。这里有 拟合圆曲线 的公式推导过程 和 vc实现。




VC实现的代码:

 1 void CViewActionImageTool::LeastSquaresFitting()
 2 {
 3     if (m_nNum<3)
 4     {
 5         return;
 6     }
 7
 8     int i=0;
 9
10     double X1=0;
11     double Y1=0;
12     double X2=0;
13     double Y2=0;
14     double X3=0;
15     double Y3=0;
16     double X1Y1=0;
17     double X1Y2=0;
18     double X2Y1=0;
19
20     for (i=0;i<m_nNum;i++)
21     {
22         X1 = X1 + m_points[i].x;
23         Y1 = Y1 + m_points[i].y;
24         X2 = X2 + m_points[i].x*m_points[i].x;
25         Y2 = Y2 + m_points[i].y*m_points[i].y;
26         X3 = X3 + m_points[i].x*m_points[i].x*m_points[i].x;
27         Y3 = Y3 + m_points[i].y*m_points[i].y*m_points[i].y;
28         X1Y1 = X1Y1 + m_points[i].x*m_points[i].y;
29         X1Y2 = X1Y2 + m_points[i].x*m_points[i].y*m_points[i].y;
30         X2Y1 = X2Y1 + m_points[i].x*m_points[i].x*m_points[i].y;
31     }
32
33     double C,D,E,G,H,N;
34     double a,b,c;
35     N = m_nNum;
36     C = N*X2 - X1*X1;
37     D = N*X1Y1 - X1*Y1;
38     E = N*X3 + N*X1Y2 - (X2+Y2)*X1;
39     G = N*Y2 - Y1*Y1;
40     H = N*X2Y1 + N*Y3 - (X2+Y2)*Y1;
41     a = (H*D-E*G)/(C*G-D*D);
42     b = (H*C-E*D)/(D*D-G*C);
43     c = -(a*X1 + b*Y1 + X2 + Y2)/N;
44
45     double A,B,R;
46     A = a/(-2);
47     B = b/(-2);
48     R = sqrt(a*a+b*b-4*c)/2;
49
50     m_fCenterX = A;
51     m_fCenterY = B;
52     m_fRadius = R;
53
54     return;
55 }

工程下载
编译运行后随便打开一个图片,当然最好是全白的图片,然后就点吧,大于三个点后就会开始拟合。红线画的圆为拟合的圆,深蓝的点为鼠标点击设置的样本点。单击鼠标右键清空样本集。

时间: 2024-10-26 23:30:31

(转)最小二乘法拟合圆公式推导及vc实现[r]的相关文章

最小二乘法拟合圆

有一系列的数据点 {xi,yi}.我们知道这些数据点近似的落在一个圆上.依据这些数据预计这个圆的參数就是一个非常有意义的问题.今天就来讲讲怎样来做圆的拟合.圆拟合的方法有非常多种,最小二乘法属于比較简单的一种. 今天就先将这样的. 我们知道圆方程能够写为: (x?xc)2+(y?yc)2=R2 通常的最小二乘拟合要求距离的平方和最小.也就是 f=∑((xi?xc)2+(yi?yc)2??????????????????√?R)2 最小. 这个算起来会非常麻烦. 也得不到解析解. 所以我们退而求其

最小二乘法拟合圆 转

有一系列的数据点 {xi,yi}{xi,yi},我们知道这些数据点近似的落在一个圆上,根据这些数据估计这个圆的参数就是一个很有意义的问题.今天就来讲讲如何来做圆的拟合.圆拟合的方法有很多种,最小二乘法属于比较简单的一种.今天就先将这种. 我们知道圆方程可以写为: (x?xc)2+(y?yc)2=R2(x?xc)2+(y?yc)2=R2 通常的最小二乘拟合要求距离的平方和最小.也就是 f=∑((xi?xc)2+(yi?yc)2??????????????????√?R)2f=∑((xi?xc)2+

最小二乘法拟合java实现源程序(转)

因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @param x 实型一维数组,长度为 n .存放给定 n 个数据点的 X 坐标 * @param y 实型一维数组,长度为 n .存放给定 n 个数据点的 Y 坐标 * @param n 变量.给定数据点的个数 * @param a 实型一维数组,长度为 m .返回 m-1 次拟合多项式的 m 个系数 * @

python最小二乘法拟合

知道函数形式,python用最小二乘法拟合函数参数 例子: #-*- coding: utf-8 -*- #最小二乘拟合 #知道函数形式了,拟合函数的参数 #通过leastsq函数对带噪声的实验数据x, y1进行数据拟合,可以找到x和真实数据y0之间的正弦关系的三个参数: A, k, theta import numpy as np from scipy.optimize import leastsq import matplotlib.pyplot as pl def func(x,p): "

python中matplotlib实现最小二乘法拟合的过程详解

这篇文章主要给大家介绍了关于python中matplotlib实现最小二乘法拟合的相关资料,文中通过示例代码详细介绍了关于最小二乘法拟合直线和最小二乘法拟合曲线的实现过程,需要的朋友可以参考借鉴,下面来一起看看吧. 前言 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小.最小二乘法还

拟合圆并求圆心(matlab)

clc clear all I=imread('a003.bmp'); [m,n,p]=size(I); I=im2bw(I); se=strel('square',3); Ia=imerode(I,se); Iout=I-Ia; figure(1); imshow(Iout); Iout1=Iout; N=1; for i=1:m for j=1:n if Iout(i,j)==1 p(N,1)=i; p(N,2)=j; N=N+1; Iout(i,j+5:end)=0; end end en

线性模型的最小二乘法拟合(转)

我们知道在二维坐标中,已知两点就可以确定一个线性方程,如果有n个数据点(x1,y1),(x2,y2),...(xn,yn),那么就会有n个线性方程,我们使用最小二乘法从这n个方程中拟合出一个最佳的线性方程,也就是求出方程的参数a,b 设某个已知的一元线性方程的表达式为:y=a+bx有一组权重相等的测量数据(xi,yi),假定自变量xi的误差可以忽略,那么在某个自变量xi下,对应的测量数据为yi,线性方程上的点为a+bxi,二者的偏差为 di=yi-(a+bxi),如果测量数据yi恰好都落在线性方

最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)

1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*rand(1,size(y,2)); %%最小二乘拟合 xf=log(x); yf=yrand; xfa = [ones(1,size(xf,2));xf] w = inv(xfa*xfa')*xfa*yf';%直接拟合得到的结果 参考资料: 1.http://blog.csdn.net/lotus_

Matlab 最小二乘法拟合非线性函数

1.最小二乘原理 参考资料: 1.http://blog.csdn.net/lotus___/article/details/20546259 2.http://blog.sina.com.cn/s/blog_5404ea4f0101afth.html 2.matlab实现最小二乘法 利用matlab的最小二乘拟合函数对非线性函数进行拟合,具体地拟合的函数: [q r] = lsqcurvefit(fun, q_0, xdata, ydata);输入参数:fun:需要拟合的函数,假定有n个需要拟