matlab拟合椭圆曲线
拟合要得出椭圆方程
要绘出图形
得出误差系数 展开
基本思路
椭圆的拟合比较复杂,考虑一般情形,涉及到的参数应包括长半轴、短半轴、倾角、中心坐标等5个参数。拟合结果对参数的初值比较敏感,需要小心选择。
楼主所说的“误差系数”不知道是怎样定义,未计算。但有了拟合结果之后,只要定义明确,计算肯定不是难事。
拟合结果
以下是用最小二乘法拟合的结果:
考虑到拟合结果对初值过于敏感,采用遗传算法进行拟合。由于遗传算法属于一种带有随机性的方法,多次运行可能得到不同结果。为避免参数空间过大,应考虑根据实际的数据分布情况,对参数的范围适当做一些限制。以下是一组结果:
参考代码
最小二乘法:
function zd
d = [0.50151 0; 0 1.26586; 1.28399 1.28399; 0.68278 -0.68278;
0 -2.45619; -7.17523 0; -11.13293 -11.13293; -2.15106 2.15106];
X = d(:,1)';
Y = d(:,2)';
clf
plot(X,Y,'x')
hold on
c = lsqcurvefit(@curve,[8 2 50*pi/180 -5.5 -4.5],[X;Y],X*0)
a = c(1);
b = c(2);
Q = c(3);
T=linspace(0,2*pi,100);
x1=a*cos(T);
y1=b*sin(T);
x=x1*cos(Q)-y1*sin(Q)+c(4);
y=x1*sin(Q)+y1*cos(Q)+c(5);
plot(x,y,'r--')
c(3) = c(3) * 180/pi;
text(-11,2.5,sprintf('a = %.3g, b = %.3g\n\\theta = %.3g\nx_0 = %.3g, y_0 = %.3g',c))
function f = curve(c,xy)
a = c(1);
b = c(2);
Q = c(3);
t=linspace(0,2*pi,500);
x1=a*cos(t);
y1=b*sin(t);
x=x1*cos(Q)-y1*sin(Q) + c(4);
y=x1*sin(Q)+y1*cos(Q) + c(5);
f = xy(1,:)*0;
for i=1:length(xy)
f(i) = min( sqrt((xy(1,i)-x).^2 + (xy(2,i)-x).^2 ) );
end
遗传算法:
function zd
d = [0.50151 0; 0 1.26586; 1.28399 1.28399; 0.68278 -0.68278;
0 -2.45619; -7.17523 0; -11.13293 -11.13293; -2.15106 2.15106];
X = d(:,1)';
Y = d(:,2)';
clf
plot(X,Y,'x')
hold on
opt = gaoptimset('InitialPopulation',[8 2 50*pi/180 -5.5 -4.5],'Generations',10000,'Display','iter');
c = ga(@curve,5,[],[],[],[],[5 1.5 pi/5 -6.5 -5],[9 5 pi/3 -4 -3],[],opt)%,[8 2 50*pi/180 -5.5 -4.5],[X;Y],X*0)
a = c(1);
b = c(2);
Q = c(3);
T=linspace(0,2*pi,100);
x1=a*cos(T);
y1=b*sin(T);
x=x1*cos(Q)-y1*sin(Q)+c(4);
y=x1*sin(Q)+y1*cos(Q)+c(5);
plot(x,y,'r--')
c(3) = c(3) * 180/pi;
text(-11,2.5,sprintf('a = %.3g, b = %.3g\n\\theta = %.3g\nx_0 = %.3g, y_0 = %.3g',c))
function f = curve(c)
a = c(1);
b = c(2);
Q = c(3);
t=linspace(0,2*pi,500);
x1=a*cos(t);
y1=b*sin(t);
x=x1*cos(Q)-y1*sin(Q) + c(4);
y=x1*sin(Q)+y1*cos(Q) + c(5);
f = X*0;
for i=1:length(f)
f(i) = min( sqrt((X(i)-x).^2 + (Y(i)-x).^2 ) );
end
f = sum(f);
end
end