【问题标题】:3D curvefitting3D曲线拟合
【发布时间】:2013-09-04 07:27:44
【问题描述】:

我有 a,b 点的离散规则网格及其对应的 c 值,我进一步对其进行插值以获得平滑曲线。现在根据插值数据,我还想创建一个用于曲线拟合的多项式方程。如何在多项式中拟合 3D 图?

我尝试在 MATLAB 中执行此操作。我在 MATLAB (r2010a) 中使用曲面拟合工具箱对 3 维数据进行曲线拟合。但是,如何在 MATLAB/MAPLE 或任何其他软件中找到最适合一组数据的公式。有什么建议吗?同样最有用的是一些真实的代码示例,PDF文件,网络等。

这只是我数据的一小部分。

a = [ 0.001 .. 0.011];

b = [1, .. 10];

c = [ -.304860225, .. .379710865]; 

提前致谢。

【问题讨论】:

    标签: matlab curve-fitting maple mplot3d


    【解决方案1】:

    要将曲线拟合到一组点上,我们可以使用ordinary least-squares 回归。 MathWorks 有一个 solution page 描述了这个过程。

    作为一个例子,让我们从一些随机数据开始:

    % some 3d points
    data = mvnrnd([0 0 0], [1 -0.5 0.8; -0.5 1.1 0; 0.8 0 1], 50);
    

    正如@BasSwinckels 所示,通过构造所需的design matrix,您可以使用mldividepinvsolve the overdetermined system,表示为Ax=b

    % best-fit plane
    C = [data(:,1) data(:,2) ones(size(data,1),1)] \ data(:,3);    % coefficients
    
    % evaluate it on a regular grid covering the domain of the data
    [xx,yy] = meshgrid(-3:.5:3, -3:.5:3);
    zz = C(1)*xx + C(2)*yy + C(3);
    
    % or expressed using matrix/vector product
    %zz = reshape([xx(:) yy(:) ones(numel(xx),1)] * C, size(xx));
    

    接下来我们将结果可视化:

    % plot points and surface
    figure('Renderer','opengl')
    line(data(:,1), data(:,2), data(:,3), 'LineStyle','none', ...
        'Marker','.', 'MarkerSize',25, 'Color','r')
    surface(xx, yy, zz, ...
        'FaceColor','interp', 'EdgeColor','b', 'FaceAlpha',0.2)
    grid on; axis tight equal;
    view(9,9);
    xlabel x; ylabel y; zlabel z;
    colormap(cool(64))
    


    如前所述,我们可以通过将更多项添加到自变量矩阵(Ax=b 中的A)来获得高阶多项式拟合。

    假设我们要拟合具有常数项、线性项、交互项和平方项(1、x、y、xy、x^2、y^2)的二次模型。我们可以手动完成:

    % best-fit quadratic curve
    C = [ones(50,1) data(:,1:2) prod(data(:,1:2),2) data(:,1:2).^2] \ data(:,3);
    zz = [ones(numel(xx),1) xx(:) yy(:) xx(:).*yy(:) xx(:).^2 yy(:).^2] * C;
    zz = reshape(zz, size(xx));
    

    Statistics Toolbox 中还有一个辅助函数 x2fx,可帮助构建几个模型订单的设计矩阵:

    C = x2fx(data(:,1:2), 'quadratic') \ data(:,3);
    zz = x2fx([xx(:) yy(:)], 'quadratic') * C;
    zz = reshape(zz, size(xx));
    

    最后,John D'Errico 在 File Exchange 上提供了一个出色的函数 polyfitn,它允许您指定所涉及的各种多项式顺序和项:

    model = polyfitn(data(:,1:2), data(:,3), 2);
    zz = polyvaln(model, [xx(:) yy(:)]);
    zz = reshape(zz, size(xx));
    

    【讨论】:

    • 如何在 python 中执行相同类型的操作..!?位帮助将不胜感激... @Amro
    • @diffracteD:我将代码翻译成 Python:gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6
    • 感谢您的帮助...我一定会尝试的...!
    • (询问您的 github 代码)使用高阶多项式拟合来评估表面是否合乎逻辑?
    • @diffracteD:是的,你可以,虽然你应该是cautious 的拟合模型太高的订单..
    【解决方案2】:

    文件交换上可能有一些更好的功能,但手动完成的一种方法是:

    x = a(:); %make column vectors
    y = b(:);
    z = c(:);
    
    %first order fit
    M = [ones(size(x)), x, y];
    k1 = M\z; 
    %least square solution of z = M * k1, so z = k1(1) + k1(2) * x + k1(3) * y
    

    同样,您可以进行二次拟合:

    %second order fit
    M = [ones(size(x)), x, y, x.^2, x.*y, y.^2];
    k2 = M\z;
    

    对于您提供的有限数据集,这似乎存在数值问题。输入help mldivide了解更多详情。

    要在一些常规网格上进行插值,您可以这样做:

    ngrid = 20;
    [A,B] = meshgrid(linspace(min(a), max(a), ngrid), ...
                     linspace(min(b), max(b), ngrid));
    M = [ones(numel(A),1), A(:), B(:), A(:).^2, A(:).*B(:), B(:).^2];
    C2_fit = reshape(M * k2, size(A)); % = k2(1) + k2(2)*A + k2(3)*B + k2(4)*A.^2 + ...
    
    %plot to compare fit with original data
    surfl(A,B,C2_fit);shading flat;colormap gray
    hold on
    plot3(a,b,c, '.r')
    

    可以使用下面的 TryHard 给出的公式进行三阶拟合,但是当阶数增加时,公式很快就会变得乏味。最好写一个函数来构造M给定xyorder,如果你必须不止一次这样做的话。

    【讨论】:

    • +1 -- 三阶匹配 M = [ones(size(x)), x, y, x.^2, x.*y, y.^2, x.^3, x.^2.*y, x.*y.^2, y.^3] 做得很好......
    • 抱歉回复晚了!感谢您回复 Bas Swinckels 并努力尝试。很好的解决方案。但是,有没有什么方法可以通过代码或使用 MATLAB 中的任何工具找到最适合的公式/方程?如何找到最适合给定数据集的公式?
    • 我也收到了这个警告。警告:等级不足,等级 = 5,tol = 9.9961e-013。你能帮我理解这意味着什么吗?谢谢。
    • 谷歌搜索任何 polyfit、2D、3D、fit、matlab 等的组合,会找到很多答案,这就是我总是为我不知道的问题做的事情。当然,您会在file-exchange 上找到一些食谱。但是你必须自己做,我们不是来做你所有的(家庭)工作......
    • 您说您只提供了一小部分数据,尝试适应整个数据集,看看是否有任何变化。您提供的数据只有 a 的 2 个不同值(0.001 和 0.0011),所以试图用二阶多项式拟合它是不明确的......
    【解决方案3】:

    这听起来更像是一个哲学问题,而不是具体的实现,特别是比特 - “如何找到最适合一组数据的公式?”根据我的经验,这是一个选择,你必须根据你想要达到的目标做出选择。

    对您而言,“最佳”的定义是什么?对于数据拟合问题,您可以继续添加越来越多的多项式系数并获得更好的 R^2 值......但最终会“过度拟合”数据。高阶多项式的一个缺点是超出了您用来拟合响应面的样本数据范围的行为 - 它可能会迅速朝某个疯狂的方向发展,这可能不适合您尝试建模的任何内容.

    您是否深入了解您要适配的系统/数据的物理行为?这可以用作用于创建数学模型的方程组的基础。我的建议是使用最经济(简单)的模型。

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2021-03-02
      • 1970-01-01
      • 2016-04-26
      • 2014-11-26
      • 2021-01-19
      相关资源
      最近更新 更多