Matlab соответствует 3D-точкам данных с неявной функцией

Я пытаюсь сопоставить 3D-точки данных (> 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)));

Заранее большое спасибо.


person B.jour    schedule 03.07.2015    source источник


Ответы (1)


Вы можете использовать cftool с определяемой пользователем функцией формы цилиндра, указанной выше. Из документов,

cftool( x, y, z ) создает поверхность, соответствующую входным значениям x и y и выходным значениям z. x, y и z должны быть числовыми, состоять из двух или более элементов и иметь совместимые размеры. Размеры совместимы, если x, y и z имеют одинаковое количество элементов или x и y являются векторами, z является двумерной матрицей, length(x) = n и length(y) = m, где [m,n] = размер (г). cftool открывает приложение Curve Fitting, если это необходимо.

Если вы просто наберете cftool, откроется интерактивный сеанс, где вы сможете попробовать некоторые варианты (при условии, что у вас есть набор инструментов)...

EDIT: в этом случае вы можете использовать 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)
person Ed Smith    schedule 03.07.2015
comment
к сожалению, насколько я играл с cftool, нет способа определить неявную функцию. вам нужно определить пользовательскую явную функцию в форме: z = f(x,y) То, что я пытаюсь сделать, это соответствовать функции формы: f(x,y,z) = 0 - person B.jour; 03.07.2015
comment
Эй, Эд, большое спасибо за помощь. к сожалению, последнее решение не работает ни потому, что fsolve не видит X как координату, которую он должен использовать в функции, если хорошо понимает, что делает этот скрипт. Я получаю сообщение об ошибке «Недостаточно входных аргументов». Я пытался обойти это, но он все еще не работает... Хотя я чувствую, что это очень близко к окончательному решению. - person B.jour; 22.07.2015