WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Optimierungsproblem mit LSQNONLIN

 

spark
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 17.11.09
Wohnort: Hannover
Version: 7.1
     Beitrag Verfasst am: 17.11.2009, 12:46     Titel: Optimierungsproblem mit LSQNONLIN
  Antworten mit Zitat      
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.63 0.0504 1.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,[0 100],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 $

optsim_new                       % Load the model
pid0 = [1 2.0000e-004 5.0000e-005];
a1 = 6.0000e-004;
a2 = 1.5000e-007;        
a3 = 2.0000e-011;
a4 = 1.5000e-015;
a5 = 6.0000e-020;
a6 = 1.0000e-024;

options = optimset('LargeScale','off','Display','iter','TolX',0.001,'TolFun',0.001);
pid = lsqnonlin(@tracklsq2, pid0, [], [], options);
Kp = pid(1); Ki = pid(2); Kd = pid(3);

    function F = tracklsq2(pid)
        % Track the output of optsim to a signal of 1
       
        % Variables a1 and a2 are shared with RUNTRACKLSQ
        Kp = pid(1);
        Ki = pid(2);
        Kd = pid(3);

        % Compute function value
        simopt = simset('solver','ode5','SrcWorkspace','Current');
        [tout,xout,yout] = sim('optsim_new',[0 100],simopt);
        F = yout-1;

    end
end
 

das Modell ist dementsprechend angepasst.

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.

vllt mag sich mir ja einer annehmen.

mfg Spark
Private Nachricht senden Benutzer-Profile anzeigen


spark
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 17.11.09
Wohnort: Hannover
Version: 7.1
     Beitrag Verfasst am: 17.11.2009, 12:55     Titel:
  Antworten mit Zitat      
es geht im übrigen um folgendes System:
Code:

>> clear all;
>> clc;
>> s=tf('s');
>> kr=1;
>> tn=1/5000;
>> tv=5*10^-5;
>> fr=kr*((1+tn*s+tn*tv*s^2)/(tn*s));
>> fs=1/(1+3/5000*s+3/20000000*s^2+1/50000000000*s^3+3/2000000000000000*s^4+3/50000000000000000000*s^5+1/1000000000000000000000000*s^6);
>> fw=series(fr,fs);
>> sys=feedback(fw,1);
>> ltiview({'step';'pzmap';'nyquist';'bode'},sys);
>> sys
 


für die optimierung wurde aber das beispiel aus der matlab-hilfe verwendet. (simulink)[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.11.2009, 16:51     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.