精华内容
下载资源
问答
  • 将图像中的星点进行二维高斯拟合,并输出结果和对比图像。
  • 然后程序尝试使用 MatLab 函数“lsqcurvefit”拟合数据,以找到二维高斯的位置、方向和宽度。 不输入参数执行“mainD2GaussFitRot.m”。 二维高斯函数由函数“D2GaussFunctionRot.m”和“D2GaussFunction.m”定义
  • 利用matlab拟合离散点对应的次曲面。 其中,次曲面公式为z = x^2 + y^2 + xy + x + y
  • MATLAB实现二维离散点的最小二乘法拟合。 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与...
  • matlab开发-二维曲面拟合程序。二维曲面拟合程序
  • “nlinfit”的主要问题是它只能处理一数组 (x, y) 的拟合,其中 x 是自变量,y 是从属变量。 程序 fit2 使用另一个程序“fitfit”,其中可以定义用户拟合函数。 这个用户定义的函数在 fitfit 的第 6 行中定义为 ...
  • RBF神经网络对二维数据点的曲线拟合。智能计算方面的,简单小程序
  • 首先申明本人是土木专业的因为有需要要用到 matlab 中的拟合用途今天好好学习 一些关于 matlab 多变量拟合的东西从网上下载了一些程序也运行了一下就举一些 实例附上源程序吧主要是两个自变量和三个自变量一个因变量...
  • 二维曲线拟合

    千次阅读 2018-11-20 16:49:03
    二维曲线拟合相关基础理论知识最小二乘法广义逆(伪逆矩阵)矩阵分解特征值分解(Eigen Value Decomposition,EVD)Householder变换法(QR Factorization,QR分解)奇异值分解(singular value decomposition,SVD)...

    一.相关基础理论知识

    最近在学习这方面的知识,本文为网上资料的总结和自己的一些代码验证。
    我们根据平面上的一些离散点绘制出一条近似曲线。如果曲线通过所有点,称为插值;如果曲线不一定通过点,而是以某种方式逼近这些点,称为拟合。
    构造拟合曲线,通常有以下几种方法:
    (1)最小二乘法;
    (2)分段拟合法;
    (3)…

    1. 最小二乘法

    根据解的存在情况,线性方程可以分为:

    1. 有唯一解的恰定方程组
    2. 解不存在的超定方程组
      (Ax=b,A为n×m矩阵,如果A列满秩,且n>m,方程组没有精确解,常用于数据拟合);
    3. 有无穷多解的欠定方程组
      (Ax=b,A为n×m矩阵,如果A行满秩,且n<m);

    在MATLAB中求解超定方程,有以下几种方法:

    1. 左除是建立在奇异值分解基础之上得到最小二乘法的解,因此最可靠;
    x=A\b;
    
    1. 最小二乘法求解;
    x=lsqnonneg(A,b);
    
    1. 广义逆,解不一定满足Ax=b,x只是最小二乘意义上的解;
    x=pinv(A);
    

    2. 广义逆(伪逆矩阵)

    广义逆法(伪逆矩阵)是建立在对原超定方程直接进行 householder变换的基础上,其算法可靠性稍逊与(SVD)奇异值求解,但速度较快;以B=pinv(A)为例,函数返回矩阵A的伪逆矩阵。如果矩阵A是可逆(非奇异)的,那么pinv(A)与inv(A)的结果是一样的,而且pinv比inv效率低。但如果矩阵A是非方阵或奇异矩阵,则inv(A)不存在,但pinv(A)仍然存在,并表现出一些与逆矩阵类似的性质。

    【定义】
    令A是任意m x n矩阵,若G满足下述条件(Moore-penrose条件),称矩阵G是A的广义逆矩阵:
    (1)GAG = G;
    (2)AGA = A;
    (3)AG为hermitian矩阵,即(AG)^H=AG;
    (4)GA为hermitian矩阵,即(GA)^H=GA;

    【测试】
    在Matlab中,用以下几种方式求逆:
    (1)直接求解:InvA = inv(A’*A)*A’; %求导,令导数为0,结果如下: InvA=(ATA)-1AT
    (2)SVD分解:[U,Λ,V]=svd(A)
    (3)QR分解:[Q,R]=qr(A)
    (4)LU分解:[L,U]=lu(A)

     a=[1 2 3; 4 5 6; 23 3 6];
     b=inv(a);
     c=pinv(a);
     [U,D,V]=svd(a);
     D1=[1/24.8393,0,0;0,1/6.9174,0;0,0,1/0.4016];
     U1=U';
     d =V*D1*U1;
     e=inv(a'*a)*a';
    

    结果:
    在这里插入图片描述

    3.矩阵分解

    由上面例子可知,我们可以通过矩阵分解来求逆矩阵,接下来介绍几种矩阵分解的方式:

    1. 特征值分解(Eigen Value Decomposition,EVD)
      特征值分解,是指将矩阵分解为由特征值和特征向量表示的矩阵之积的方法。由(λ I - A)v=0(λ 为N 阶方阵A的特征值,v为特征值 λ 对应的特征向量)求解特征值和特征向量:
      (1)特征值:det | λ I - A | = 0(特征多项式),可以得到:
      在这里插入图片描述
      这样,我们便可以得到矩阵A的l种不同的特征值,每种特征值有ni个重复,共有N个特征值。
      (2)特征向量:对于单根特征值,(λi I - A)vi =0,即可求得该特征值对应的特征向量;对于有重根的特征值,可用以下公式依次迭代求解:
      在这里插入图片描述
      这样,特征分解将矩阵分解为如下形式:A=QΛQ-1;若无重根,Λ=diag(λ1,λ2,…,λn),若有重根,Λ为Jordan标准型。这里的Q是以特征向量为列向量的N x N矩阵。

    2. Householder变换法(QR Factorization,QR分解)
      这是目前求一般矩阵全部特征值的最有效并广泛应用的方法,精度高于伪逆法。一般矩阵先经过正交相似变化成为Heisenberg矩阵,然后再应用QR方法求特征值和特征向量。
      A=QR (其中:A为m x n的矩阵,n>=m,Q为m×m的正交矩阵,R为m×n的上三角矩阵),我们称其为A的QR分解。

    3. 奇异值分解(singular value decomposition,SVD)
      对于矩阵A ϵ Fm x n,A=UΛVT,其中,U ϵ Fm x m酉矩阵,被称为左奇异向量;Λ ϵ Fm x n的半正定对角矩阵,Λ 对角线上的元素 λi为原矩阵A的奇异值;V T ϵ F n×n 是V 的共轭转置,被称为右奇异向量,这样的分解称为奇异值分解。

    二. Matlab样条工具箱(Curve Fitting Toolbox)与曲线拟合

    样条函数可分为4类:cs* 三次样条系数为t^n 的pp* 分段多项式样条系数为基函数B_n^i(t)的sp* B样条rp* 有理B样条。样条操作包括:函数操作(求值,算术运算,求导求积分等)、节点操作(节点重数的调节,设定,修改等)。

    1. 导入数据,打开工具箱选择合适的模型拟合
      代码:
    x0=data(1,:);
    y0=data(2,:);
    cftool;
    

    结果:
    在这里插入图片描述
    2. 样条工具箱函数
    (1). 三次样条函数
    csapi 插值生成三次样条函数
    csape 生成给定约束条件下的三次样条函数
    csaps 平滑生成三次样条函数
    cscvn 生成一条内插参数的三次样条曲线
    getcurve 动态生成三次样条曲线

    (2). 分段多项式样条函数
    ppmak 生成分段多项式样条函数
    ppual 计算在给定点处的分段多项式样条函数值

    (3). B样条函数
    spmak 生成B样条函数
    spcrv 生成均匀划分的B样条函数
    spapi 插值生成B样条函数
    spap2 用最小二乘法拟合生成B样条函数
    spaps 对生成的B样条曲线进行光滑处理
    spcol 生成B样条函数的配置矩阵

    (4). 有理样条函数
    rpmak 生成有理样条函数
    rsmak 生成有理样条函数

    (5). 样条操作函数
    fnval 计算在给定点处的样条函数值
    fmbrk 返回样条函数的某一部分(如断点或系数等)
    fncmb 对样条函数进行算术运算
    fn2fm 把一种形式的样条函数转化成另一种形式的样条函数
    fnder 求样条函数的微分(即求导数)
    fndir 求样条函数的方向导数
    fnint 求样条函数的积分
    fnjmp 在间断点处求函数值
    fnplt 画样条曲线图
    fnrfn 在样条曲线中插入断点。
    fntlr 生成tarylor系数或taylor多项式

    (6). 样条曲线端点和节点处理函数
    augknt 在已知节点数组中添加一个或多个节点
    aveknt 求出节点数组元素的平均值
    brk2knt 增加节点数组中节点的重次
    knt2brk 从节点数组中求得节点及其重次
    knt2mlt 从节点数组中求得节点及其重次
    sorted 求出节点数组的元素在另一节点数组中属于第几个分量
    aptknt 求出用于生成样条曲线的节点数组
    newknt 对分段多项式样条函数进行重分布
    optknt 求出用于内插的最优节点数组
    chbpnt 求出用于生成样条曲线的合适节点数组

    三 . 样条线拟合

    1. spline函数(piecewise polynomial function)

    特点:
    设样条函数为S;导入数据点为:knots(结)(k组数据,则有k个结,k-1段,k-1个多项式函数);相邻两个knots之间分段定义多项式函数Si(i=0,1,……,k-1),则S=S1+ S2+……+Sk-1;

    >>x0=data(1,:);
    >>y0=data(2,:);
    >>x1=1:0.1:7;%设置插值的自变量
    >>n=spline(x0,y0);%返回函数的结构体信息
    >>y1=spline(x0,y0,x1);%返回插值计算的函数值
    >>plot(x0,y0,'ro');
    >>plot(x1,y1,'r-');
    >>num=4;
    >>x=0:0.1:7;
    %最大值所在方程函数
    >>y=f2.coefs(num,1).*(x-num).^3+f2.coefs(num,2).*(x-num).^2+f2.coefs(num,3).*(x-num)+f2.coefs(num,4); >>x_solve=x(find(y==max(y)));
    

    结果:

    n = 
        form: 'pp'  %样条函数类型
        breaks: [1 2 3 4 5 6 7] %分段区间节点矩阵
        coefs: [6x4 double] %各分段区间上的插值多项式系数矩阵
        pieces: 6 %分段数
        order: 4 %项式阶数
        dim: 1 %矩阵维度
    x_solve =
        4.3000
    

    在这里插入图片描述

    2. polyfit(x,y,N)函数

    特点:对数据x,y拟合N阶多项式

    >>x0=data(1,:);
    >>y0=data(2,:);
    >>x1=1:0.1:n;
    >>f1=polyfit(x0,y0,2); %polynomial fitting
    >>y2=polyval(f1,x1); %Calculate dependent variable
    >>plot(x1,y2,'g-');
    

    结果:
    在这里插入图片描述

    3. 二次B样条曲线

    特点:已知三个平面离散点就可以定义二次抛物线段,多于3个离散点,则采用二次B样条曲线分段拟合。
    设有n+1个离散点,记为Pi(i=0,1,…,n)
    在这里插入图片描述
    在这里插入图片描述
    矩阵形式为:
    在这里插入图片描述

    4. 三次B样条曲线

    矩阵形式为:
    在这里插入图片描述

    5. 二次Beier曲线

    矩阵形式为:
    在这里插入图片描述

    展开全文
  • MATLAB--条件插值、二维插值、拟合

    万次阅读 2018-10-15 18:00:41
    %% 样条边界条件插值 x=linspace(0,2*pi,15);...%[0,0,0]表示三个未知数,若上面有一项的系数已知则为两个未知数,exitflag为一则拟合成功 xx=linspace(0,2*pi,150); yy=fun(x,xx) plot(xx,yy)

    %% 样条边界条件插值
    x=linspace(0,2*pi,15);
    y=sin(x);
    plot(x,y,'o')
    hold on
    % complete
    p=csape(x,y,'complete',[2,2]);
    x1=linspace(0,2*pi,150);
    y1=ppval(p,x1);
    plot(x1,y1,'b','linewidth',1.5)
    % second
    p=csape(x,y,'second',[2,3]);
    x1=linspace(0,2*pi,150);
    y1=ppval(p,x1);
    plot(x1,y1,'b','linewidth',1.5)
    % periodic
    p=csape(x,y,'periodic',[2,2]);
    x1=linspace(0,2*pi,150);
    y1=ppval(p,x1);
    plot(x1,y1,'b','linewidth',1.5)
    % not-a-knot
    p=csape(x,y,'not-a-knot');
    x1=linspace(0,2*pi,150);
    y1=ppval(p,x1);
    plot(x1,y1,'b','linewidth',1.5)
    %variational
    p=csape(x,y,'variational');
    x1=linspace(0,2*pi,150);
    y1=ppval(p,x1);
    plot(x1,y1,'b','linewidth',1.5)

    %% interp2
    x=linspace(-5,5,5)
    y=linspace(-5,5,5)
    [X,Y]=meshgrid(x,y);
    Z=X.^2+Y.^2;
    x1=linspace(-5,5,100)
    y1=linspace(-5,5,100)
    [XX,YY]=meshgrid(x1,y1);
    % ZZ=interp2(X,Y,Z,XX,YY);
    % mesh(X,Y,Z,'linestyle',':')
    % hold on
    % mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')    下图一
    %默认的是线性插值
    %% nearest

    ZZ=interp2(X,Y,Z,XX,YY,'nearest');
    mesh(X,Y,Z,'linestyle',':')
    hold on
    mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')   下图二


    %% cubic
    ZZ=interp2(X,Y,Z,XX,YY,'cubic');
    mesh(X,Y,Z,'linestyle',':')
    hold on
    mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')      下图一
    %% spline
    ZZ=interp2(X,Y,Z,XX,YY,'spline');
    mesh(X,Y,Z,'linestyle',':')
    hold on
    mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')   下图二


    %% 
    x1=linspace(-6,6,100)
    y1=linspace(-6,6,100)
    [XX,YY]=meshgrid(x1,y1);
    ZZ=interp2(X,Y,Z,XX,YY,'spline');%可进行外推
    mesh(X,Y,Z,'linestyle',':')
    hold on
    mesh(XX,YY,ZZ,'linestyle','-','edgecolor','r')

    ZZ=mesh(Z,2);
    mesh(ZZ)

    %% griddata
    x=[1 5 2 3 4 8 2 0 4 -1 -6 -5 5];
    y=[2 3 5 4 7 5 -3 5 3 6 -6 5 -5];
    z=x.^2+y.^2;
    Z=gridddata(x,y,z,X,Y)%默认的是线性插值
    mesh(X,Y,Z)

    %nearest
    Z=griddata(x,y,z,X,Y,'nearest')%默认的是线性插值
    mesh(X,Y,Z)
    %cubic
    Z=griddata(x,y,z,X,Y,'cubic')%默认的是线性插值
    mesh(X,Y,Z)
    %v4
    Z=griddata(x,y,z,X,Y,'v4')%默认的是线性插值
    mesh(X,Y,Z)
    %natural
    Z=griddata(x,y,z,X,Y,'natural')%默认的是线性插值
    mesh(X,Y,Z)

    %% polyfit polyval
    x=linspace(0,2*pi,10);
    y=sin(x);
    p=polyfit(x,y,8)
    poly2str(p,'x')
    x1=linspace(0,2*pi,100);
    y1=polyval(p,x1)
    plot(x,y,'o',x1,y1)

    x=linspace(1000,2000,10);
    y=1e5*[0.02 0.04 0.05 0.055 0.5 0.6 0.9 1.52 2.3 3.6];
    plot(x,y,'o')
    hold on
    x1=linspace(1000,2000,100);
    [P,~,mu]=polyfit(x,y,5)%x比较大进行缩放
    y1=polyval(P,x1,[],mu)
    plot(x1,y1)

    %%最小二乘拟合 lsqcurvefit
    xdata=linspace(0,2*pi,15);
    y=5*sin(xdata)+2*xdata+xdata.^2;
    y=y+2*rand(1,15)
    plot(xdata,y,'o')
    hold on

    % fun=@(x,xdata) x(1)*sin(xdata)+x(2)*xdata+x(3)*xdata.^2;
    % x=lsqcurvefit(fun,[0,0,0],xdata,y);%[0,0,0]表示三个未知数,若上面有一项的系数已知则为两个未知数
    % xx=linspace(0,2*pi,150);
    % yy=fun(x,xx)
    % plot(xx,yy)
    % lb=[-1 -1 -1];%系数的下限
    % ub=[6 3 2];%系数的上限
    % fun=@(x,xdata) x(1)*sin(xdata)+x(2)*xdata+x(3)*xdata.^2;
    % x=lsqcurvefit(fun,[0,0,0],xdata,y,lb,ub);%[0,0,0]表示三个未知数,若上面有一项的系数已知则为两个未知数
    % xx=linspace(0,2*pi,150);
    % yy=fun(x,xx)
    % plot(xx,yy)

    % options=optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
    % options=optimoptions('lsqcurvefit','Display','off');
    fun=@(x,xdata) x(1)*sin(xdata)+x(2)*xdata+x(3)*xdata.^2;
    [x,~,~,exitflag]=lsqcurvefit(fun,[0,0,0],xdata,y);%[0,0,0]表示三个未知数,若上面有一项的系数已知则为两个未知数,exitflag为一则拟合成功
    xx=linspace(0,2*pi,150);
    yy=fun(x,xx)
    plot(xx,yy)

    展开全文
  • 智能计算方面的基础性matlab代码,做成了GUI程序。RBF网络实现对离散二维点的曲线拟合,可以交互式输入离散二维点。
  • Gaussianfit2D_拟合星点_matlab二维高斯拟合_高斯拟合_二维高斯拟合
  • [a, b, c, 适应度] = ORTHO2DLINEFIT(x, y) 此函数找到二维线的最佳拟合参数'ax+by+c=0' 方程,它返回总和的值n 个点到直线的距离的平方作为适应度分数。 - 输入: x ..................... 1xN 阵列- 点的 x 坐标y....
  • Gaussianfit2D_拟合星点_matlab二维高斯拟合_高斯拟合_二维高斯拟合_源码.zip
  • 使用 polyFit2D.m 将二维多项式拟合到数据并使用 polyVal2D.m 对其进行评估。 乐趣! 此处详细解释了这些功能: http://poquitopicante.blogspot.com/2013/03/horners-method-in-2d.html 它们也托管在 Github 上...
  • matlab曲线拟合

    热门讨论 2009-11-02 10:00:06
    曲线拟合 三维曲线(非线性)拟合步骤 二维曲线(非线性)拟合步骤
  • 05插值和拟合 1.一插值 (1) 机床加工零件,试用分段线性和三次样条两种插值方法计算。并求x=0处的曲线斜率和13<=x<=15范围内y的最小值。 x0=[0 3 5 7 9 11 12 13 14 15]; y0=[0 1.2 1.7 2 2.1 2.0 1.8...

    05插值和拟合

    1.一维插值

    (1) 机床加工零件,试用分段线性和三次样条两种插值方法计算。并求x=0处的曲线斜率和13<=x<=15范围内y的最小值。

    x0=[0 3 5 7 9 11 12 13 14 15];
    y0=[0 1.2 1.7 2 2.1 2.0 1.8 1.2 1.0 1.6];
    x=0:0.1:15;
    % interp1现有插值函数,要求x0单调,'method'有
    % nearest 最近项插值   linear 线性插值
    % spline 立方样条插值  cubic 立方插值
    y1=interp1(x0,y0,x); 
    
    y2=interp1(x0,y0,x,'spline');
    
    pp1=csape(x0,y0);
    y3=fnval(pp1,x);
    
    pp2=csape(x0,y0,'second');
    y4=fnval(pp2,x);
    
    [x',y1',y2',y3',y4']
    
    subplot(1,4,1)
    plot(x0,y0,'+',x,y1)
    title('Piecewise linear 分段线性')
    
    subplot(1,4,2)
    plot(x0,y0,'+',x,y2)
    title('spline1')
    
    subplot(1,4,3)
    plot(x0,y0,'+',x,y3)
    title('spline2')
    
    subplot(1,4,4)
    plot(x0,y0,'+',x,y4)
    title('second')
    
    dx=diff(x);
    dy=diff(y3);
    dy_dx=dy./dx;
    dy_dx0=dy_dx(1);
    ytemp=y3(131:151);
    ymin=min(ytemp);
    index=find(y3==ymin);
    xmin=x(index);
    [xmin,ymin]
    

     

    (2)  已知速度的四个观测值,用三次样条求位移S=0.15到0.18上的vd(t)积分

    t   0.15    0.16     0.17    0.18
    vt   3.5    1.5       2.5       2.8

    format compact;
    % 已知速度的四个观测值,用三次样条求位移S=0.15到0.18上的vd(t)积分
    % t   0.15  0.16  0.17  0.18
    % vt  3.5   1.5    2.5   2.8
    clc,clear
    x0=0.15:0.01:0.18;
    y0=[3.5 1.5 2.5 2.8];
    % csape 三次样条插值,返回要求插值的的函数值
    pp=csape(x0,y0) % 默认的边界条件,Lagrange边界条件
    format long g
    xishu = pp.coefs % 显示每个区间上三次多项式的系数
    s=quadl(@(t)ppval(pp,t),0.15,0.18) % 求积分
    format % 恢复短小数的显示格式
    
    % 画图
    t=0.15:0.001:0.18;
    y=fnval(pp,t);
    plot(x0,y0,'+',t,y)
    

    pp = 
      包含以下字段的 struct:
    
          form: 'pp'
        breaks: [0.1500 0.1600 0.1700 0.1800]
         coefs: [3×4 double]
        pieces: 3
         order: 4
           dim: 1
    xishu =
      1 至 2-616666.666666667                     33500
             -616666.666666667                     15000
             -616666.666666668         -3499.99999999999
      3 至 4-473.333333333334                       3.5
              11.6666666666671                       1.5
              126.666666666667                       2.5
    s =
                      0.068625

     

    2.二维插值

    (1) 丘陵测量高度。试插值一曲面,确定合适的模型,并由此找出最高的和该点的最高程。

    format compact;
    % 丘陵,在x,y方向上每隔100m测个点
    clear,clc
    x=100:100:500;
    y=100:100:400;
    z=[636 697 624 478 450
        698 712 630 478 420
        680 674 598 412 400
        662 626 552 334 310];
    
    pp=csape({x,y},z') % 三次样条,返回函数
    xi=100:10:500;
    yi=100:10:400;
    cz=fnval(pp,{xi,yi}); % 得到插值后的z
    
    [i,j]=find(cz==max(max(cz))) % 找最高点的地址
    xm=xi(i),ym=yi(i),zmax=cz(i,j) % 求最高点的坐标
    
    % 画图
    [X,Y]=meshgrid(yi,xi);%构造1×1网格,20×20个
    [X0,Y0]=meshgrid(y,x);%构造1×1网格,20×20个 
    plot3(X0,Y0,z,'p', 'MarkerEdgeColor','k','MarkerSize',15 ,'MarkerFaceColor',[.49 1 .63])
    hold on
    % mesh(X,Y,cz)
    surf(X,Y,cz)
    pp = 
      包含以下字段的 struct:
    
          form: 'pp'
        breaks: {[100 200 300 400 500]  [100 200 300 400]}
         coefs: [1×16×12 double]
        pieces: [4 3]
         order: [4 4]
           dim: 1
    i =
         8
    j =
         9
    xm =
       170
    ym =
       170
    zmax =
      720.6252

     

    (2) 海底水深

    format compact;
    % 二维海底水深数据
    clc,clear;
    x=[129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5];
    y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5];
    z=-[4,8,6,8,6,8,8,9,9,8,8,9,4,9]
    xmm=minmax(x); % 求x的最大值和最小值
    ymm=minmax(y); % 求y的最大值和最小值
    xi=xmm(1):xmm(2);
    yi=ymm(1):ymm(2);
    zi1=griddata(x,y,z,xi,yi','cubic'); % 立方插值
    zi2=griddata(x,y,z,xi,yi','nearest'); % 最近点插值
    zi=zi1 %立方插值和最近点插值的混合插值的初始值
    zi(isnan(zi1)) = zi2(isnan(zi1)); % 把立方插值中的不确定值缓存最近点插值的结果
    subplot(1,2,1),plot(x,y,'*');
    subplot(1,2,2),mesh(xi,yi,zi);

     

     

    3.拟合

    (1) 最小二乘拟合

    x=[19     25    31     38    44]';
    y=[19.0   32.3   49.0   73.3   97.8]';
    r=[ones(5,1),x.^2]
    ab=r\y
    x0=19:0.1:44;
    y0=ab(1)+ab(2)*x0.^2;
    plot(x,y,'o',x0,y0,'r')
    %   y = 0.9726 +   0.0500*x^2
      
    

     

    (2) 多项式拟合

    x0=[1990  1991  1992  1993  1994  1995  1996];
    y0=[70   122   144   152   174   196   202];
    plot(x0,y0,'*')
    a=polyfit(x0,y0,1)
    y97=polyval(a,1997) % 拟合的多项式在1997处的值
    y98=polyval(a,1998)

     

    (3) 最小二乘优化lsqlin函数

    x=[19     25    31     38    44]';
    y=[19.0   32.3   49.0   73.3   97.8]';
    r=[ones(5,1),x.^2];
    ab=lsqlin(r,y)
    x0=19:0.1:44;
    y0=ab(1)+ab(2)*x0.^2;
    plot(x,y,'o',x0,y0,'r')
    

     

     (4) 最小二乘优化lsqcurvefit函数,拟合函数中的参数

    fun1.m

    function f=fun1(canshu,xdata);
    f= exp(-canshu(1)*xdata(:,1)).*sin(canshu(2)*xdata(:,2))+xdata(:,3).^2;  %其中canshu(1)=k1,canshu(2)=k2,注意函数中自变量的形式
    

    data1.txt

    1	15.02	23.73	5.49	1.21	14	15.94	23.52	5.18	1.98
    2	12.62	22.34	4.32	1.35	15	14.33	21.86	4.86	1.59
    3	14.86	28.84	5.04	1.92	16	15.11	28.95	5.18	1.37
    4	13.98	27.67	4.72	1.49	17	13.81	24.53	4.88	1.39
    5	15.91	20.83	5.35	1.56	18	15.58	27.65	5.02	1.66
    6	12.47	22.27	4.27	1.50	19	15.85	27.29	5.55	1.70
    7	15.80	27.57	5.25	1.85	20	15.28	29.07	5.26	1.82
    8	14.32	28.01	4.62	1.51	21	16.40	32.47	5.18	1.75
    9	13.76	24.79	4.42	1.46	22	15.02	29.65	5.08	1.70
    10	15.18	28.96	5.30	1.66	23	15.73	22.11	4.90	1.81
    11	14.20	25.77	4.87	1.64	24	14.75	22.43	4.65	1.82
    12	17.07	23.17	5.80	1.90	25	14.35	20.04	5.08	1.53
    13	15.40	28.57	5.22	1.66					

    主函数

    % 拟合函数y=e^(-k1*x1)*sin(k2*x2)+x3*3中的参数k1,k2
    clc, clear
    a=textread('data1.txt');
    y0=a(:,[2,7]); %提出因变量y的数据
    y0=nonzeros(y0); %去掉最后的零元素,且变成列向量
    x0=[a(:,[3:5]);a([1:end-1],[8:10])]; %由分块矩阵构造因变量数据的2列矩阵
    canshu0=rand(2,1); %拟合参数的初始值是任意取的
    %非线性拟合的答案是不唯一的,下面给出拟合参数的上下界,
    lb=zeros(2,1); %这里是随意给的拟合参数的下界,无下界时,默认值是空矩阵[]
    ub=[20;2]; %这里是随意给的上界,无上界时,默认值是空矩阵[]
    canshu=lsqcurvefit(@fun1,canshu0,x0,y0,lb,ub)  
    
    Local minimum possible.
    
    lsqcurvefit stopped because the final change in the sum of squares relative to 
    its initial value is less than the default value of the function tolerance.
    
    <stopping criteria details>
    
    
    canshu =
    
        0.0000
        1.5483

     

    展开全文
  • 二维坐标拟合圆半径及圆心坐标,不少于三个坐标点。点越多拟合越好。。。。。。。。。。。。。。。。。。。。。。。。。
  • 二维平面内,已知共点的多条线基本可以通过解析几何的方法将点求出。但是在计算机中,由于浮点数等计算误差,导致多条线中相交的点不在同一位置。另外,在现实情况中,测距、测坐标等传感器所带来的误差,将多条线...

    在二维平面内,已知共点的多条线基本可以通过解析几何的方法将点求出。但是在计算机中,由于浮点数等计算误差,导致多条线中相交的点不在同一位置。另外,在现实情况中,测距、测坐标等传感器所带来的误差,将多条线本应共点的位置出现偏差,给数据融合带来麻烦。此篇通过利用matlab中拟合及优化的方法,来将本应共点的多条线优化出来。若有不对及可以改进的地方,请大家多多指正。


    欧几里得空间中二维平面两直线交点

    首先,利用高中知识,我们来定义:

    欧几里得空间中,二维平面笛卡尔点坐标x=(x_p,y_p)^{T};线的斜截式方程:l_i:y=k_ix+b_i

    在求线交点时,最少应该有两条线存在,也就是i\geq 2。所以我们求交点时就可以联立方程组:

    \left\{\begin{matrix} y=k_1x+b1\\ y=k_2x+b2 \end{matrix}\right. \Rightarrow x=(-\frac{b_2-b_1}{k_2-k_1},-\frac{b_2k_1-b_1k_2}{k_2-k_1}) 

    然而,这个结果对于计算机来说,看起来不太优雅。所以我们就利用大学代数几何知识建立方程:

    Ax=b\Rightarrow x=A^{-1}b

    \begin{bmatrix} -k_1 &1 \\ -k_2&1 \end{bmatrix}\binom{x_p}{y_p}=\binom{b_1}{b_2}\Rightarrow \binom{x_p}{y_p}=\begin{bmatrix} -k_1 &1 \\ -k_2&1 \end{bmatrix}^{-1}\binom{b_1}{b_2}

    计算出结果是一样的。

    此时,对于以上方程组的解,也就是两线交点,分成了三种情况:1. 无解;2. 唯一解;3. 以及无数解。

    从而对应着两条线的三种情况:1. 两直线平行;2. 两直线相交;3. 和两直线重合。

    反映在斜截式方程里就是:1. k_1=k_2, b_1\neq b_2;2.  k_1\neq k_2, b_1\neq b_2;3. k_1=k_2, b_1= b_2

    最后反映在矩阵中就是:1. 增广矩阵的秩大于系数矩阵的秩r(\begin{bmatrix} A |b \end{bmatrix})>r(A);2.增广矩阵的秩等于系数矩阵的秩,且满秩r(\begin{bmatrix} A |b \end{bmatrix})=r(A)=n,n为系数矩阵A的行数;3. 增广矩阵的秩等于系数矩阵的秩,但不满秩r(\begin{bmatrix} A |b \end{bmatrix})=r(A)<n

    也可以说,当\begin{vmatrix} A \end{vmatrix}\neq0时,两直线有交点;当\begin{vmatrix} A \end{vmatrix}=0时,没有交点,或是两直线重合。此条件可以判断两直线是否有交点。

    我们用matlab画出这三种情况:

    1. 两平行直线\left\{\begin{matrix} y=-x+1\\ y=-x+2 \end{matrix}\right.;2. 两相交直线\left\{\begin{matrix} y=3x-2\\ y=-2x+3 \end{matrix}\right.,交点坐标x=(1,1)^{T};3. 两重合直线\left\{\begin{matrix} y=-x+1\\ y=-x+1 \end{matrix}\right.

    在欧式二维空间中,平行线不会有交点,则会有无解的情况出现,在运算中就还要多一步进行判断。下面我们利用在射影空间的齐次坐标来进行运算。


    欧几里得二维空间在射影空间中两直线的交点

    在射影空间中,我们饮用了齐次坐标:

    齐次点坐标x\equiv (x_1,x_2,x_3)

    线的一般式方程Ax+By+C=0,对应于齐次点坐标的线方程为l_1x_1+l_2x_2+l_3x_3=0,齐次线坐标为l\equiv [l_1,l_2,l_3]

    而我们此篇研究的是欧几里得二维空间,所以在我们在运算结束后,将齐次点坐标归一化,得到非齐次点坐标。

    利用射影空间,两条平行线的交点,也就是解不会作为无解来定义,可以被认为是无限远点,作为一个解来运算。这样方便了我们的判断和运算。

    在射影空间中,点在直线上被定义为l^{T}x=x^{T}l=0;通过两点直线被定义为l\equiv x_1\times x_2;两直线交点被定义为x\equiv l_1\times l_2

    还是以上三对直线,其各自齐次坐标为

    1. l _1\equiv [1,1,-1];l _2\equiv [1,1,-2],交点为x=(1,1,0)^{T},代表无穷远点。归一化为x_n=(\frac{1}{0},\frac{1}{0},1)^{T},代表在欧式二维平面上相交于无穷点,也就是平行;

    2. l _1\equiv [3,-1,-2];l _2\equiv [2,1,-3],交点为x=(5,5,5)^{T}。归一化为x_n=(1,1,1)^{T}

    3. l _1\equiv [1,1,-1];l _2\equiv [-1,-1,1],交点为x=(0,0,0)^{T},代表在射影空间中,两条射线相交于射影中心,从而说明它们是同一条直线。

    若从另一个角度分析,也可以将线的齐次坐标升维致至空间平面方程,通过平面之间的交点来求线的交点。

    射影空间中线的齐次坐标在欧氏空间中表示过空间原点面的法向量。此空间平面和归一化平面相交所构成的线,就是在欧氏空间二维平面的直线。所以两条二维平面直线相交,也可以认为是空间中两个平面同时相交于归一化平面。可列方程:

    \left\{\begin{matrix} l_1_1x+l_1_2y+l_1_3z=0\\ l_2_1x+l_2_2y+l_2_3z=0 \\ z=1 \end{matrix}\right.\Rightarrow \begin{bmatrix} l_1_1& l_1_2&l_1_3 \\ l_2_1& l_2_2 &l_2_3 \\ 0&0 &1 \end{bmatrix}\begin{bmatrix} x\\y \\ z \end{bmatrix}=\begin{bmatrix} 0\\0 \\ 1 \end{bmatrix}

    从上面的方程式看,和上一部分的方程式是一样的。


    由此可见在二维平面上求两直线交点可以用到欧氏几何解析法以及射影空间的解析法。然而对于计算机编程者来说,利用射影空间的齐次坐标来计算是一个好的选择。特别地,在后面部分,多线相交求交点时,齐次坐标求解交点将是很好的工具。

    展开全文
  • 插值曲面拟合,用于逆向重建技术,对于一维曲线的插值,一般用到的函数yi=interp1(X,Y,xi,method) 。当中method包含nearst,...对于二维曲面的拟合,有非常多方法能够实现。可是这里用的是Spline Toolbox里面的函数功能
  • Matlab离散点曲面拟合

    千次阅读 2020-03-26 15:10:26
    设有次曲面: 其中,(x, y, z)为已知三点坐标。 令: 解算系数矩阵A。 代码如下: function [aa,zfit] = Powerfit(data) X = data(:,1); Y = data(:,2); Z = data(:,3); clear data xfit2 = X.^2; ...
  • matlab RBF 神经网络拟合

    千次阅读 2020-08-17 15:42:49
    (1)newrb() ... 该函数可以用来设计一个近似径向基...其中P为Q组输入向量组成的R*Q位矩阵,T为Q组目标分类向量组成的S*Q矩阵。GOAL为均方误差目标(Mean Squard Error Goal),默认为0.0;SPREAD为径向基函数的扩展速度,
  • 空间平面拟合MATLAB

    万次阅读 2019-04-12 14:51:50
    Matlab 代码 % 随机生成一组(x,y,z),这些点的坐标离一个空间平面比较近 x0=1,L1=2; y0=1,L2=2; x=x0+rand(20,1)*L1; y=y0+rand(20,1)*L2; z=1+2*x+3*y; scatter3(x,y,z,'filled') hold on; X = [ones(length(x),1...
  • 二元拟合 matlab函数

    千次阅读 2018-10-14 18:55:08
    二元拟合自变量有2个,因变量一个,可以使用的有nlinfit和regress,线性时用regress,非线性时用nlinfit。由于是二元次模型,2个函数都可以用。 以regress为例, 假设因变量存在y向量中,自变量存在x1、x2向量...
  • 首先对于函数进行分析:该函数是一个比较强的非线性函数,所以不能用一般的最小二乘法来进行拟合,如过一定要用最小二乘法,则A必须是已知的,再利用最二乘法进行拟合,附程序2.
  • xtwodpolyfit 对表示为两个自变量 (x,y) 的函数的任意数据集合 (z) 执行二维多项式展开的加权线性最小二乘拟合。 据我所知,该函数与可从文件交换中获得的类似函数在两个方面有所不同: (1) 可以指定每个变量的最小...
  • matlab散乱点云数据拟合二次曲面,包括数据data.mat(以x,y,z坐标形式保存)、运行代码curfit.m、运行结果
  • 有时候实验或者仿真得到的数据是三数据点,但是想做出一个三的图像,那样更直观好看。
  • 最小二乘法高斯曲线拟合,基于最小二乘法拟合高斯曲线,(Least squares Gaussian curve fitting )

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,416
精华内容 2,966
关键字:

matlab二维拟合

matlab 订阅