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

Parameter-Optimierung in einer DGL mit fminsearch

 

Matlabnoob_126
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.05.17
Wohnort: ---
Version: R2013b, R2016a
     Beitrag Verfasst am: 09.05.2017, 14:30     Titel: Parameter-Optimierung in einer DGL mit fminsearch
  Antworten mit Zitat      
Hallo,

ich wage meine ersten Schritte in Matlab und habe für meine Masterarbeit einen "einfache" Optimierungsaufgabe zu lösen:
Gegeben ist ein einfacher Massenschwinger mit elektrostatischem Antrieb, der durch eine DGL beschrieben wird. Ausgewählte geometrische Parameter sollen optimiert werden, um Schwingungsamplitude und Resonanzfrequenz an einen vorgegebenen Wert anzupassen. Das folgende Matlab-Skript beschreibt zunächst das Schwingverhalten des Masseschwingers.

Code:
function dx=Bewegungsgleichung_Elektrostatischer_Aktor(t,x,par,f)
% Parameter
eps=8.854*1e-12;

% DGL System

dx=zeros(2,1); %für einachsige Auswertung

%für einachsige Auswertung
dx(1)=x(2);
dx(2)=(1/par.m)*(-par.cx*x(1)-par.kx*x(2)+((eps*par.er*par.b)/2*((1/(par.d0))+(1/(par.d0))))*(par.U^2)*((1+sin(2*pi*f*t))^2))-par.g;


end


Diese Funktion wird in einem weiteren Skript aufgerufen, um die DGL mit ode23 zu lösen und die Ergebnisse zu optimieren.

Code:
function Resonanzoptimierung
par.er=1.00059;
par.m=3.05*1e-7;
par.cx=10.0;
par.kx=4.84*1e-6;
par.U=60;      
par.b=100*1e-6;
par.d0=20*1e-6;
par.anz=100;    
par.g=9.81;
f=1500;
fq=1000;
a_max=3.0e-6;


frequenzen=linspace(100,f,par.anz);
amp_x=zeros(1,length(frequenzen));                % Amplitudenvektor mit Nullen initialisieren

function f=amplitudengang(par,freqenzen)
    for n=1:length(frequenzen)
    j=0;
    %DGL wird für einen Zeitbereich von 0ms bis 350ms gelöst, damit das
    %System vollständig eingeschwungen ist; nur die letzte Periode wird
    %betrachtet
    [T,X]=ode23(@Bewegungsgleichung_Elektrostatischer_Aktor,[0 350*1e-3],[0,0],[],par,freqenzen);       % DGL lösen
   
    amplituden_x=X(:,1);
       
    Tperiode=1/frequenzen(n);                   % Periodendauer bestimmen
    tgrenze=(max(T)-Tperiode);
   
    laengeT=length(T);
   
    for k=1:laengeT
        if(T(k)<tgrenze)          
            j=j+1;
        end
    end
    T=T(j:end);                                 % Zeitvektor kürzen sodass nur noch eine Periode berücksichtig wird
    amplituden_x=amplituden_x(j:end);               % Amplitudenvektor kürzen sodass nur noch eine Periode berücksichtigt wird
     
       
    amp_x(n)=(max(amplituden_x)-min(amplituden_x))/2; % Differenz zwischen Maximum und Minimum bestimmen
    end
%Bis hier haben wir nur einen Vektor aus Amplituden und Frequenzen. Hieraus
%wird jetzt das Maximum und die zugehörige Frequenz(=Resonanzfrequenz) bestimmt

[amp_max,ind] = max(amp_x(:));
[m,z] = ind2sub(size(amp_x),ind);
freq_res=frequenzen(z);

%Hier müsste jetzt die eigentliche Minimierung der Funktionsparameter
%erfolgen

f=(a_max-amp_max)^2+(fq-freq_res)^2;

end

%Hier wird die Minimierungsfunktion aufgerufen. Als Startwert dienen die
%oben vorgegebenen Werte.
%Die Optimierungsfunktion soll nun eine Lösung möglichst nahe an der angegebenen Amplitude und Frequenz finden

[Amp_max,Fq]=fminsearch(@amplitudengang,[f]);

end
 


Das Skript ist in diesem Zustand nicht lauffähig. Mir ist nicht klar, warum sich Matlab über die input arguments beschwert. Abgesehen davon, ist mir die Bedienung von fminsearch noch nicht vollständig klar, die Minimalbeispiele von Matlab sind hier wenig hilfreich.

Schon mal vielen Dank für die Mühe und das Beseitigen meiner Anfängerfehler Embarassed .

der Matlab-Noob
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.05.2017, 17:18     Titel: Re: Parameter-Optimierung in einer DGL mit fminsearch
  Antworten mit Zitat      
Hallo Matlabnoob_126,

Statt "par" und "frequenzen" an den Aufruf des Integrators anzuhängen, wird seit Matlab 6.5 die Verwendung anonymer Funktionen empfohlen:
Code:

  fcn = @(t, x) Bewegungsgleichung_Elektrostatischer_Aktor(t, x, par, frequenzen);
    [T,X]=ode23(@fcn, [0 350e-3], [0,0]);

"350e-3" is hübscher als "350*1e-3", aber das ist Geschmackssache.

Zitat:
Mir ist nicht klar, warum sich Matlab über die input arguments beschwert.

