matlab练习程序(椭球拟合)(代码片段)

tiandsp tiandsp     2022-12-07     473

关键词:

这次我们来拟合一个椭球,之前也拟合过空间的椭圆,不过当时只用了五个点,方程组应该是欠定的,看看就好。

要拟合椭球,首先设定椭球一般方程:

技术图片

根据这个方程和已有的空间椭球点数据,利用最小二乘就能得到上面九个参数。

不过有时候我们想要的不是这样的一般方程,而是椭球的球心和三个半长轴。

下面就来说明如何根据椭球一般方程求取球心和半长轴。

首先把上述方程写成矩阵形式:

技术图片

其中xc,yc,zc为球心。

对上式进行展开,得到:

技术图片

上式和第一个式子相比,求对应一次项相等时的结果。

可以用Mathematica来求:

A = x - xc, y - yc, z - zc;
B = a, 1/2*d, 1/2*e, 1/2*d, b, 1/2*f, 1/2*e, 1/2*f, c;
Factor[Dot[A, B, Transpose[A]]]
a x^2 - 2 a x xc + a xc^2 + d x y - d xc y + b y^2 - d x yc + 
  d xc yc - 2 b y yc + b yc^2 + e x z - e xc z + f y z - f yc z + 
  c z^2 - e x zc + e xc zc - f y zc + f yc zc - 2 c z zc + c zc^2
CoefficientList[Factor[Dot[A, B, Transpose[A]]], x, y, z]
a xc^2 + d xc yc + b yc^2 + e xc zc + f yc zc + c zc^2, -e xc - 
     f yc - 2 c zc, c, -d xc - 2 b yc - f zc, f, 0, b, 0, 
    0, -2 a xc - d yc - e zc, e, 0, d, 0, 0, 0, 0, 0, a, 
    0, 0, 0, 0, 0, 0, 0, 0

得到下面这样的方程组:

技术图片

即可求出Xc,Yc,Zc。

半长轴的计算可以参考这里:https://www.zhihu.com/question/47033644/answer/112864757

椭球拟合代码如下:

clear all;
close all;
clc;

xc = 1.21;
yc = 2.32;
zc = 4.32;

xr = 2.78;
yr = 5.76;
zr = 1.51;

[x,y,z] = ellipsoid(xc,yc,zc,xr,yr,zr,20);

plot3(x(:),y(:),z(:),.);

x=x(:);
y=y(:);
z=z(:);

X = [x.*x y.*y z.*z x.*y x.*z y.*z x y z];
Y = ones(length(x),1);

C = inv(X*X)*X*Y;

M=[C(1) C(4)/2 C(5)/2;
    C(4)/2 C(2) C(6)/2;
    C(5)/2 C(6)/2 C(3)];

Cent = -0.5*[C(7) C(8) C(9)]*inv(M)

S = Cent*M*Cent+1;
[U,V]=eig(M);

[~,indx] = max(abs(U(1,:)));
[~,indy] = max(abs(U(2,:)));
[~,indz] = max(abs(U(3,:)));

R = [sqrt(S/V(indx,indx)) sqrt(S/V(indy,indy)) sqrt(S/V(indz,indz))]

结果和预设的值是一致的:

技术图片

参考:https://blog.csdn.net/shenshikexmu/article/details/70143455

matlab练习程序(修正指数曲线拟合)(代码片段)

对于一般的指数曲线如:y=a*e^(k*t),可以先对两边求对数得到:log(y)=log(a)+k*t这样的曲线,然后用最小二乘来计算系数。但是对于修正指数曲线如:y=k+a*b^t这样的函数,没法直接求对数然后用最小二乘,因为有一个常数项k,这里... 查看详情

椭球曲面拟合算法实现,matlab/c++(代码片段)

...404182515/article/details/59480954,这里直接复制下博文里的matlab代码:%%生成随机椭球球面数据clearall;closeallclc;A=300;%x方向上的轴半径B=400;%y方向上的轴半径C=500;%z方向上的轴半径x0=-120;%椭球球心x坐标y0=-67;%椭球球... 查看详情

matlab练习程序(曲面拟合)(代码片段)

这里用到的还是最小二乘方法,和上一次这篇文章原理差不多。就是首先构造最小二乘函数,然后对每一个系数计算偏导,构造矩阵乘法形式,最后解方程组。比如有一个二次曲面:z=ax^2+by^2+cxy+dx+ey+f首先构造最小二乘函数,然... 查看详情

matlab&mathematica对三维空间上的点进行椭圆拟合(代码片段)

问题是这样:比如有一个地心惯性系的轨道,然后从轨道上取了几个点,问能不能根据这几个点把轨道还原了?当然,如果知道轨道这几个点的速度的情况下,根据轨道六根数也是能计算轨道的,不过真近点角是随时间变动的。... 查看详情

matlab练习程序(数据主方向)(代码片段)

