Matlab隐式拟合三维数据点

Matlab隐式拟合三维数据点,matlab,3d,curve-fitting,minimization,Matlab,3d,Curve Fitting,Minimization,我试图用圆柱体的隐式函数(5个参数:a、b、c、d、r)拟合3D数据点(>1000): 我找不到一个用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+

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

我找不到一个用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)));

非常感谢。

您可以将
cf工具
与上面指定的圆柱体形式的用户定义功能一起使用。从文件来看

cftool(x、y、z)创建与x、y输入和z输出的曲面拟合。x、 y和z必须是数字,具有两个或多个元素,并且具有兼容的大小。如果x、y和z都有相同数量的元素,或者x和y是向量,z是二维矩阵,长度(x)=n,长度(y)=m,其中[m,n]=大小(z),则大小是兼容的。cftool在必要时打开曲线拟合应用程序

如果您只需键入cftool,它将打开一个交互式会话,您可以在其中尝试一些fits(假设您有工具箱)

编辑:在这种情况下,可以使用
fsolve
。将cylinder函数保存到名为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
我假设你有正确的圆柱形状。你可以用
N
数据点,
X
的形式(3,N)调用它


不幸的是,就我使用cftool而言,没有办法定义隐式函数。您需要定义一个自定义的显式函数,其形式为:z=f(x,y)。我想做的是与形式为:f(x,y,z)=0的函数相匹配。嘿,Ed,非常感谢您的帮助。不幸的是,最后一个解决方案也不起作用,因为fsolve没有将X视为他应该在函数中使用的坐标,如果他很清楚这个脚本的作用的话。我得到“输入参数不足”错误。我试着绕过它,但它仍然不起作用。。。我觉得这已经接近最终解决方案了。。
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
startparams = [0,0,0,0,1]
coeff=fsolve('cylinder',startparams,[],X)