Also ich habe das folgende Problem. Ich habe eine Funktion mit 7 bzw. 11 Parametern (am liebsten würde ich es mit 11 durchlaufen lassen, aber wenns nur für 7 möglich ist, wäre das auch ein anfang) und 2 Variablen. Die Funktion hat die Form 0=f(x,y).
Leider habe ich nur 3 Wertepaare für x und y.
Für die Parameter kann ich Grenzen vorgeben.
Geht so etwas mit Matlab überhaupt? Welche Funktion sollte ich benutzten?
ich halte es für wenig sinnvoll 11 bzw 7 paramtern mit 3 messpunkten zu fitten. da kommt zwar was raus aber das kann von der realität sowas von weit weg sein.
du kannst versuchen fminsearch zu nehmen oder fminbnd
sz
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.02.2012, 15:28
Titel:
wie kann ich bei fminsearch Parametergrenzen einfügen? Ohne diese wäre das anfitten, wie du gesagt hast sinnlos. Aber mit den Grenzen lassen sich sehr reale Werte erzeugen.
fminsearch ist nicht für Optimierung mit Nebenbedingungen geeignet.
fminbnd ist nicht für mehrdimensionale Optimierung geeignet.
Für das vorliegende Problem würde ich fmincon oder, da es sich ja um ein Curve Fitting Problem handelt, lsqcurvefit verwenden.
Ich würde aber bei der Interpretation der Resultate sehr vorsichtig sein. Es ist gut möglich, dass es mehrere Parameterkombinationen gibt, die gleich gute Resultate liefern. Dass das ganze was vernünftiges liefert, kann ich mir nur schwerlich vorstellen.
Auf jeden Fall auch auf die exitflag achten!
Grüße,
Harald
sz
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.02.2012, 16:07
Titel:
okay dann werde ich mal fmincon und lsqcurvefit ausprobieren. mal sehen wie weit ich damit kommen.
sz
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.02.2012, 09:42
Titel:
so ich habe mittlerweile die Lizenzen für die Optimization Toolbox. Leider weiß ich nicht, wie ich die 3 Wertepaare einfließen lassen kann.
Durch diese habe ich quasi 3 Funktionen, die alle an Null angenähert werden sollen, aber wenn ich fmincon einen Funktionsverktor als input gebe, bekomme ich folgenden error:
Zitat:
Error using fmincon (line 674)
User supplied objective function must return a scalar value.
die Fehlermeldung sagt ja schon aus, was das Problem ist: du musst selbst ein skalares Gütemaß angeben, z.B. die Summe der Quadrate der Abweichungen - oder eben LSQCURVEFIT verwenden.
Wenn man dir mit deinem Code weiterhelfen soll, dann poste bitte auch den Code.
Grüße,
Harald
sz
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.02.2012, 08:02
Titel:
Code:
function X=fitten(Isc,Impp,Uoc,Umpp) %,Iphi,Is1i,Is2i,n1i,n2i,Rsi,Rpi)
%Input -> arrays
x0=[9.016,5e-9,5e-7,1.1,1.4,5e-3,200];
%x0=[Iphi,Is1i,Is2i,n1i,n2i,Rsi,Rpi];
%solve I_Model für the initial parameters
Im1=geti(U(1),I(1),X(1),X(2),X(3),X(4),X(5),X(6),X(7));
Im2=geti(U(2),I(2),X(1),X(2),X(3),X(4),X(5),X(6),X(7));
Im3=geti(U(3),I(3),X(1),X(2),X(3),X(4),X(5),X(6),X(7));
Um2=getu(I(2),U(2),X(1),X(2),X(3),X(4),X(5),X(6),X(7));
%zwischendefinition von U_T:
k = 1.3806504e-23; % Boltzman constant
e = 1.60218e-19; % Elementary Charge
T = 298.15; % T:top
UT = k*T/e;
%difference between model and measurement -> function to be minimized
fun1 = abs(I(1)-(X(1)-X(2)*(exp((U(1)+Im1*X(6))/(X(4)*UT))-1)-X(3)*(exp((U(1)+Im1*X(6))/(X(5)*UT))-1)-(U(1)+Im1*X(6))/X(7)));
fun2 = abs(I(2)-(X(1)-X(2)*(exp((U(2)+Im2*X(6))/(X(4)*UT))-1)-X(3)*(exp((U(2)+Im2*X(6))/(X(5)*UT))-1)-(U(2)+Im2*X(6))/X(7)));
fun3 = abs(I(3)-(X(1)-X(2)*(exp((U(3)+Im3*X(6))/(X(4)*UT))-1)-X(3)*(exp((U(3)+Im3*X(6))/(X(5)*UT))-1)-(U(3)+Im3*X(6))/X(7)));
fun4 = abs(I(2)-(X(1)-X(2)*(exp((Um2+I(2)*X(6))/(X(4)*UT))-1)-X(3)*(exp((Um2+I(2)*X(6))/(X(5)*UT))-1)-(Um2+I(2)*X(6))/X(7)));
Ich hatte ja wie gesagt Zweifel, dass hier etwas vernünftiges herauskommen kann, bei weniger Datenpunkten als Parametern.
Grüße,
Harald
sz
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.02.2012, 10:36
Titel:
ein Kollege hat die gleiche Anpassung mit Optislang gemacht und bekommt wesentlich bessere Werte.
Kann man vielleicht eine Abbruchbedingung an fmincon stellen, so dass mehr Iterationsschritte durchgeführt werden? Die Abweichung von den 3 Messwerten, die ich eingebe ist nämlich erstaunlich hoch (1-5% je nach vorgegebenen Werten (Isc,Impp,Uoc,Umpp).
Naja immerhin kommen die erhaltenen Werte von der Größenordnung hin, vielleicht kann ich durch "kleinere" Grenzen noch bessere Ergebnisse erreichen.
Vielen Dank für die Hilfe!!
habe jetzt die Summe durch die quadratische abweichung ersetzt und erhalte dadurch noch ein bisschen bessere werte
es ist natürlich wichtig, dass ihr beide mit den gleichen Gütemaßen, Nebenbedingungen etc. rechnet.
Bei fmincon kannst du über den Befehl optimset die Toleranzen (TolX, TolFun) einstellen und das als Option übergeben; 1-5% erscheint aber auch mir gerade in der gegebenen Situation als relativ/zu hoch. Ich werde das aber wohl nur genauer analysieren können, wenn ich das vollständige Problem vor mir habe.
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.