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

Multiobjective optimisation Parameter Identifikation

 

Premutos
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.09.2016, 21:54     Titel: Multiobjective optimisation Parameter Identifikation
  Antworten mit Zitat      
Hallo zusammen,

ich will eine Parameteridentifikation durchführen. Ich habe eine Gleichung (Materialmodell) welche 2 Parameter enthällt, welche ich so bestimmen will, das die Funktion möglicht durch die Experimental Daten (xy-DatenSatz 1) verläuft (nichtlinear). Das funktioniert super mit lsqcurvefit etc. Jetzt will ich aber die 2 Parameter bestimmen und dabei diese möglichst gut an zwei unterschiedliche Experimental Datensätze anpassen, also xy-DatenSatz 1 und xy-DatenSatz 2. Das Ergebnis soll sein, das ich mit einem Satz von Parametern möglichst gut beide Kurven der Datensätze beschreiben kann. Die x und y-Werte der Datensätze sind jeweils Spaltenvektoren.
Mit welcher Funktion mache ich das in Matlab?

fgoalattain scheint mein Problem m.M.n. nicht zu lösen, oder sehe ich das falsch?
Ich sehe da nicht wie ich die jeweiligen y-Werte reinbringen soll...?
Deswegen kein Ansatz dazu

Ich hatte noch etwas anderes Versucht:
Nach der least squares methode
x1 sind die x-werte von datensatz und y1 y-werte von datensatz 1 und das gleiche gilt für x2 und y2. Jeweils Spaltenvektoren
Simga ist das Materialgesetz

Code:

x1=[1; 2; 3; 4];x2=[1; 2.2; 3.1; 4.4];y1=[.1; .2; .5; .84];y2=[.17; .39; .93; .99];
x0 = [0 1];
   
Sigma_1 = @(Parameter, x1)   2*(x1-x1.^-2).*(Parameter(1) + ...
                                 2*Parameter(2)*(x1.^2 + 2*x1.^-1 - 3)) ;
   
Sigma_2 = @(Parameter, x2)   2*(x2-x2.^-2).*(Parameter(1) + ...
                                 2*Parameter(2)*(x2.^2 + 2*x2.^-1 - 3));
   
% Methode der kleinsten Fehlerquadrate
Sigma = @(Parameter)   sum( (Sigma_1(Parameter, x1) - y1).^2  ) + ...
                           sum( (Sigma_2(Parameter, x2) - y2).^2  ) ;
                                               
opts = optimoptions('fminunc', 'Algorithm', 'quasi-newton');
A = fminunc(Sigma, x0, opts) ;
 

Das klappt, allerdings liegen beide Kurven übereinander, beschreiben perfekt den einen Datensatz, aber garnicht den zweiten, also als wenn er nicht beachtet worden wäre...?

Vielen Dank für eure Hilfe
Bin auch gerne für neue Ansätze dankbar!

Gruss,
Premutos
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wie wäre es denn, die beiden Datensätze einfach aneinanderzuhängen und weiter lsqcurvefit zu verwenden?
Zitat:

Das klappt, allerdings liegen beide Kurven übereinander, beschreiben perfekt den einen Datensatz, aber garnicht den zweiten, also als wenn er nicht beachtet worden wäre...?

Könnte sein, dass der Solver in ein lokales Minimum gelaufen ist --> mal andere Startwerte versuchen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.09.2016, 22:18     Titel:
  Antworten mit Zitat      
Wouh, erstmal Danke für die Turbo schnelle Antwort!

Andere Startwerte habe ich schon versucht, das gleiche Ergebnis.
Aneinanderhängen geht leider nicht, da es sich um anisotrope Daten handelt.

Aber es muss ja eine Lösung geben für diese Art von Problem, selbst auf der Seite von MathWorks hat jemand etwas stark ähnliches gefragt, und keine Antwort bekommen.
In der Literatur ist das beschrieben, ich kanns in matlab nur nicht umsetzen.
Irgend welche anderen Ideen?
gamultiobj vielleicht? Geht da damit?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Aneinanderhängen geht leider nicht, da es sich um anisotrope Daten handelt.

Sorry, aber das bedeutet...?
Zumindest in diesem Fall entspricht das genau deiner Zielfunktion, und das ist auch noch so, wenn du unterschiedlich viele Datenpunkte pro Kurve hast.

Zitat:
Aber es muss ja eine Lösung geben für diese Art von Problem, selbst auf der Seite von MathWorks hat jemand etwas stark ähnliches gefragt, und keine Antwort bekommen.

Du meinst MATLAB Answers? Das ist letztlich auch keine viel andere Community als hier. Wenn du eine Antwort von MathWorks haben möchtest, würde ich den Technischen Support kontaktieren.

Zitat:
Das klappt, allerdings liegen beide Kurven übereinander,

Bei den momentanen Daten verwundert mich das nicht, da x1 und x2 sehr ähnlich sind. Wenn man das nun in die gleiche Formel einsetzt, kommen natürlich auch ähnliche y-Werte und somit Datenpunkte heraus.

Zitat:
aber garnicht den zweiten, also als wenn er nicht beachtet worden wäre...?

Kann ich zumindest mit den gegebenen Daten nicht nachvollziehen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.09.2016, 23:45     Titel:
  Antworten mit Zitat      
