Да, вы все еще можете использовать 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
.