Минимизация функции, возвращающей массив, используя "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 ответ

Минимизация вектора не очень хорошо определена (есть то, что называется многоцелевой или многокритериальной оптимизацией, но это несколько специализировано). "Нормальные" методы оптимизации могут только минимизировать (или максимизировать) скалярные цели. Я подозреваю, что в вашем случае вы могли бы сформировать такую ​​цель, взяв сумму квадратов ошибок и минимизировав ее. Чтобы быть завершенным: это стандартная процедура работы и часто называется "наименьших квадратов".

Другие вопросы по тегам