gpt4 book ai didi

matlab - 3D曲线拟合

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:55 24 4
gpt4 key购买 nike

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

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

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

a = [ 0.001 .. 0.011];

b = [1, .. 10];

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

提前致谢。

最佳答案

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

例如,让我们从一些随机数据开始:

% 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))

1st_order_polynomial


如前所述,我们可以通过向自变量矩阵(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));

还有一个辅助函数x2fx在有助于为几个模型订单构 build 计矩阵的统计工具箱中:

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

终于有一个优秀的功能polyfitn在 John D'Errico 的 File Exchange 上,它允许您指定所有类型的多项式阶数和涉及的项:

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

2nd_order_polynomial

关于matlab - 3D曲线拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com