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)
Другие вопросы по тегам