function guete = zielfunktion(parameter) % Berechnung der Eingangs- und sonstigen Daten aus den Parametern (parameter) sim(...) % Berechnung der Güte der Parameter aus dem Unterschied zwischen Simulation und Daten % Das kann sowohl Abweichungen zwischen 5.5 und 10 als auch eine Abweichung des Endwerts beinhalten.
guete = ...
Ok verstehe, aber dann brauche ich ja die Schleife gar nicht mehr oder?
Vor allem, kann ich z.B. angeben, dass einzelne Parameter nur mit +/- variiert werden dürfen?
Ok verstehe, aber dann brauche ich ja die Schleife gar nicht mehr oder?
Genau.
Zitat:
Vor allem, kann ich z.B. angeben, dass einzelne Parameter nur mit +/- variiert werden dürfen?
Sorry, aber wie sollen sie sonst variiert werden? Mit *+/? Falls du Nebenbedingungen meinst: ja, können angegeben werden und geht recht klar aus fmincon hervor.
entschuldigung ich habe vergessen bei +/- den 1er zu schreiben.
Ein Parameter von mir ist z.B. ein Downsampling (um den Einfluss des Rauschen zu vermindern) und da kann ich eben nur jeden xten Messwert streichen und nicht jeden x komma x ten
Die von mir benannten Optimierungsverfahren gehen davon aus, dass die Parameter kontinuierlich variiert werden können und dass die Zielfunktion "glatt" ist (keine Sprünge, keine Knicke).
Wenn das nicht der Fall ist, muss man sehen, wie man sich sonst behelfen kann.
Ist die Downsampling-Rate der einzige diskrete Parameter? Wenn nicht, wieviele gibt es?
Und welche Werte sind zulässig/sinnvoll?
Woran ich denke ist, die Downsampling-Rate in einer (par)for-Schleife und abhängig davon die kontinuierlichen Parameter zu bestimmen.
Und: warum nicht glätten/filtern statt Downsampling?
Also im Prinzip habe ich 3 Parameter zur Verfügung:
1. Downsampling
zulässige Werte sind 1:10. Ich habe schon herausbekommen, dass 8 einen sehr guten Wert darstellt, weil ich ja ca. weiß wie das System sich verhalten soll (ist ein Labormodell für ein Praktikum auf der Uni) und da sehe ich im Bode-Diagramm dass die 2 Eigenfrequenzen des Systems halbwegs passen
2. q ein Vergessensfaktor vom LS-Verfahren zulässig zwischen 0 und 1, sinnvoll so zwischen 0.5 - 1 denke ich. Da ist auch die Anzahl der Nachkommastellen egal.
3. Anzahl der Messwerte ist so im Bereich von 300 bis 1500 sinnvoll. Muss aber natürlich ganzahlig sein.
@Filtern könnte ich mir auch mal anschauen, aber Downsamplen geht halt schnell.
Ich weiß ja wie sich meine Übertragungsfunktion zusammensetzt.
Da ich weiß, dass sich nicht jeder Parameter (z.B. ein Trägheitsmoment) ändert der in die Übertragungsfunktion eingeht, habe ich jetzt mal die 5 Parameter die sich ändern in fmincon gegeben.
Leider habe ich jetzt noch das Problem, dass meine Constrains nicht greifen, weil ich eigentlich angeben möchte, dass keiner dieser kleiner 0 bzw. eigentlich auch nicht 0 werden darf
Hier mal der Code wie ich es gemacht habe, vielleicht kann mir da jemand helfen:
Code:
fun1 = @(x)zielfunktion(x,Qerr,Qend,usim,ysim,t2,tsim,index,indexEndwert,indexFehler,lenSim,meanYsim,ysimEnde,ysimErr,lenNorm2,LA,RA,J1,J2,J3,km,Ta);
A=-eye(5);
b=[0;0;0;0;0];
x = fmincon(fun1, x0,A,b);
woraus schließt du, dass Constraints nicht greifen?
Zwei Vorschläge:
Die Schrankenbedingungen auch als solche angeben (Argumente lb / ub).
... und die ganzen Parameter in einer Struktur zusammenfassen - das sieht ja schlimm aus!
Und bezogen auf den vorherigen Post: da könnte es sinnvoll sein, eine (par)for-Schleife über die diskreten Parameter laufen zu lassen und dann die kontinuierlichen zu optimieren.
In meiner Funktion erstelle ich eine Übertragungsfunktion, beim Durchlauf habe ich da einen Fehler gekommen, dass er sie nicht erstellen kann. Dann habe ich mir mal die Werte ausgeben lassen und habe gesehen, dass diese negativ werden .
hätte es jetzt so probiert
Code:
A = [];
b = [];
Aeq = [];
beq = [];
lb =[0.1e-12;0.1e-12;0.1e-12;0.1e-12;0.1e-12];
ub = [20,20,20,20,20];
x = fmincon(fun1,x0,A,b,Aeq,beq,lb,ub);
vielen dank
das hart wirklich geholfen ...
leider liefert die Optimierung keine besseren Ergebnisse als meine Methode und weiters bricht der wegen zu geringer Step-Size mal ab und ein Parameter wird 1e-16 (die constraints greifen wieder nicht ) und ist somit auch weit weg von der Realität
die Optimierung sollte schon bessere Resultate liefern. In der parfor-Schleife läufst du ja nur über ein bestimmtes Raster.
Die Abbruchkriterien kannst du über die Optionen anpassen.
Dass die Parameter kleiner als zulässig werden, hatten wir ja abgefangen. Ein 1e-16 ist also als 1e-12 zu interpretieren.
Ich habe mich jetzt noch ein bisschen mit fmincon gespielt und habe jetzt ein brauchbares Ergebnis bekommen, was physikalisch sinn macht und auch meine constraints berücksichtigt .
Zitat:
x0 =[c1,c2,d1,d2,d3*5]; % Werte aus PAT-PR als Startwerte
x0 =[0.0016,c2,4e-5,d2,9e-6];
x0 =[0.0015, 0.0025,5e-7,d2,15e-6];
Qerr = 1; % Gewichte der beiden Kriterien
Qend = 0; % siehe oben
Leider ist da Ergebnis (auch nach meinem Gütekrit.) immer noch schlechter als meine beste Identifikation. Vor allem das Schwingen zum Schluss stört mich .... (siehe Datei im Anhang).
Weiters kommt beim ausführen dann folgendes Warning:
Warning: Trust-region-reflective method does not currently solve this type of problem,
using active-set (line search) instead.
Vermutlich weil er mit meinem Güte-Krit. keinen Gradienten bilden kann?
Leider ist da Ergebnis (auch nach meinem Gütekrit.) immer noch schlechter als meine beste Identifikation
Ohne die komplette Anwendung zur Verfügung zu haben wird man da wenig weiterhelfen können.
Ich würde vermuten, dass fmincon in ein lokales Minimum in der Nähe des von dir gefundenen gelaufen ist. Das sollte sich an dem Wert von exitflag ablesen lassen, bzw. je nach Version auch im Command Window erläutert werden.
Wenn man auf der Suche nach einem globalen Minimum ist und keine ausreichend guten Startwerte hat, hilft oft auch, mit verschiedenen Startwerten zu versuchen. Versuchs doch z.B. mal mit der von dir identifizierten besten Lösung als Startwert.
Zitat:
Vor allem das Schwingen zum Schluss stört mich ...
Wenn dich das Schwingen stört, musst du deine Zielfunktion so definieren, dass Schwingen bestraft wird.
Zitat:
Vermutlich weil er mit meinem Güte-Krit. keinen Gradienten bilden kann?
Die Gradientenbildung funktioniert unabhängig von der konkreten Problemstellung. Der Grund ist, dass "trust region" keine linearen Gleichungs-NB unterstützt.
Als Alternative zu active set kannst du auch mal interior point versuchen.
Ich kann mal die 2 m-files online stellen sofern dies erlaubt ist?!
Die Werte aus der Identifikation kann ich leider nicht verwenden, weil ich ja dort nur die Übertragungsfunktion rausbekomme, aber nicht die einzelnen Parmeter die in die Übertragungsfunktion eingehen.
Darum mache ich ja genau den ganzen Aufwand.
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.