Ja die Daten sind schlecht gewählt von mir, die echten haben aber über 2000 Datenpunkte.

Dann war ich eventl. vorschnell, wie meinst du genau die Daten aneinanderhängen?
Also es sind Daten aus 2 verschiedenen Belastungsrichtungen (Also Spannungen [N/mm^2]), die kann ich ja nicht einfach zusammen schmeißen in einen Vektor. Oder habe ich falsch verstanden was du mit aneinander hängen meintest?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Ja die Daten sind schlecht gewählt von mir, die echten haben aber über 2000 Datenpunkte.

Wenn du die Daten weitergeben kannst - von der Größe her sollte es kein Problem sein, das als .mat-Datei anzuhängen.

Zitat:
Dann war ich eventl. vorschnell, wie meinst du genau die Daten aneinanderhängen?

x = [x1; x2];
y = [y1; y2];

Zitat:
die kann ich ja nicht einfach zusammen schmeißen in einen Vektor

Warum nicht? Es läuft genau auf das hinaus, was du momentan als Zielfunktion hast - nur dass die beiden Summen zu einer zusammengefasst werden.

Ist die Anzahl der Datenpunkte bei beiden Kurven gleich? Wenn eine Kurve deutlich mehr Datenpunkte hat als die andere, dann wäre es mit der momentanen Zielfunktion klar, dass sich der Fit mehr oder weniger stark an der Kurve mit mehr Datenpunkten orientiert. Da könnte man z.B. einen Gewichtsfaktor einführen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2016, 14:27     Titel:
  Antworten mit Zitat      
Hallo und Danke für die Hilfe soweit.

Habe jetzt hier mal Beispiel-Datensätze, Auszüge aus den Originalen.
Hatte es mit Gewichtungsfaktor schon probiert, der funktioniert auch, aber zwei Dinge stören mich:

1. Die Kurve sollte eigentlich immer weiter Ansteigen und nicht absteigen
2. Wenn ich beide plotte (hier rot und blau), dann liegen sie direkt über einander. Das würde ich nicht erwarten, oder interpretiere ich da was falsch und es sollte so sein?
x1 bis y2 Werte sind in der m-file
0.2 und 0.8 sind die Gewichtungsfaktoren (In Summe 1)

Zum aneinander hängen: Ich hatte dich richtig verstanden, hatte es so schon geamcht, da kommt aber eine Funktion mit einer Hysterese bei raus, also eine die wieder in den Ursprung zurückläuft...?

Code:

x0 = [0 1];
   
S_xy1 = @(Parameter, x1) 2*(x1-x1.^-2).*(Parameter(1) + ...
                                     2*Parameter(2)*(x1.^2 + 2*x1.^-1 - 3));
   
S_xy2 = @(Parameter, x2) 2*(x2-x2.^-2).*(Parameter(1) + ...
                                     2*Parameter(2)*(x2.^2 + 2*x2.^-1 - 3));
   
% Methode der kleinsten Fehlerquadrate
S_g = @(Parameter)   sqrt(  sum( ((S_xy1(Parameter, x1) - y1).^2).*  0.2  ) + ...
                            sum( ((S_xy2(Parameter, x2) - y2).^2).*  0.8  ) );
                                               
opts = optimoptions('fminunc', 'Algorithm', 'quasi-newton');
[Parameter] = fminunc(S_g, x0, opts) ;
% Plot    
figure
p1 = plot(x1, y1, 'ko','MarkerSize', 4, 'MarkerFaceColor', 'k');
hold on
p2 = plot(x2, y2, 'ko','MarkerSize',4);
hold on
p3 = plot(x1 ,S_xy1(Parameter, x1));  
set(p3, 'Color', 'blue',  'LineWidth', 1.5)
hold on
p4 = plot(x2 ,S_xy2(Parameter, x2));
set(p4, 'Color', 'red', 'LineWidth', 1.5)
hold off
 


Vielen Dank und viele Grüße,
Premutos

xy_Werte.mat
 Beschreibung:

Download
 Dateiname:  xy_Werte.mat
 Dateigröße:  1.01 KB
 Heruntergeladen:  223 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

zu 1.: bei den gewählten Gewichten sehe ich das nicht. Wenn beide Gewichte = 0,5 sind, dann schon. Sind die Parameter, die du als Ergebnisse erhältst, denn sinnvoll?

zu 2.: du möchtest ja für die beiden Kurven dieselben Parameter. Da du ähnliche x-Werte hast, bekommst du ähnliche y-Werte, also fast die gleiche Kurve. Anders gesagt: du bekommst die gleiche Kurve und schaust dir lediglich unterschiedliche Punkte auf der Kurve an

Siehst du schön, wenn du die Punkte markierst.
Code:
p3 = plot(x1 ,S_xy1(Parameter, x1), 'o-');  
set(p3, 'Color', 'blue',  'LineWidth', 1.5)
p4 = plot(x2 ,S_xy2(Parameter, x2), 'o-');
set(p4, 'Color', 'red', 'LineWidth', 1.5)



Zitat:
Zum aneinander hängen: Ich hatte dich richtig verstanden, hatte es so schon geamcht, da kommt aber eine Funktion mit einer Hysterese bei raus, also eine die wieder in den Ursprung zurückläuft...?

Kannst du mal posten, was du da gemacht hast? Für das Plotten musst du die Datenpunkte schon wieder trennen...

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.