Matlab使用隐式函数拟合3D数据点

时间:2015-07-03 14:02:54

标签: matlab 3d curve-fitting minimization

我正在尝试使用圆柱体的隐式函数(5个参数:a,b,c,d,r)拟合3D数据点(> 1000):

 -r + sqrt((x-(x+a*(-b+y)+c*(-d+z))/(1+a^2+c^2))^2+(-b+y-(a*(x+a*(-b+y)+c*(-d+z)))/(1+a^2+c^2))^2+(-d+z-(c*(x+a*(-b+y)+c*(-d+z)))/(1+a^2+c^2))^2) == 0

我找不到用Matlab实现它的好方法(我的知识在Matlab语法中非常浅薄)。使用显式函数肯定会容易得多。我在网上看了很多,但我没有找到任何具体的答案。

如果您知道直接拟合参数方程的方法,我还使用相同参数的圆柱参数函数?

x = v-(c*r*cos(u))/(sqrt(1+c^2))-(a*r*sin(u))/((1+c^2)*sqrt(1+(a^2)/(1+c^2)));
y = b+a*v+(r*sin(u))/(sqrt(1+(a^2)/(1+c^2)));
z = d+c*v+(r*cos(u))/(sqrt(1+c^2))-(a*c*r*sin(u))/((1+c^2)*sqrt(1+(a^2)/(1+c^2)));

提前多多感谢。

1 个答案:

答案 0 :(得分:0)

您可以将cftool与上面指定的圆柱形式的用户定义功能一起使用。来自文档,

  

cftool(x,y,z)创建适合x和y输入和z输出的曲面。 x,y和z必须是数字,具有两个或更多元素,并且具有兼容的大小。如果x,y和z都具有相同数量的元素或x和y是向量,z是2D矩阵,长度(x)= n,长度(y)= m,其中[m,n],大小是兼容的= size(z)。如有必要,cftool会打开Curve Fitting应用程序。

如果您只是键入cftool,它将打开一个交互式会话,您可以尝试一些拟合(假设您有工具箱)...

编辑:在这种情况下,您可以使用fsolve。将柱面函数保存到一个名为cylinder的单独文件中,其中代码类似于:

function F = cylinder(P, X)

    a = P(1);
    b = P(2);
    c = P(3);
    d = P(4);
    r = P(5);
    x = X(1,:);
    y = X(2,:);
    z = X(3,:);

    % f(x,y,z) - r = 0
    F = sqrt(  (   x-(  (x+a*(-b+y)+c*(-d+z)))/(1+a^2+c^2)).^2 ...
              +(-b+y-(a*(x+a*(-b+y)+c*(-d+z)))/(1+a^2+c^2)).^2 ...
              +(-d+z-(c*(x+a*(-b+y)+c*(-d+z)))/(1+a^2+c^2)).^2 ) -r;

end

我假设你在这里有正确形式的圆柱体。您可以在表格(3,N)中使用N个数据点X来调用此内容,

startparams = [0,0,0,0,1]
coeff=fsolve('cylinder',startparams,[],X)