Verfasst am: 03.05.2017, 11:19
Titel: Anwendung von Simulated Annealing
hallo zusammen,
ich möchte ein mechanisches getriebe dahingehend optimieren, dass es bestimmte geometrische vorraussetzungen erfüllt, konkret sollen die abmaße xW,a,b,phi und betaL(1:3) so geändert werden, dass die untenstehende funktion optimization gegen 0 geht. dafür wurde mir simulated annealing empfohlen, allerdings habe ich bisher keine erfahrung mit matlab. zunächst habe ich einmal die funktion definiert
f.m
Code:
function optimization = f(xW,a,b,phi,betaL,alphaL,betaR,zW,xL,yL,zL,xR,yR,zR,d)
L=[linspace(-1000,4000,100000),linspace(0,300,10000),linspace(0,200,10000),linspace(-100,100,10000),[linspace(-100,100,10000),linspace(-100,100,10000),linspace(-100,100,10000)]]
L=[xW a b phi betaL]
L0=[327013072155/180*pi[218.11/180*pi145.74/180*pi8/180*pi]]
mir fällt spontant nur auf, dass xW 10 mal größer ist als die anderen Vektoren. Wenn du versuchst die miteinander zu verheiraten, dann klappt das vermutlich nicht.
du konstruierst dort mit linspace mehrere Vektoren und versuchst diese dann in line 21 miteinander zu verrechnen. Wenn die Vektoren unterschiedlich groß sind, führt das natürlich zu Problemen.
Das letzte Argument von linspace ist nicht die Schrittweite, sondern die Anzahl der Elemente. Die Schrittweite ergibt sich dann aus dem angegebenen Wertebereich.
okay, nachdem ich die elementanzahl angeglichen und * durch .* ersetzt habe, funktioniert immerhin schonmal das file f.m mit der funktion, tatsächlich auch unabhängig davon, ob die grenzen des wertebereichs gleich sind oder nicht und auch im hauptprogramm verschwindet die fehlermeldung mit dem operationszeichen.
bleiben noch die meldungen
Error using samakedata (line 29)
Your objective function must return a scalar value.
Error in simulannealcommon (line 118)
solverData = samakedata(solverData,problem,options);
das Function Handle für simulannealbnd sollte ein Eingabeargument entgegennehmen, und das sollte ein Vektor der veränderbaren Größen sein.
In deiner Funktion werden alle Variablen festgelegt, d.h. es wird gar nichts variiert. Das sieht man auch schön daran, dass im Editor alle Eingabeargumente orange hinterlegt sind --> Warnung.
Bei der Fehlermeldung kann man nur raten, wie dir zu helfen ist. Wenn man möglichst alle Komponenten auf 0 bringen möchte, verwendet man häufig die Summe der Quadrate -->
norm
.
ich möchte nicht alle komponenten auf 0 bringen, nur die funktionswerte, die argumente können beliebige werte annehmen. wie kann ich das denn umschreiben, damit die variablen noch variabel bleiben? ich dachte mit linspace lege ich nur einen bereich und nicht mehr fest?
der vektor aller veränderlichen eingangsgrößen ist bei mir L und dem wollte ich jetzt die variablen zuordnen(xW an erste Stelle, a an zweite, usw...). oder geht das nicht und ich muss statt xW,a,b,... L(1),L(2),... schreiben?
ich hatte vergessen, darauf einzugehen: linspace ist im Zusammenhang mit Optimierung nicht sinnvoll. Stattdessen werden Schrankenvektoren lb und ub als zusätzliche Argumente verwendet.
Zitat:
kann Matlab eigentlich Vektoren in Vektoren
MATLAB steht für Matrix Laboratory. Wenn eine Software mit Matrizen (und Vektoren) umgehen kann, dann MATLAB :)
und wie definiere ich dann meine Variablen? mir ging es nicht in erster Linie um die Schranken, sondern darum, überhaupt etwas anzugeben weil sonst eine Fehlermeldung kommt, dass die Variable unbekannt ist
an simulannealbnd übergibst du nur Anfangswerte für die Variablen. Die Variierung übernimmt simulannealbnd.
Die Doku von simulannealbnd ist an der Stelle recht kurz. Da kannst du sich aber auch an der Doku von
fmincon
orientieren: Aufruf ist ähnlich, nur intern wird anders gearbeitet.
Inzwischen dürftest du etliche Änderungen an deinem Code gemacht haben. Poste doch bitte mal den aktuellen Stand.
Optimization terminated: change in best function value less than options.FunctionTolerance.
L =
1.0e+03 *
3.27000.13000.07200.00270.00380.00250.0001
fval =
17.0193
exitFlag =
1
output =
iterations: 3500
funccount: 3627
message: 'Optimization terminated: change in best function value less than options.FunctionTolerance.'
rngstate: [1x1 struct]
problemtype: 'unconstrained'
temperature: [7x1 double]
totaltime: 10.1401
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.