2016-05-12 6 views
0

Я использую MATLAB для создания кода, который выполняет автоматическую настройку трех коэффициентов усиления ПИД-регулятора. То, как я думаю об этом, заключается в том, чтобы свести к минимуму ошибку (разницу между желаемым состоянием и полученной) моей системы, для этого я закодировал функцию, которая принимает значения ПИД-усиления в качестве входных параметров и возвращает вычисленную ошибку, а именно:Минимизация функции возврата массива с использованием «fminunc»

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 минимизировать функции, возвращающие массивы?

С другой стороны, и с точки зрения теории управления, существует ли другой способ, который я могу оптимизировать для усиления ПИД-регулятора автоматически?

Надеюсь, я сделал себе достаточно ясно.

Благодаря

+0

Не могли бы вы объяснить errors_vector лучше? Понятно, что за каждый шаг времени есть ошибка, но почему на каждом временном шаге есть три? Вы управляете тремя выходами одновременно? – tvo

+1

Метод [Ziegler-Nichols] (https://en.wikipedia.org/wiki/Ziegler-Nichols_method) и метод [Relay] (http://www.controleng.com/search/search-single-display/ relay-method-automates-pid-loop-tuning/4a5774decc.html) являются двумя популярными схемами настройки ПИД-регулятора. – horchler

+0

@tvo, да, это то, что я делаю. Моя система MIMO, имеющая 3 команды ввода и 3 усилия управления, выводимые с ПИД-регулятора. –

ответ

1

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

+0

Как насчет использования 'lsqnonlin' в MATLAB? не будет ли это работать для моего случая специально, что он работает с функциями, возвращающими массивы. –

+1

Да, это автоматически создаст цель (сумма квадратов). –