Алгоритм Левенберга-Марквардта для трехмерных данных - PullRequest
1 голос
/ 17 февраля 2020

У меня есть облако точек в 3D, координаты которого хранятся в трехмерном векторе, и я хотел бы подогнать нелинейную функцию к облаку точек.

Знаете ли вы, работает ли алгоритм lsqcurvefit, реализованный в MATLAB, и для трехмерных данных?

Есть ли у вас примеры данных, которые используют 'levenberg-marquardt' для 3D-данных с использованием MATLAB?

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');

1 Ответ

0 голосов
/ 19 февраля 2020

Да, вы все еще можете использовать lsqcurvefit в 3D, но если вы хотите максимально упростить ваш код (см. Редактирование), я предлагаю функцию lsqnonlin для многомерного нелинейного подбора данных. На странице связанной документации приведено несколько примеров, в одном из которых используется алгоритм Левенберга-Марквардта в 2D. В 3D или выше использование аналогично.

Например, предположим, у вас есть облако точек в 3D, координаты которого хранятся в массивах x, y и z. Предположим, вы ищете подходящую поверхность (больше не кривую, потому что вы находитесь в 3D) в форме z = exp(r1*x + r2*y), где r1 и r2 - коэффициенты, которые нужно найти. Вы начинаете с определения следующей встроенной функции

fun = @(r) exp(r(1)*x + r(2)*y) - z;

, где r - это неизвестный массив 1x2, записи которого будут вашими неизвестными коэффициентами (r1 и r2). Мы готовы решить проблему:

r0 = [1,1]; % Initial guess for r
options = optimoptions(@lsqnonlin, 'Algorithm', 'levenberg-marquardt');
lsqnonlin(fun, r0, [], [], options)

Вы получите вывод в командном окне.

Протестировано на MATLAB 2018a.

Надеюсь, что поможет.

РЕДАКТИРОВАТЬ: lsqcurvefit против lsqnonlin

lsqcurvefit в основном особый случай из lsqnonlin. Обсуждение того, что лучше с точки зрения скорости и точности, является широким и выходит за рамки этого поста. Есть две причины, по которым я предложил lsqnonlin:

  • Вы можете принимать x, y, z в качестве матриц вместо векторов столбцов, просто убедитесь, что размеры матч. Фактически, если вы используете lsqcurvefit, ваш fun должен иметь дополнительный аргумент xdata, определенный как [x, y], где x и y принимаются в виде столбца.
  • Вы свободны выбрать неявную функцию подгонки fun в форме f(x,y,z)=0.
...