Verfasst am: 09.05.2017, 14:30
Titel: Parameter-Optimierung in einer DGL mit fminsearch
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;
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,[0350*1e-3],[0,0],[],par,freqenzen); % DGL lösen
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
%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
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 .
"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.
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.
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;
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.
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?
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?
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
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.