Запускать функцию между каждой итерацией fsolve в MATLAB - PullRequest
2 голосов
/ 05 апреля 2011

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

Спасибо

1 Ответ

1 голос
/ 05 апреля 2011

Поскольку вы работаете с квадратом ошибок, в любом случае вы можете использовать LSQNONLIN вместо fsovle.Это позволяет вам вычислить якобиан (а также все необходимые приготовления) в вашей целевой функции.Затем якобиан возвращается как второй выходной аргумент.

...