Verfasst am: 10.07.2015, 10:30
Titel: fgaolattain optimierung funktioniert nicht
Hallo,
ich bin dabei eine Optimierung mit der Funktion "fgoalattain" durchzuführen.
Es sollen bei mir zwei Surfaces optimiert werden, da dies jedoch seit zwei Tagen nicht funktionieren will hab ich mir ein einfaches Problem gebastelt um leichter zu verstehen wie fgoalattain arbeitet bzw. was ich falsch mache. Doch auch hier komme ich nicht weiter und habe denke ich den selben Fehler.
Führe ich den unten angegebnen Code aus werden die Parameter a immer so optimiert, dass die Kennlinien anschließend nahezu auf der x-Achse liegen. Es kommt mir also vor als würde der Abstand zwischen Messpunkten und x-Achse minimiert. Aber ich möchte ja eher eine Minimierung zwischen Kennlinie und Messwerte.
Kurz Beschreibung zum Code sofern er nicht durch die Kommentare im Code verständlich ist:
Der folgende Code ist sehr simpel gehalten, zuerst werden Daten eingeben welche ich einfach künstlich erstellt habe, aber wie im Code beschrieben in Realität beispielsweise Messdaten sind. Anschließend werden die Messdaten mit den gegeben Kennlinien geplotet. Danach folgt die Optimierung mit fgoalattain und ein anschließender Plot der optimierten Kennlinien.
Die Lösung soll sein dass die beiden Kennlinie nach der Optimierung sozusagen "perfekt" (abgesehen von dem Kompromiss den man augrund der zweifachen Optimierung hat) in den Messdaten liegen. Optimiere ich beie Formeln einzeln z.b. in der Curve Fitting Toolbox klappt das auch, nur kommen dann unterschiedlich optimierte Parameter heraus, aber diese sollen ja eben gleich sein.
Code:
Code:
% test fgoalattain
%% Daten händisch erstellen mit anschließenden plots zur grafischen Auswertung
x = 0:100;
% zu optimierende Formel
R = (20+0.543*x)/(3000^0.88);
U = (20 + (0.543*x))*3000^0.12;
% Grafische Darstellung der Messwerte und der nicht-optimierten Kennlinie subplot(2,2,1);
title('R mit original Werten');
hold on;
plot(x,R);
plot(xmess,Rmess,'*');
ylim([00.1]);
% Berechnung von R und U mit optimierten Parametern
Ropti = (a(1)+a(2)*x)/(3000^a(3));
Uopti = (a(1) + (a(2)*x))*3000^(1-a(3));
%Grafische Darstellung der optimierten Kennlinien und der Messwerte
subplot(2,2,3);
title('R optimized');
hold on;
plot(x,Ropti);
plot(xmess,Rmess,'*');
ylim([00.1]);
Hier noch die Funktion "test_fgoal" welche von "fgoalattain" aufgerufen wird:
Code:
function f = test_fgoal(a,xdata)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
f(:,1) = ((a(1) + a(2).*xdata))./(3000^a(3));
f(:,2) = ((a(1) + a(2).*xdata)).*(3000^(1-a(3)));
hi joernS.
ich bin kein pro in sachen fitting aber auf den ersten blick sieht
fgoalattain
für mich nicht passend zu deinem problem aus.
es wird zwar ein Minimum einer Funktion gesucht unter der Berücksichtigung eines Ziels aber deine Funktion liefert als Rückgabe wert nicht die Differenzen zu den Messpunkten. darum kommt meiner Meinung nach das raus was du da raus hast.
ich hab mal folgenden änderungen gemacht. kannst dir ja mal angucken ob das für dein problem passt.
Code:
function f = test_fgoal(a,xdata)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
f(:,1) = ((a(1) + a(2).*xdata(:,1)))./(3000^a(3));
f(:,2) = ((a(1) + a(2).*xdata(:,2))).*(3000^(1-a(3)));
vielen Dank für die Antwort, auch wenn mich diese etwas schockiert.
Deine Lösung habe ich soeben ausprobiert und rein grafisch gesehen kommt dabei wirklich ein akzeptables Ergebnis heraus. Ich werde dies noch etwas weiter auswerten und dann auch auf meine eigentliches Problem anwenden. Das wird aber wohl erst nächtse Woche was.
Jetzt aber der Punkt der mich schockiert:
Ich würde mein Problem definitiv als multiobjective optimierung ansehen, da ich eben zwei Funktionen habe die beide zusammen (unter einem Kompromiss(pareto front)) optimiert werden müssen.
Daher habe ich lsqcurvefit schon von vornherrein ausgeschlossen.
Für multiobjective optimization stehen mir in Matlab drei bekannte Funktionen zur Verfügung die primär dafür geignet sind. (Zumindest nach meinem Verständnis)
1. gamultiobj -> fällt raus, da diese eher für nonsmoothe funktionen geignet ist.
2. fminimax -> ist ja im Prinzip eine spezialform von fgoalattain. Bei dieser Spezialfunktion hätte ich genau mein Ergebnis erwartet wie ich es oben hatte, da diese ja die Funktionswerte minimiert.
3 fgoalattain -> Diese habe ich so verstanden dass die Differenz zwischen Funktion und Ziel(hier: Messpunkte) minimiert wird.
Deshalb bin ich der Meinung dass fgoalattain die richtge Funktion wäre.
Bitte korrigiert mich wenn ich falsch liege, denn wenn man die Funktion schon falsch versteht ist das Ganze natürlich zum scheitern verurteilt.
das geht damit bestimmt. aber deine funktion spiegelt die messwerte wieder. und das versuchst du zu minimieren. bei einem fitten musst du aber ja den abstand zu den messweten minimieren. nicht die messwerte..... hoffe das ist verständlich ausgedrückt.
ich denke das du auch mit fgoalattain arbeiten kannst. du musst aber halt deine funktion so schreiben das sie auch das wiederspiegelt was du minimierren willst. jedenfalls hab ich das so verstanden.
grüße
_________________
ich hab mein Problem nun sowohl mit fgoalattain als auch mit lsqcuvefit (gelöst), bzw. habe ich zumindest auf den ersten Blick akzeptable Ergebnisse.
Gerne poste ich auch den mittlerweile etwas veränderten code noch einmal.
Vorher hätte ich aber noch zwei kurze Fragen.
1. Ich bin mir aus der Beschreibung von fgoalattain und aus meinem Ergebnis nicht ganz sicher ob ich fgoalattain richtig verstanden habe:
Aus der Beschreibung heraus verstehe ich dass fgoalattain meine zu optimierende Kennlinienfunktion optimiert, sodass diese bestmöglichst die Ziele in "goal" erreicht. Kurz, fgoalattain minimiert die Differenzen zwischen meiner Kennlinie zu den Messwerten.
Übertrage ich dieses Verstädnis nun auf fgoalattain und setzte damit nur meine Kennlinienfunktion als "fun" in fgoalattain, kommt dabei nichts anständiges heraus.
Wenn ich dagegen an fgoalattain folgende Funktion übergebe: "Kennlinienfunktion-goal" (also die Differenzen zwischen Kennlinie und Messwerte), und "goal" als meine Messwerte definiere, dann approximiert am Ende die optimierte Kennlinienfunktion die Messwerte am besten. Dies widerspricht aber meinem eigentlichen Verständnis von fgoalattain.
Kannst du mir die fgoalattain einmal ganz simpel erklären, im Sinne von: "Eine Kennlinie soll Messwerte approximieren -> die Kennlinienfunktion ist für fgoalattain die Funktion "fun", "goal" sind die Messwerte, ..." Oder einfach ein Beispiel auf Niveau eines Neandertalers.
2. Ich wollte hier fgoalattain verwenden da ich ja zwei Funktionen optimieren muss. Weshalb lsqcurvefit für mich nicht in Frage kam, auch weil ich in den Matlab Beschreibungen nie etwas finden konnte dass auch lsqcurvefit für multiobjective optimization geeignet ist. Doch offensichtlich, da ich ja dank deiner Hilfe auch mit lsqcurvefit ein annehmbares Ergebnis bekomme scheint lsqcurvefit ja doch für multiobjective optimization geeignet zu sein.
Was hat fgoalattain dann für einen Sinn wenn ich das selbe auch mit lsqcurvefit machen kann?
ich habe nun nochmals mit lsqcurvefit herumgespielt. Aufgrund der aktuellen Ergebnisse bin ich der Meinung das lsqcurvefit für multiobjective optimization entweder nicht wirklich funktioniert oder ich es falsch anwende.
Wenn ich lsqcurvefit auf meine beiden Funktionen getrennt anwende bekomme ich gute Ergebnisse, einmal ist die Quadratsumme von R (dabei ist die Quadratsumme von U etwas "schlechter" bzw. "größer") und einmal die Quadratsumme von U (dabei ist die Quadratsumme von R etwas "schlechter" bzw. "größer") optimiert. Der Vergleich der Ergebnisse macht somit absolut Sinn.
(mit Quadratsumme ist die Summe der Residuen gemeint)
Verwende ich nun lsqcurvefit so wie du es empfholen hast, also auf beide Funktionen gleichzeitig, dann bekomme ich als Ergebnis genau das Selbe wie wenn ich nur nach U optimiere.
Allerdings würde ich erwarten dass ich sowohl für R als auch für U irgendwo zwischen den Werten der einzelnen Optimierungen liege.
Kann mir hierzu jemand eine Begründung liefern warum das nicht der Fall ist?
Anbei nochmal der "wichtigste" Code:
Code:
%% Data from measurements
xdata(:,1) = d_mess;
xdata(:,2) = I_mess;
xdata(:,3) = R_mess;
xdata(:,4) = U_mess;
% optimization conditions
a0 = [20; 0.534; 0.88]; %initial point
weight = abs(goal); % ensures the same percentage of under- or overattainment of the active objectives % weight = ones(size(goal)); % weight(:,1) = ones; % weight(:,2) = zeros;
%%%%%%%%%%%% weight wird aktuell nicht verwendet!!!!!!
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.