Matlab 三维曲线拟合

Matlab 三维曲线拟合,matlab,curve-fitting,maple,mplot3d,Matlab,Curve Fitting,Maple,Mplot3d,我有一个由a,b点和它们对应的c值组成的离散规则网格,我进一步插值它以得到一条平滑的曲线。现在,根据插值数据,我想进一步创建一个多项式方程,用于曲线拟合。如何用多项式拟合三维绘图 我尝试在MATLAB中实现这一点。我使用MATLAB中的曲面拟合工具箱(r2010a)对三维数据进行曲线拟合。但是,如何在MATLAB/MAPLE或任何其他软件中找到适合一组数据的公式,使其发挥最大优势呢。有什么建议吗?另外,最有用的是一些可查看的真实代码示例,如PDF文件、web等 这只是我数据的一小部分 a = [

我有一个由
a,b
点和它们对应的
c
值组成的离散规则网格,我进一步插值它以得到一条平滑的曲线。现在,根据插值数据,我想进一步创建一个多项式方程,用于曲线拟合。如何用多项式拟合三维绘图

我尝试在MATLAB中实现这一点。我使用MATLAB中的曲面拟合工具箱(r2010a)对三维数据进行曲线拟合。但是,如何在MATLAB/MAPLE或任何其他软件中找到适合一组数据的公式,使其发挥最大优势呢。有什么建议吗?另外,最有用的是一些可查看的真实代码示例,如PDF文件、web等

这只是我数据的一小部分

a = [ 0.001 .. 0.011];

b = [1, .. 10];

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

提前感谢。

文件交换上可能有一些更好的功能,但手工操作的一种方法是:

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给出的公式可以进行三阶拟合,但随着阶数的增加,公式很快变得单调乏味。最好编写一个函数,该函数可以构造给定的
x
y
order
,如果您必须多次这样做的话。

这听起来更像是一个哲学问题,而不是具体的实现,特别是对bit来说——“如何找到一个公式,使一组数据发挥最大的优势?”根据我的经验,这是一个取决于你努力实现的目标的选择

什么定义“最适合”你?对于数据拟合问题,您可以不断添加越来越多的多项式系数,并生成更好的R^2值。。。但最终会“过度拟合”数据。高阶多项式的一个缺点是其行为超出了用于拟合响应曲面的样本数据的范围-它可能会很快向某个疯狂的方向发展,这可能不适合您尝试建模的任何对象


您是否了解所安装系统/数据的物理行为?这可以作为创建数学模型所使用的方程组的基础。我的建议是使用最经济(简单)的模型。要将曲线拟合到一组点上,我们可以使用回归。有一个由MathWorks描述的过程

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

% some 3d points
data = mvnrnd([0 0 0], [1 -0.5 0.8; -0.5 1.1 0; 0.8 0 1], 50);
如图所示,通过构造所需的,您可以使用或表示为
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));
统计工具箱中还有一个帮助函数,可帮助构建两个模型订单的设计矩阵:

C = x2fx(data(:,1:2), 'quadratic') \ data(:,3);
zz = x2fx([xx(:) yy(:)], 'quadratic') * C;
zz = reshape(zz, size(xx));
最后,John D'Errico在文件交换中提供了一个出色的功能,允许您指定各种多项式顺序和相关术语:

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

+1--三阶拟合的
M=[一个(尺寸(x)),x,y,x.^2,x.*y,y.^2,x.^3,x.^2.*y,x.*y.^2,y.^3]
做得很好…很抱歉反应太晚了!谢谢你回复巴斯·斯温克尔斯并努力。很好的解决方案。但是,是否有任何方法可以通过代码或使用MATLAB中的任何工具找到最佳拟合公式/方程?如何找到最适合上述给定数据集的公式?我也得到了这个警告。警告:等级不足,等级=5,tol=9.9961e-013。你能帮我理解这是什么意思吗?谢谢。谷歌搜索polyfit、2D、3D、fit、matlab等的任何组合,都会找到很多答案,这就是我对不知道的问题所做的。当然,你会在网上找到一些食谱。但是你必须自己做,我们不是来做你所有的(家庭)工作的……你说你只提供了一小部分数据,试着适应整个数据集,看看这是否会改变什么。您提供的数据对于
a
(0.001和0.0011)只有两个不同的值,因此尝试用二阶多项式拟合该值是不明确的…我如何在python中执行相同类型的操作。。!?我很感激你的帮助@Amro@diffracteD:我将代码翻译成Python:谢谢你的帮助。。。我一定要试试!(询问您的github代码)使用高阶多项式拟合来评估曲面是否合乎逻辑?@diffracteD:是的,您可以,尽管您应该使用阶数过高的拟合模型。。