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

Fehler bei fminsearch

 

surf
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2012, 12:06     Titel: Fehler bei fminsearch
  Antworten mit Zitat      
Hallo,

ich habe die Sprungantwort meiner Regelstrecke gemessen und bin mir ziemlich sicher, dass es sich um ein PT1-Glied mit Totzeit handelt. Wenn ich nun meine Parameter mittels fminsearch berechnen lasse geht das auch bis zum 40. Iterationsschritt. Dann kommt die Fehlermeldung:

??? Error using ==> tf.tf at 239
The value of the "InputDelay" property must be a vector of nonnegative numbers.

Error in ==> PTGlied at 38
sys_mod=tf(zmod, nmod, 'InputDelay', x(2));

Error in ==> fminsearch at 320
x(Smile = xr; fxr = funfcn(x,varargin{:});

Error in ==> nelder at 10
x=fminsearch('PTGlied',x0,options);

x(2) ist mein Schätzwert für die Totzeit, die ich am Anfang übergebe. Mir scheint es so, dass fminsearch einen negativen Wert für die Totzeit berechnet und dieser beim Einsetzen in die Funktion tf einen Fehler verursacht.

Hat jemand schon Erfahrung mit diesem Fehler gemacht, oder weiß wie man ihn behenben kann? Im folgenden ist der Code.

Code:

x0=[ 0.134139, 0.95, 150 ]; % x0(1)=Verstärkung V
                            % x0(2)=Totzeit T0
                            % x0(3)=Zeitkonstante T1
                     
options=optimset('Display','iter','TolFun',1.e-6,'TolX',1.e-6);


x=fminsearch('PTGlied',x0,options);

Optimalparameter=x
 


Code:

function g=PTGlied(x)

 evalin('base','save myvars.mat');
 load myvars.mat

% Identifiziertes Systemmodell

zmod=[ x(1) ];
nmod=[ x(3), 1 ];


sys_mod=tf(zmod, nmod, 'InputDelay', x(2));
ymod=step(sys_mod, tneu);


% Sprungantwort des zu identifizierenden Systems

ysys=datAntRed';

g=sum(abs(ysys-ymod));

end
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.04.2012, 12:25     Titel:
  Antworten mit Zitat      
Hallo,

du könntest z.B. in deiner Zielfunktion abfragen, ob die Eingabe negativ ist, und in dem Fall einen hohen Wert zurückgeben.

Alternativ könntest du fmincon verwenden und dort die Nebenbedingung explizit angeben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
surf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2012, 20:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

schonmal danke für deine Tipps. Ich hab noch zwei Fragen. Wenn ich in meiner Zielfunktion den Wert abfrage und diesen ändere falls er negativ ist, verfälsche ich dann nicht das Ergebnis von fminsearch. Dessen Aufgabe ist es doch den Optimalwert entsprechend der gemessenen Sprungantwort zu finden. Wenn ich aktiv in die Suche des Optimalwertes eingreife, verhindere ich dies doch oder nicht?

Die Benutzung von fmincon verstehe ich so, dass sie parallel zu fminsearch aufgerufen werden müsste. Also immer nachdem fminsearch einen neuen Wert für die Totzeit berechnet hat, müsste ich diesen mittels fmincon überprüfen, ob er innerhalb der vorgesehenen Grenzen liegt. fmincon müsste ich dann aus dem Script von fminsearch aufrufen. Richtig?

Ich wäre sehr dankbar über weiter Hilfe.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.04.2012, 22:10     Titel:
  Antworten mit Zitat      
Hallo,

die Idee ist, unzulässige Parameter einfach sehr schlecht zu bewerten. Das sollte nichts verfälschen, im Gegenteil.

Das verstehst du falsch. fmincon kann statt fminsearch, nicht zusätzlich dazu, verwendet werden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
surf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2012, 20:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

dann versteh ich das. Vielen Dank für deine Hilfe! Ich werds morgen ausprobieren und schreiben, was dabei rausgekommen ist.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
surf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.05.2012, 16:16     Titel:
  Antworten mit Zitat      
Gestern hats nicht mehr geklappt aber dafür heute. Ich hab festgestellt, dass ich mit meinem Schätzwert für die Verstärkung ziemlich daneben lag. Ich denke daran hats gelegen, dass fminsearch durcheinander gekommen ist.

Das Ergebnis von fminsearch ist bisher nur mittelmäßig. Gerade bei der Totzeit liegt der berechnete Wert ziemlich daneben. Aus der Sprungantwort kann man ablesen, dass die Totzeit defintiv unter einer Sekunde liegen muss. Momentan gibt mir fminsearch Werte größer als 5 sek sind. Ich probiere weiter.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.05.2012, 18:20     Titel:
  Antworten mit Zitat      
Hallo,

dann probiers doch mal mit entsprechendem Startwert.
Vorschlag auch, sich die vermeintliche Lösung mal plotten zu lassen. Vielleicht kannst du daraus was ablesen.

Du kannst es auch mal mit einem anderen Löser, z.B. fminunc, versuchen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
surf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2012, 14:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

Ich hab die Sprungantwort des Modells und der Messung geplottet und kann eine recht gute Übereinstimmung feststellen. Nur die Totzeit wird nach wie vor von fminsearch ignoriert. Ich kann mir vorstellen, dass es daran liegt, dass die Totzeit im Vergleich zur Zeitkonstante sehr, sehr klein ist.

Totzeit=0,7s
T1=170s

fminsearch erzielt also ein besseres Ergebnis ohne die Totzeit zu berücksichtigen, weil sie einen sehr kleinen Anteil an der Nährung des Gesamtergebnis hat. Ich werd jetzt nochmal über fmincon versuchen die Nebenbedingung für die Totzeit auf kleiner 1 einzustellen.

Ich hab nebenbei auch versucht die Strecke über zwei PT1-Glieder zu approximieren, aber das kann eigentlich auch nicht die Lösung sein, weil meine gemessene Sprungantwort keinen Wendepunkt hat.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn du nicht weiterkommst, poste bitte ein Code-Beispiel, und ich schau mir das mal genauer an.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
surf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2012, 11:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe die Strecke jetzt ganz gut mit fmincon angenähert. Die Totzeit habe ich über die Nebenbedingungen festgelegt. Bis dahin schonmal vielen Dank für deine Hilfe!

Jetzt habe ich aber ein anderes Problem beim Reglerentwurf. Was ich erreichen will ist eine sinusförmige Temperaturschwingung auf einer Werkstückoberfläche. Dafür habe ich eine Wärmequelle, die ich sinusförmig ansteuere. Mein Steuersignal bewegt sich zwischen 0 und 10 V. Bei 10 V ist die Wärmequelle bei maximaler Leistung.

Meine Sprungantwort habe ich bei einer Änderung der Eingangsspannung 0 auf 4 V gemessen. Dabei erreiche ich eine Temperaturänderung auf der Werkstückoberfläche von 26°C. Bei einem Sprung von 0 auf 8 V erreiche ich eine Temperaturänderung von 50°C. Wenn ich nun in Simulink einen sinusförmigen Spannungsverlauf zwischen 0 und 8V auf meine Regelstrecke gebe, passiert auch genau das was ich erwartet habe. Die Temperatur steigt an und schwingt gleichzeitig sinusförmig. Aufgrund der hohen Frequenz werden aber keine Temperaturen erreicht die sonderlich stark von 26°C abweichen.

Lange Rede kurzer Sinn. Mein Problem ist nun dass zwischen Anregung und Antwort eine Phasenverschiebung auftritt. Diese möchte ich ausregeln. Auf die absolute Temperatur kommt es mir nicht an. Bei einer Eingangsschwingung zwischen 0 und 8V möchte ich zum Beispiel nicht eine Temperaturschwingung zwischen 26 und 50°C haben. Wie soll ich dafür den Regler entwerfen?

Ich hoffe mein Problem ist halbwegs verständlich rübergekommen.
Schöne Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Reglerauslegung ist nicht so meine Domäne. Wenn hier keine Antwort kommt, mach vielleicht einen separaten Thread dafür auf, weil von den anderen vielleicht niemand bis hierher liest.

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.