Минимизация функции, возвращающей массив, используя "fminunc"
Я использую MATLAB для создания кода, который выполняет автоматическую настройку трех коэффициентов усиления ПИД-регулятора. Я думаю об этом, чтобы минимизировать ошибку (разницу между желаемым и полученным состоянием) моей системы, для этого я кодировал функцию, которая принимает усиление ПИД в качестве входных параметров и возвращает вычисленную ошибку, а именно:
errors_vector = closedLoopSimulation(pidGains)
Так как у меня есть три заданные точки (команды ввода), то размерность вывода errors_vector
равно 3*N, где N - количество временных выборок, которые у меня есть (1000 в моем случае). Так что это функция, которую я хочу минимизировать, и для этого я попытался использовать fminunc
команда, а именно:
pidGains_ini = [2.4 0.1 0.4];
func = @closedLoopSimulation;
[pid, fval] = fminunc(func, pidGains_ini)
Однако, когда я запускаю последний кусок кода, я получаю эту ошибку:
User supplied objective function must return a scalar value.
что явно связано с тем, что это errors_vector
это массив 3*1000, а не скаляр.
Мои вопросы были бы, с точки зрения программирования, есть ли способ, которым я могу сделать fminunc
минимизировать функции, которые возвращают массивы?
С другой стороны, и с точки зрения теории управления, есть ли другой способ, которым я могу автоматически оптимизировать усиление ПИД-регулятора?
Надеюсь, я достаточно ясно дал понять.
Спасибо
1 ответ
Минимизация вектора не очень хорошо определена (есть то, что называется многоцелевой или многокритериальной оптимизацией, но это несколько специализировано). "Нормальные" методы оптимизации могут только минимизировать (или максимизировать) скалярные цели. Я подозреваю, что в вашем случае вы могли бы сформировать такую цель, взяв сумму квадратов ошибок и минимизировав ее. Чтобы быть завершенным: это стандартная процедура работы и часто называется "наименьших квадратов".