matlab拟合椭圆曲线

数据如下:(0.50151,0);(0,1.26586);(1.28399,1.28399);(0.68278,-0.68278);(0,-2.45619);(-7.17... 数据如下:(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)
拟合要得出椭圆方程
要绘出图形
得出误差系数
展开
tianxiawulang
推荐于2016-09-10 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2461万
展开全部

基本思路

椭圆的拟合比较复杂,考虑一般情形,涉及到的参数应包括长半轴、短半轴、倾角、中心坐标等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

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式