Dann erkläre doch mal, wie diese Beschwerde konkret aussieht: Poste die vollständige Fehlermeldung. Es ist immer einfach einen Verbesserungsvorschlag zu geben, als das Problem zu erraten. ;-)

Zitat:
Abgesehen davon, ist mir die Bedienung von fminsearch noch nicht vollständig klar, die Minimalbeispiele von Matlab sind hier wenig hilfreich.

Hast Du eine konkrete Frage dazu?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

fminsearch braucht ein Function Handle zu einer Funktion mit einem Input (siehe Beschreibung des Eingabearguments fun in der Doku).

Wenn die Funktion als Input auch feste Parameter benötigt, muss man ein anonymes Function Handle dafür definieren (siehe Beispiel Minimize with Extra Parameters aus der Doku). Ausführlicher wird das hier erklärt:
https://www.mathworks.com/help/opti.....ing-extra-parameters.html

Mir ist nun bei deiner Anwendung nicht klar, welche Parameter fest vorgegeben sind und welche variiert werden sollen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.05.17
Wohnort: ---
Version: R2013b, R2016a
     Beitrag Verfasst am: 10.05.2017, 14:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für diese erste Hilfestellung. Das von dir verlinkte Dokument habe ich schon gelesen. Mal eine ganz dumme Frage: Das im Beispiel angegebene Skript müsste doch so lauffähig sein, oder? Ich wollte das Beispiel mal systematisch durchgehen und habe dieses Matlab-Skript gebaut:
Code:
function y = parameterfun(x,a,b,c)
y=(a-b*x(1)^2+x(1)^4/3)*x(1)^2+x(1)*x(2)+(-c+c*x(2)^2)*x(2)^2;

%Assign parameter values
a=4; b=2.1; c=4;

x0 = [0.5,0.5];

f=@(x)parameterfun(x,a,b,c);

[x,fval]=fminunc(f,x0);
end
 

Beim Ausführen erhalte ich folgende Fehlermeldung, die auch bei meinem eigentlichen Skript auftaucht:
Code:
>> parameterfun
Error using parameterfun (line 2)
Not enough input arguments.

Was mache ich hier falsch? Die Werte werden doch im Skript vorgegeben, ein Ausführen der Funktion müsste also zu dem Ergebnis führen, das in deinem Beispiel genannt wird.

Habe noch nicht die Zeit gefunden, mein eigenes Skript anzupassen. Werde das heute Abend angehen.

Vielen Dank für eure Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.05.2017, 18:11     Titel:
  Antworten mit Zitat      
Hallo,

die Zielfunktion und ihr Aufruf müssen in getrennten Bereichen erfolgen, also z.B.
Code:
function y = parameterfun(x,a,b,c)
y=(a-b*x(1)^2+x(1)^4/3)*x(1)^2+x(1)*x(2)+(-c+c*x(2)^2)*x(2)^2;

%Assign parameter values
a=4; b=2.1; c=4;

als parameterfun.m abspeichern und dann in einem separaten Skript oder im Command Window

Code:
x0 = [0.5,0.5];
f=@(x)parameterfun(x,a,b,c);

[x,fval]=fminunc(f,x0);


Für weitere Unterstützung bitte die Frage beantworten,
Zitat:
welche Parameter fest vorgegeben sind und welche variiert werden sollen.


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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.05.17
Wohnort: ---
Version: R2013b, R2016a
     Beitrag Verfasst am: 11.05.2017, 09:04     Titel:
  Antworten mit Zitat      
Hallo Harald,

komisch, dass die Funktionsdefinition und die Definition der Variablen aus einem Skript heraus funktioniert, aber danke für den Hinweis. Ich möchte die Parameter Spannung und der Abstand d0, also par.U und par.d0. Mir ist klar, dass ich diese beiden Variablen aus par herauststellen und modifizieren muss. Daher habe ich erst mal mit festen Werten gearbeitet, um das Skript auf Fehler zu prüfen.
Also brauche ich jetzt drei Skripte: Eins mit der DGL, eins mit der Definition der Amplitudenfunktion und eins für den Aufruf der Optimierungsfunktion, oder? Aber wie übergebe ich der Optimierungsfunktion die Größen und mache ihr klar, welche fest und welche zu optimieren sind?

vielen Dank

Der Matlab-Noob
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Matlabnoob_126
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.05.17
Wohnort: ---
Version: R2013b, R2016a
     Beitrag Verfasst am: 11.05.2017, 14:57     Titel:
  Antworten mit Zitat      
Hallo,

inzwischen hat mir ein Kommilitone ausgeholfen, der sich mit Matlab sehr gut auskennt. Wir haben das Skript neu strukturiert und er hat mir die Konfiguration von fminsearch und fmincon erläutert. Es waren tatsächlich nur strukturelle Fehler, die das Ausführen verhindert haben.

Sollte sich noch Fragen ergeben, melde ich mich wieder. Vielen Dank für eure Hilfe!

Der Matlab-Noob

P.S.: Wenn ich das Thema schließe, kann es dann später wieder eröffnet werden?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


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

ich habe manchmal nur am späten Nachmittag oder Abend Zeit. Da müssen dann halt andere ran, man selbst muss draufkommen, oder braucht etwas Geduld ;)

Ja, das Thema kannst du (oder jeder andere) wieder öffnen. Für den Moment mache ich es zu.

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.