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

Parameteranpassung an Funktion + 3 Wertepaare

 

sz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2012, 15:11     Titel: Parameteranpassung an Funktion + 3 Wertepaare
  Antworten mit Zitat      
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?


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.02.2012, 15:17     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
sz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2012, 15:28     Titel:
  Antworten mit Zitat      
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.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.02.2012, 15:40     Titel:
  Antworten mit Zitat      
bei fminsearch kannst du startwerde angeben. bei fminbnd grenzen glaub ich
Private Nachricht senden Benutzer-Profile anzeigen
 
sz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2012, 15:49     Titel:
  Antworten mit Zitat      
super danke dann versuche ich mal fminbnd
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.02.2012, 15:58     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
sz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2012, 16:07     Titel:
  Antworten mit Zitat      
okay dann werde ich mal fmincon und lsqcurvefit ausprobieren. mal sehen wie weit ich damit kommen.
 
sz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2012, 09:42     Titel:
  Antworten mit Zitat      
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.
 
Harald
Forum-Meister

Forum-Meister


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

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
Private Nachricht senden Benutzer-Profile anzeigen
 
sz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2012, 08:02     Titel:
  Antworten mit Zitat      
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];

U=[0,Umpp,Uoc];
I=[Isc,Impp,0];

%function [fun1,fun2,fun3,fun4] = myfunction(X)
function [fun] = myfunction(X)

%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)));

fun=fun1+fun2+fun3+fun4;

end

%bounds
lb=[8.5,1e-12,1e-12,1,1.3,0,50];
ub=[10,1e-6,1e-6,1.5,2,0.1,inf];


%set iterationsoptions (algorithm, aso)
nonlcon = [];
options=optimset('Display','iter','Algorithm','trust-region-reflective');

%fit
[X,fval] = fmincon(@myfunction,x0,[],[],[],[],lb,ub,nonlcon,options);

display (fval);
end


ich habe das jetzt mit der Summe der Funktionen gelöst, bin damit aber noch nicht wirklich zufrieden.

Mit iget werden die zu den Startwerten der Parameter gehörigen I-Werte berechnet.

ich versuche dann mal, das ganze für lsqcurvefit umzuschreiben. Danke schonmal für die Hilfe!
 
Harald
Forum-Meister

Forum-Meister


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

warum bist du nicht zufrieden?

Ich hatte ja wie gesagt Zweifel, dass hier etwas vernünftiges herauskommen kann, bei weniger Datenpunkten als Parametern.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2012, 10:36     Titel:
  Antworten mit Zitat      
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

fun=sqrt((fun1)^2+(fun2)^2+(fun3)^2+(fun4)^2);
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.02.2012, 13:09     Titel:
  Antworten mit Zitat      
Hallo,

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
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 - 2025 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.