2016-05-12 7 views
0

Ich verwende MATLAB, um einen Code zu erstellen, der die drei PID-Controller-Verstärkungen automatisch abstimmt. Die Art, wie ich darüber nachdenke, besteht darin, den Fehler (die Differenz zwischen dem gewünschten Zustand und dem erhaltenen) meines Systems zu minimieren, dafür habe ich eine Funktion programmiert, die die PID-Verstärkungen als Eingangsparameter akzeptiert und den berechneten Fehler zurückgibt, nämlich:Minimieren einer Array-zurückkehrenden Funktion mit "fminunc"

errors_vector = closedLoopSimulation(pidGains) 

Da ich drei Sollwerte (Eingangsbefehle) haben, dann ist die Dimension des Ausgangs errors_vector 3 * N, wobei N die Anzahl der Zeitabtastwerte ist I (1000 in meinem Fall) aufweisen. So dass die Funktion, die ich minimieren will, ist, und so zu tun, versuchte ich mit fminunc Befehl, nämlich:

pidGains_ini = [2.4 0.1 0.4]; 
func   = @closedLoopSimulation; 
[pid, fval] = fminunc(func, pidGains_ini) 

Allerdings, wenn ich das letzte Stück Code ausführen, bekomme ich diesen Fehler:

User supplied objective function must return a scalar value. 

das ist eindeutig aufgrund der Tatsache, dass errors_vector ein 3 * 1000-Array und kein Skalar ist.

Meine Fragen wäre, aus der Sicht der Programmierung, gibt es eine Möglichkeit, dass ich fminunc Funktionen minimieren kann, die Arrays zurückgeben?

Auf der anderen Seite, und aus der Sicht der Steuerungstheorie gibt es eine andere Möglichkeit, die PID-Verstärkungen automatisch zu optimieren?

Ich hoffe, ich habe mich klar genug gemacht.

Dank

+0

Können Sie den errors_vector besser erklären? Es ist klar, dass es für jeden Zeitschritt einen Fehler gibt, aber warum gibt es zu jedem Zeitschritt drei? Steuern Sie drei Ausgänge gleichzeitig? – tvo

+1

Die [Ziegler-Nichols-Methode] (https://en.wikipedia.org/wiki/Ziegler-Nichols_method) und die [Relay-Methode] (http://www.controleng.com/search/search-single-display/ relay-method-automates-pid-loop-tuning/4a5774decc.html sind zwei beliebte PID-Tuning-Schemata. – horchler

+0

@tvo, ja das ist was ich mache. Mein System ist MIMO mit 3 Eingabebefehlen und 3 Steuerbefehlen, die vom PID-Regler ausgegeben werden. –

Antwort

1

ein Vektor-Minimierung ist nicht sehr gut definiert (es etwas multikriterielle oder Mehrkriterienoptimierung, aber das ist etwas spezialisierte genannt ist). "Normale" Optimierungsmethoden können nur skalare Ziele minimieren (oder maximieren). Ich vermute, dass Sie in Ihrem Fall ein solches Ziel bilden könnten, indem Sie die Summe der quadrierten Fehler nehmen und minimieren. Um zu vervollständigen: Dies ist Standard-Betriebsverfahren und wird oft als "kleinste Quadrate" bezeichnet.

+0

Was ist mit der Verwendung von 'lsqnonlin' in MATLAB? wird es nicht speziell für meinen Fall funktionieren, dass es mit Funktionen funktioniert, die Arrays zurückgeben. –

+1

Ja, es wird automatisch das Ziel (Summe der Quadrate) für Sie bilden. –