Matlab подходит для трехмерных точек данных с неявной функцией
Я пытаюсь согласовать трехмерные точки данных (>1000) с неявной функцией цилиндра (5 параметров: a,b,c,d,r):
-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 ответ
Ты можешь использовать cftool
с помощью пользовательской функции определения формы цилиндра, которую вы указали выше. Из документов,
cftool (x, y, z) создает подгонку поверхности к входам x и y и выводу z. x, y и z должны быть числовыми, иметь два или более элементов и иметь совместимые размеры. Размеры совместимы, если x, y и z имеют одинаковое количество элементов или x и y являются векторами, z является 2D-матрицей, длина (x) = n и длина (y) = m, где [m,n] = размер (z) При необходимости cftool открывает приложение Curve Fitting.
Если вы просто наберете cftool, он откроет интерактивный сеанс, в котором вы можете попробовать некоторые подгонки (при условии, что у вас есть набор инструментов)...
РЕДАКТИРОВАТЬ: Вы можете использовать fsolve
в этом случае. Сохраните функцию цилиндра в отдельный файл с именем цилиндр, где код выглядит примерно так:
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),
startparams = [0,0,0,0,1]
coeff=fsolve('cylinder',startparams,[],X)