Verfasst am: 17.11.2009, 11:46
Titel: Optimierungsproblem mit LSQNONLIN
Hallo Forum,
ich bin gerade dabei die Parameter eines PID-Reglers eines PT6 Systems zu optimieren. Meine Matlab-Kenntnisse sind nahe Null, sodass ich hier in jedem Fall eine Gewaltaktion versuche, die aber vielleicht trotzdem lösbar ist.
Ebenfalls bin ich wenig bewandert in mathematischen Optimierungsalgorithmen. Schlechte Vorraussetzungen, aber vielleicht kann man an dem in Matlab mitgelieferten Beispiel ansetzen.
Habe mir das ganze einmal angeschaut und nen bisschen kommentiert...
Code:
% Erstelle Funktion mit den Ausgabeparametern: KP,KI,KD
>> function[KP,KI,KD] = runtracklsq
% Lade Simulink-Modell abgespeichert als Optsim
>> optsim
% Schreibe Vektor pid0 mit den Startwerten für KP,KI,KD
>> pid0= [0.630.05041.9688];
% definiere die Modellparameter a1 und a2
>> a1= 3; a2=43 %damit ergibt sich das Ü-Modell zu: 1.5/(50*s^3+43*s^2+3*s+1)
% definiere eine Optimierungs-Optionen-Stuktur mit der Matlab-Funktion optimset in der hiermit erstellten Variablen 'Options' % Optimset ist geeignet zum Seten von Optionen für die Funktionen: fminbnd, fminsearch, fzero, lsqnonlin % Largescal-Algorithmus = off; Zeige jeden Iterationsschritt an; Abbruch-Toleranzwert für die Funktionsargumente TolX = 0.001; Abbruch-Toleranzwert für die Funktionswerte % TolX und Tolfun sind ODER Argumente!
>> options = optimset('largeScale','off','Display','iter', 'TolX',0.001,'TolFun',0.001);
% In Vektor PID werden Ergebnisse der Funktion LSQNONLIN geschrieben % lsqnonlin wird mit den Parametern tracklsq als nach dem Primzip der minimalen Quadrate zu minimierende Funktion aufgerufen; % als Startwerte (x-Argumente) sind die in PID0 angegebenen werte zu nennen; % obere und untere Grenze sind offen % optionen werden verwendet, wie zuvor definiert.
>> PID=lsqnonlin(@tracklsq, PID0, [], [], options);
% Vektorinhalte werden den Variablen zugeordnet
>> Kp = pid(1);
>> Ki = pid(2);
>> Kd = pid(3);
% Erstelle Funktion mit Namen tracklsq und dem Eingabevektor PID
>> function F = tracklsq(PID)
% Vektor PID wird übergeben, die Zuordnung der Vektorinhalte in Variablen war nicht Global, und muss neu erfolgen
>> Kp = pid(1);
>> Ki = pid(2);
>> Kd = pid(3);
% setze Optionen für die Funktion sim mit der Funktion Simset, und hinterlege diese in der Variablen simopt % Lösungsverfahren (Solver) = Universalwerkzeug 'ode5' nach Dormand-Prince mit definierter Schrittweite von 0.001 % Wurzelarbeitsverzeichnis in welchem die Auswertung erfolgen soll = Aktuelles
>> simopt = simset('solver', 'ode5', SrcWorkspace', 'current');
% die Rechenoperation sim simuliert den Frequenzgang des Geschlossenen Regelkreismodells auf willkürliche Störungen / Sollwertänderungen % Simulationsdauer 0-100s [tout,xout,yout] = sim('optsim,[0100],simopt);
F= yout-1;
end end
das Beispiel gibt es auch übersichtlicher in der Matlab-Hilfe.
Dieses Programm funktioniert soweit.
Nun habe ich versucht dieses Beispel ein wenig an meine Problemstellung anzupassen. Eher ein Schritt um das ganze mehr zu verstehen, als eine fertige Lösung erreichen zu wollen... Zuerst Schrittweise mit ganzen Zahlen was auch funktionierte, und später mit Fließkommazahlen recht imposanter Dimensionen die mein Modell wiederspiegeln. (sicherlich sind Zeitkonstanten um 1*10^-24 irgendwo zu vernachlässigen, aber bleiben wir doch ersteinmal dabei)
Code:
function[Kp,Ki,Kd] = runtracklsq
% RUNTRACKLSQ demonstrates using LSQNONLIN with Simulink.
% Copyright 1990-2004 The MathWorks, Inc. % $Revision: 1.1.4.1 $ $Date: 2004/04/01 16:13:06 $
soo nun schießt er über die Grenzen hinaus mit dem folgenden Fehler:
>> [Kp, Ki, Kd] = runtracklsq2
??? Error using ==> optim\private\lsqncommon
User supplied function failed with the following error:
Error using ==> sim
Derivative input 1 of 'optsim_new/Plant & Actuator/Plant' at time 14.2 is Inf or NaN. Stopping simulation. There may be a singularity in the solution. If not, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances).
Error in ==> lsqnonlin at 147
[x,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
Error in ==> runtracklsq2 at 24
pid = lsqnonlin(@tracklsq2, pid0, [], [], options);
von welcher Singularität ist die Rede, und welche Fehlertoleranzen könnte ich wie anpassen?
Sorry für den Überfall.
Aber derzeit finde ich keinen direkten Lösungsansatz.
von welcher Singularität ist die Rede, und welche Fehlertoleranzen könnte ich wie anpassen?
Die Singularität liegt aus Sicht des (Optimierungs-) Lösers in der Zielfunktion (d.h. im Modell).
Fehlertoleranzen sind TolX und TolFun in deiner optimset - Zeile.
Eine weitere Möglichkeit dürfte die Wahl eines anderen Algorithmus (ebenfalls über optimset) sein.
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.