3D曲线拟合

Sye*_*eda 15 matlab curve-fitting maple mplot3d

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

我试着在MATLAB中这样做.我在MATLAB(r2010a)中使用了Surface拟合工具箱来曲线拟合三维数据.但是,如何在MATLAB/MAPLE或任何其他软件中找到适合一组数据的公式以获得最佳效果.有什么建议?最有用的还有一些真实的代码示例,可以在Web上查看PDF文件等.

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

a = [ 0.001 .. 0.011];

b = [1, .. 10];

c = [ -.304860225, .. .379710865]; 
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Amr*_*mro 17

为了将曲线拟合到一组点上,我们可以使用普通的最小二乘回归.MathWorks 有一个解决方案页面描述了该过程.

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

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

作为@BasSwinckels表明,通过构建所需的设计矩阵,可以使用mldividepinv解决超定表示为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));
Run Code Online (Sandbox Code Playgroud)

接下来我们可视化结果:

% 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))
Run Code Online (Sandbox Code Playgroud)

1st_order_polynomial


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

假设我们想要使用常数,线性,相互作用和平方项(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));
Run Code Online (Sandbox Code Playgroud)

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

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

最后polyfitn,John D'Errico在文件交换上有一个很好的功能,它允许您指定所涉及的各种多项式顺序和术语:

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

2nd_order_polynomial

  • @diffracteD:我把代码翻译成了Python:https://gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6 (3认同)