Я использую fsolve
, чтобы минимизировать функцию энергии в MATLAB. Алгоритм, который я использую, подгоняет сетку к зашумленным данным решетки с учетом расстояний сетки от каждой точки данных.
Целевая функция сформулирована с квадратами погрешностей, чтобы учесть алгоритм Гаусса-Ньютона для использования. Однако программа возвращается к Левенбергу-Марквардту:
Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems;
using Levenberg-Marquardt algorithm instead.
Я понял, что это, вероятно, связано с тем, что, хотя затраты имеют квадратичные ошибки, в целевой (стоимостной) функции есть этап, который выбирает ближайший центр сетки к каждой точке данных, что делает алгоритм неквадратичным.
Что я хотел бы сделать, так это выполнить это обновление назначения ближайших центров сетки отдельно для оценки якобиана функции стоимости. Я считаю, что это позволит использовать Гаусса-Ньютона и значительно улучшит скорость алгоритма.
В настоящее время я считаю, что происходит что-то вроде этого:
while i < options.MaxIter && threshold has not been met
Compute Jacobian of cost function (which includes assignment routine)
Move down the slope in the direction of highest gradient
end
Что я хотел бы вместо этого:
while i < options.MaxIter && threshold has not been met
Perform assignment routine
Compute Jacobian of cost function (which is now square, as no assignment occurs)
Move down the slope
end
Есть ли способ вставить подобную функцию в итерации, не разбирая весь алгоритм fsolve
? Даже если я отредактирую fsolve вручную, позволит ли природа алгоритма Гаусса-Ньютона добавить этот дополнительный шаг?
Спасибо