Я использую 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 вручную, позволит ли мне добавить алгоритм Гаусса-Ньютона в этот дополнительный шаг?
Спасибо