用matlab咋三维坐标系内拟合椭球公式知道三维坐标系内的一系列的点的坐标,也知道这些点的分布是一个椭球形,怎么用matlab把这个椭球形公式拟合出来?最好是有一段编号的程序,
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/15 01:25:16
用matlab咋三维坐标系内拟合椭球公式知道三维坐标系内的一系列的点的坐标,也知道这些点的分布是一个椭球形,怎么用matlab把这个椭球形公式拟合出来?最好是有一段编号的程序,
用matlab咋三维坐标系内拟合椭球公式
知道三维坐标系内的一系列的点的坐标,也知道这些点的分布是一个椭球形,怎么用matlab把这个椭球形公式拟合出来?最好是有一段编号的程序,
用matlab咋三维坐标系内拟合椭球公式知道三维坐标系内的一系列的点的坐标,也知道这些点的分布是一个椭球形,怎么用matlab把这个椭球形公式拟合出来?最好是有一段编号的程序,
function my_fit()
% 二维非线性拟合
% 直接将该代码复制到 m文件运行就可以了
% 请仔细看注释,注释写的很清楚
% step0:生成用于拟合的数据
%(以椭球为例,仅为测试,如果有现成数据,请替换此步中 x,y,z 值)
a = 3; %% 方程:x^2/a^2 + y^2/b^2 + z^2/c^2 = 1
b = 4; %% 从而,z = c*sqrt(1 - x^2/a^2 - y^2/b^2)
c = 5; %% 用上半球数据作为待拟合数据
x = -a:0.1:a; %% x,y取值范围
y = -b:0.1:b;
[X, Y] = meshgrid(x,y); %% 生成一个二维的取值范围
[M, N] = size(X);
x = reshape(X, M*N, 1); %% 把矩阵转化为向量
y = reshape(Y, M*N, 1);
p = ((1 - x.^2/a^2 - y.^2/b^2) >= 0); %% 将大于等于0的数值取出(只有这部分才有意义)
x = x(p); %% 生成的值均在上椭球面,如果有现成数据,请将 step0去掉
y = y(p); %% 并直接给 x,y,z赋值
z = c*sqrt(1 - x.^2/a^2 - y.^2/b^2);
% step1:开始拟合,k表示拟合系数,行向量
% 待拟合方程:F = z^2 = c^2 - c^2*x^2/a^2 - c^2*y^2/b^2
% x,y,z 均要先转化为列向量!
% 先把 z 值平方,再进行拟合,很重要!
% 令 c^2 = k(1),c^2/a^2 = k(2), c^2*y^2/b^2 = k(3)
% 求出 k 即得到椭球方程
xdata = [x,y]; %% 将 x,y 数据按列组合到 xdata
ydata = z.^2; %% 先把 z 值平方,再进行拟合
k0 = [1 1 1]; %% k 的运行初值,不会影响最终结果
F = @(k,xdata)k(1) - k(2)*xdata(:,1).^2 -k(3)*xdata(:,2).^2; %% 这句话是拟合函数
[k,resnorm]=lsqcurvefit(F,k0,xdata,ydata); %% 这句话是拟合关键!
% step2:椭圆参数求解
% 根据c^2 = k(1),c^2/a^2 = k(2), c^2*y^2/b^2 = k(3)
c = sqrt(k(1));
a = c/sqrt(k(2));
b = c/sqrt(k(3));
disp('a轴:');
disp(a);
disp('b轴:');
disp(b);
disp('c轴:');
disp(c);
end