...一步运算,把原始数据旋转到主轴对应的坐标系上即可。matlab代码如下:clearall;closeall;clc;mu=[00];sigma=[11.3;1.33];data=mvnrnd(mu,sigma,1000);me=mean(data);sigma=(data-me)‘*(data-me)/(lengt 查看详情

matlab练习程序(贝塞尔曲线)(代码片段)

下面三个公式分别是一次、二次和三次贝塞尔曲线公式:通用的贝塞尔曲线公式如下:可以看出,系数是由一个杨辉三角组成的。这里的一次或者二次三次由控制点个数来决定,次数等于控制点个数-1。实现的效果如下:代码如... 查看详情

matlab练习程序(渲染三原色)(代码片段)

这里我用的空间是x向右为正,y向下为正,z向屏幕里面为正。相当于标准右手系绕x轴旋转了180度。将三个点光源放在r=[0.3,0,0.5];g=[0.3,-0.5*cos(pi/6),-0.5*sin(pi/6)];b=[0.3,0.5*cos(pi/6),-0.5*sin(pi/6)];这三个位置上,向四周发射光线,取光线到... 查看详情

matlab练习程序(数据主方向)(代码片段)

...一步运算,把原始数据旋转到主轴对应的坐标系上即可。matlab代码如下:clearall;closeall;clc;mu=[00];sigma=[11.3;1.33];data=mvnrnd(mu,sigma,1000);me=mean(data);sigma=(data-me)‘*(data-me)/(length(data)-1);plot(data(:,1),data(:,2),‘.‘);holdon;[u,s,v]=svd(sigma);plot([0u(... 查看详情

matlab练习程序(神经网络识别mnist手写数据集)(代码片段)

记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对。这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码。mnist数据集训练数据一共有28*28*60000个像素,标签有60000个。测试数据一共有28*2... 查看详情

matlab练习程序(神经网络识别mnist手写数据集)(代码片段)

记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对。这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码。mnist数据集训练数据一共有28*28*60000个像素,标签有60000个。测试数据一共有28*2... 查看详情

matlab练习程序(三种方法解最小二乘)(代码片段)

解最小二乘的方法有很多,这里给出常见的三种方法实现。一是一般方法,之前博客一般都用这种方法。二是svd分解法,之前有用过svd(见这里,这里,这里和这里)解其他问题,但是没用来解过最小二乘。三是qr分解法,这个好... 查看详情

matlab,python,pytorch实现数据拟合(代码片段)

目录1、MATLAB实现数据拟合2、纯python实现数据拟合3、pytorch实现数据拟合1、MATLAB实现数据拟合%MATLAB数据拟合x=linspace(-1,1,100);rng('default')%使用整数种子初始化生成器,替换老版本命令rand('state',s);y=3*x.^2+2+... 查看详情

matlab练习程序(常微分方程向量场)(代码片段)

...就代表了x在t处的斜率,所以:vt=cos(atan(f));vx=sin(atan(f));matlab代码如下:clearall;closeall;clc;t=-5:0.3:5;x=-5:0.3:5;f=@(t,x)sin(t).*cos(x)+sin(t);[t,x]=meshgrid(t,x);vt=cos(atan(f(t,x)));vx=sin(atan(f(t,x)));quiver(t,x,vt,vx);holdon[t,x]=ode45(f,[-55],[3;-2;-4]);plot(t,x,‘r... 查看详情

matlab拟合(代码片段)

实验目的  (1)掌握曲线拟合的相应算法;  (2)将拟合与插值法进行比较。实验要求  实验步骤要有模型建立,模型求解、结果分析。实验内容  (1)用给定的多项式,如y=x3-6x2+5x-3,产生一组数据(xi,yi,i=1,2,…... 查看详情

matlab中的一维插值与函数拟合(代码片段)

本文主要记录Matlab中常用的一维插值与函数拟合的使用方法文章目录前言一、一维插值二、函数拟合2.1多项式拟合2.1.1多项式拟合指令2.1.2图形窗口的多项式拟合2.2指定函数拟合参考资料前言最近在学习数学建模,这部分关于... 查看详情

matlab中的一维插值与函数拟合(代码片段)

本文主要记录Matlab中常用的一维插值与函数拟合的使用方法文章目录前言一、一维插值二、函数拟合2.1多项式拟合2.1.1多项式拟合指令2.1.2图形窗口的多项式拟合2.2指定函数拟合参考资料前言最近在学习数学建模,这部分关于... 查看详情

matlab点云处理(十八):直线拟合(最小二乘|ransac)(代码片段)

...合2.1RANSAC直线拟合函数2.2代码实现1最小二乘直线拟合在MATLAB点云处理(十七):最小二乘多项式曲线拟合已经作出讲解。2RANSAC直线拟合在MATLAB点云处理(十六):多项式曲线拟合(RANSAC|MSAC)一文... 查看详情

matlab练习一(代码片段)

matlab初级练习本专栏是matlab的一些基础练习,因为我也在学习阶段,所以难免会有一些错误,欢迎各位大佬纠正。实验内容与要求给定两个excel文件,一个是“matlab课学生名单.xlsx”,一个是“需要剔除学生名单.xlsx”,请... 查看详情