艾丽游戏ing

最小二乘法拟合圆 最小二乘法拟合圆原理

艾丽游戏ing 1

在函数拟合中,如果用p表示函数中需要确定的参数,那么目标就是找到一组p,使得下面函数S的值最小:

最小二乘法拟合圆 最小二乘法拟合圆原理最小二乘法拟合圆 最小二乘法拟合圆原理


这种算法称为最小二乘法拟合。Python的Scipy数值计算库中的optimize模块提供了 leastsq() 函数,可以对数据进行最小二乘拟合计算。

此处利用该函数对一段弧线使用圆方程进行了拟合,并通过Matplotlib模块进行了作图,程序内容如下:

Python的使用中需要导入相应的模块,此处首先用 import 语句

分别导入了numpy, leastsq与pylab模块,其中numpy模块常用用与数组类型的建立,读入等过程。leastsq则为最小二乘法拟合函数。pylab是绘图模块。

接下来我们需要读入需要进行拟合的数据,这里使用了 numpy.loadtxt() 函数:

其参数有:

进行拟合时,首先我们需要定义一个目标函数。对于圆的方程,我们需要圆心坐标(a,b)以及半径r三个参数,方便起见用p来存储:

紧接着就可以进行拟合了, leastsq() 函数需要至少提供拟合的函数名与参数的初始值:

返回的结果为一数组,分别为拟合得到的参数与其误差值等,这里只取拟合参数值。

leastsq() 的参数具体有:

输出选项有:

最后我们可以将原数据与拟合结果一同做成线状图,可采用 pylab.plot() 函数:

pylab.plot() 函数需提供两列数组作为输入,其他参数可调控线条颜色,形状,粗细以及对应名称等性质。视需求而定,此处不做详解。

pylab.legend() 函数可以调控图像标签的位置,有无边框等性质。

pylab.annotate() 函数设置注释,需至少提供注释内容与放置位置坐标的参数。

pylab.show() 函数用于显示图像。

最终结果如下图所示:

用Python作科学计算

numpy.loadtxt

scipy.optimize.leastsq

如果你用solidworks来画此圆的话,很简单的,直接对弧长编辑一个方程式

"D1@草图1" = 3.14 * 2 * "D2@草图1" * 0.1

就搞定了,

如果你是要用数学的方法的求解,同理

设半径为A,已知弧长为B,

B = 3.14 * 2 * A * 0.1

由于B已知,A就可求出,此圆就得出了。

程序收好,结果如下:

ox =

566.6650

oy =

522.7090

r =

5.4276

点击按钮分别按照提示输入6个点的X和Y坐标 如果显示溢出的话应该是无法生成圆 因为运算中有一步会变成除以0出错的

给你一组测试数据

(1,7)

(2,6)

(5,8)

(7,7)

(9,5)

(3,7)

以上都是整数 当然你也可以输入小数

Private Sub Command1_Click()

Dim i As Integer

Dim X(0 To 5) As Double

Dim Y(0 To 5) As Double

For i = 0 To 5

X(i) = InputBox("输入第" & Str(i + 1) & "点的X值")

Y(i) = InputBox("输入第" & Str(i + 1) & "点的Y值")

Next

Dim x1, y1, x2, y2, x3, y3, x1y1, x1y2, x2y1 As Double

For i = 0 To 5

x1 = x1 + X(i)

y1 = y1 + Y(i)

x2 = x2 + X(i) * X(i)

y2 = y2 + Y(i) * Y(i)

x3 = x3 + X(i) * X(i) * X(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)

Next

Dim C, D, E, G, H, N As Double

N = 6

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

Dim thea, theb, thec As Double

thea = (H * D - E * G) / (C * G - D * D)

theb = (H * C - E * D) / (D * D - G * C)

thec = -(thea * x1 + theb * y1 + x2 + y2) / N

Dim resultA, resultB, resultR As Double

resultA = thea / (-2)

resultB = theb / (-2)

resultR = (thea * thea + theb * theb - 4 * thec) ^ 0.5 / 2

MsgBox ("最小二乘法拟合圆为:(" & Str(resultA) & "," & Str(resultB) & ") 半径为:" & Str(resultR))

End Sub

只要你有十组数据,可以用最小二乘法来拟合。但必须保证取的数据是可靠的,否则误差会很大的。

获得数据后,将椭圆方程表示为f(x,y)的形式,进行自定义函数。

然后,按常规的步骤,用

lsqcurvefit()或

nlinfit()函数,来拟合椭圆的半长轴a和半短轴b,以及椭圆的中心坐标。