我正在尝试使用圆柱体的隐式函数(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)));
提前多多感谢。
答案 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)