用matlab做椭圆拟合方程

  • 格式:docx
  • 大小:13.29 KB
  • 文档页数:3

具体不做说明,留着以后查找方便。
clear
clc
load ('S.txt');
r=S(:,1);
t=S(:,2);
x=r.*cos(t*pi/180);%转换成直角坐标
y=r.*sin(t*pi/180);%转换成直角坐标
XY=[x,y];
save X44.txt XY -ascii%保存转换后的直角坐标
%%%%%%%%%%%%%%%%曲线方程拟合%%%%%%%%%%%%%%%%%
F=@(p,XY)p(1)*XY(:,1).^2+p(2)*XY(:,1).*XY(:,2)+p(3)*XY(:,2).^2+p(4)*XY(:,1)+p(5)*XY(:,2)+p(6);%椭圆一般方程
p0=[1 1 1 1 1 1];
%%%%%%拟合系数,最小二乘法%%%%%%%
p=nlinfit(XY, zeros(size(XY,1),1), F, p0);
%调整画图输出样式及大小
s=4800/127;%转换像素
figure('position',[200 200 16*s 16*s]);%确定绘图尺寸
axes('linewidth',3, 'box', 'on', 'FontSize',11,'FontName','Times New Roman');
plot(XY(:,1), XY(:,2), 'ro'); hold on;
xmin=min(XY(:, 1)); xmax=max(XY(:, 1));
ymin=min(XY(:, 2)); ymax=max(XY(:, 2));
ezplot(@(x,y)F(p,[x,y]), [-1+xmin,1+xmax,-1+ymin,1+ymax]);
title('隧道断面曲线拟合'); legend('监测点', '拟合曲线');
grid on
p=p./p(6);
xc=(p(2)*p(5)-2*p(3)*p(4))/(4*p(1)*p(4)-p(2)^2);%求椭圆中心坐标
yc=(p(2)*p(4)-2*p(1)*p(5))/(4*p(1)*p(4)-p(2)^2);%求椭圆中心坐标
angle=(1/2)*atan(p(2)*(p(1)-p(3)))%求椭圆倾斜角度
a=sqrt(2*(p(1)*xc^2+p(3)*yc^2+p(2)*xc*yc-1)/(p(1)+p(3)+((p(1)-p(3))^2+p(2)^2)^(1/2)))%求椭圆长轴
b=sqrt(2*(p(1)*xc^2+p(3)*yc^2+p(2)*xc*yc-1)/(p(1)+p(3)-((p(1)-p(3))^2+p(2)^2)^(1/2)))%求椭圆短轴
u=(a-b)/a%计算椭圆扁率
%%%%%%%%%将扁率小数换算成千分数%%%%%%%%%
m=size(u);B=[];
B=u*1000;
for i=1:m
B=[num2str(B(i)),'‰'];
B=[B 13];%13为回车键的ASCII码
end
%%%%%%%%%%%%%%%绘图加注%%%%%%%%%%%%%%%%
hold on
plot(xc,yc,'ro')
text(3.0,-2.8,['扁率
=',num2str(B)],'verticalAlignment','bottom','HorizontalAlignment','right','FontSize',12,'FontName','Times New Roman')

%%%%%%%%%%%%为图中每个点加注坐标%%%%%%%%%%%%
for j=1:length(x)
str=strcat('(',num2str(x(j)),',',num2str(y(j)),')');
text(x(j),y(j),str,'FontSize',10,'FontName','Times New Roman');
end