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

Anwendung von Simulated Annealing

 

stinkstiefel
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2017, 11:19     Titel: Anwendung von Simulated Annealing
  Antworten mit Zitat      
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)

alphaL =[-13/180*pi,25/180*pi,8/180*pi];
betaR = [25/180*pi,-13/180*pi,8/180*pi];

zW = 510
xL = 3238.9
yL = -282.45
zL = 274.29
xR = 3237.86
yR = 284.55
zR = 274.31
d = 135

xW = linspace(-1000,4000,100000)
a = linspace(0,300,10000)
b = linspace(0,200,10000)
phi = linspace(-100,100,10000)
betaL = linspace(-100,100,10000)

optimization = abs(sqrt((xW-xL-b*cos(betaL(1))).^2+(yL+a-d*cos(alphaL(1))).^2+(zL-zW+d*sin(alphaL(1))-b*sin(betaL(1))).^2)-sqrt((xW-xR+b*cos(betaL(1)+phi)).^2+(a-yR-d*cos(betaR(1))).^2+(zW-zR+b*sin(betaL(1)+phi)-d*sin(betaR(1))).^2))+abs(sqrt((xW-xL-b*cos(betaL(2))).^2+(yL+a-d*cos(alphaL(2))).^2+(zL-zW+d*sin(alphaL(2))-b*sin(betaL(2))).^2)-sqrt((xW-xR+b*cos(betaL(2)+phi)).^2+(a-yR-d*cos(betaR(2))).^2+(zW-zR+b*sin(betaL(2)+phi)-d*sin(betaR(2))).^2))+abs(sqrt((xW-xL-b*cos(betaL(3))).^2+(yL+a-d*cos(alphaL(3))).^2+(zL-zW+d*sin(alphaL(3))-b*sin(betaL(3))).^2)-sqrt((xW-xR+b*cos(betaL(3)+phi)).^2+(a-yR-d*cos(betaR(3))).^2+(zW-zR+b*sin(betaL(3)+phi)-d*sin(betaR(3))).^2));
 



und dann an die simulated annealing methode übergeben


Test.m

Code:
alphaL =[-13/180*pi,25/180*pi,8/180*pi];
betaR = [25/180*pi,-13/180*pi,8/180*pi];
zW = 510
xL = 3238.9
yL = -282.45
zL = 274.29
xR = 3237.86
yR = 284.55
zR = 274.31
d = 135;

xW = linspace(-1000,4000,100000)
a = linspace(0,300,10000)
b = linspace(0,200,10000)
phi = linspace(-100,100,10000)
betaL = [linspace(-100,100,10000),linspace(-100,100,10000),linspace(-100,100,10000)]

ObjectiveFunction = @f;

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=[3270 130 72 155/180*pi [218.11/180*pi 145.74/180*pi 8/180*pi]]

[L,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,L0)
 



jetzt hab ich allerdings offenbar an mehreren stellen fehler gemacht. in f.m kommt die meldung

Error using -
Matrix dimensions must agree.

Error in f (line 21)
optimization =
abs(sqrt((xW-xL-b*cos(betaL(1))).^2+ usw.

ich kann aber kein minus finden, das da nicht hingehört und im hauptprogramm kommt die obige fehlermeldung und zusätzlich

Error in samakedata (line 20)
solverData.currentfval = problem.objective(reshapeinput(problem.x0,solverData.currentx));

Error in simulannealcommon (line 118)
solverData = samakedata(solverData,problem,options);

Error in simulanneal (line 44)
simulannealcommon(FUN,x0,Aineq, bineq, Aeq, beq, lb, ub,options,defaultopt);

Error in simulannealbnd (line 137)
[x, fval, exitflag, output] = simulanneal(FUN, x0, [], [], [], [], lb, ub, options);

Error in Test (line 26)
[L,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,L0)

Caused by:
Failure in initial user-supplied objective function evaluation.


kann mir jemand sagen, was ich falsch gemacht habe?

gruß stinkstiefel
Private Nachricht senden Benutzer-Profile anzeigen


AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 03.05.2017, 13:34     Titel:
  Antworten mit Zitat      
Hallo,

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.


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
stinkstiefel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2017, 14:11     Titel:
  Antworten mit Zitat      
aber das betrifft doch nur den wertebereich? oder meinst du die unterschiedliche schrittweite könnte Probleme machen?
Private Nachricht senden Benutzer-Profile anzeigen
 
stinkstiefel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2017, 14:16     Titel:
  Antworten mit Zitat      
interessant. wenn ich die Schrittweite für xW ebenfalls auf 10000 setze, bekomme ich als fehler stattdessen

Error using *
Inner matrix dimensions must agree.

Error in optimization (line 21)
optimization =
abs(sqrt((xW-xL-b*cos(betaL(1))).^2+(yL+a-d*cos(alphaL(1))).^2+(zL-zW+d*sin(alphaL(1))-b*sin(betaL(1))).^2)-sqrt((xW-xR+b*cos(betaL(1)+phi)).^2+(a-yR-d*cos(betaR(1))).^2+(zW-zR+b*sin(betaL(1)+phi)-d*sin(betaR(1))).^2))
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 03.05.2017, 14:27     Titel:
  Antworten mit Zitat      
Hi,

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.

Gruß
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: 03.05.2017, 14:32     Titel:
  Antworten mit Zitat      
Hallo,

... und zur neuen Fehlermeldung: * ist Matrixmultiplikation. Wahrscheinlich möchtest du elementweise Multiplikation, also .*

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2017, 14:54     Titel:
  Antworten mit Zitat      
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);

Error in simulanneal (line 44)
simulannealcommon(FUN,x0,Aineq, bineq, Aeq, beq, lb, ub,options,defaultopt);

Error in simulannealbnd (line 137)
[x, fval, exitflag, output] = simulanneal(FUN, x0, [], [], [], [], lb, ub, options);

Error in Test (line 26)
[L,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,L0)
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: 03.05.2017, 15:24     Titel:
  Antworten mit Zitat      
Hallo,

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 .

Wenn ich mir die Doku ansehe, wird übrigens generell dazu geraten, zunächst andere Solver zu versuchen. Die Syntax-Herausforderungen werden aber die gleichen bleiben.
https://www.mathworks.com/help/gads.....osing-another-solver.html

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2017, 15:54     Titel:
  Antworten mit Zitat      
hallo,

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?

gruß
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: 03.05.2017, 19:22     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ich möchte nicht alle komponenten auf 0 bringen, nur die funktionswerte

Ich meinte die Komponenten der Funktion.

Zitat:
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...).

Die Idee ist gut, allerdings musst du sie genau umgekehrt anwenden: in der Funktion musst du xW etc. aus dem Vektor extrahieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 08:35     Titel:
  Antworten mit Zitat      
also in der Form?

Code:

L=[linspace(-1000,4000,10000),linspace(-1000,4000,10000),linspace(-1000,4000,10000),linspace(-1000,4000,10000),[linspace(-1000,4000,10000),linspace(-1000,4000,10000),linspace(-1000,4000,10000)]]

xW = L(1)
a = L(2)
b = L(3)
phi = L(4)
betaL = L(5)
 


kann Matlab eigentlich Vektoren in Vektoren oder muss ich die Werte einzeln schreiben(betaL1,betaL2,betaL3 statt betaL(1:3))?
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: 04.05.2017, 09:48     Titel:
  Antworten mit Zitat      
Hallo,

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 :)

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 10:02     Titel:
  Antworten mit Zitat      
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
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: 04.05.2017, 10:23     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 03.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 14:30     Titel:
  Antworten mit Zitat      
also jetzt läuft das ganze schonmal, nur das Ergebnis haut noch nicht hin

Test.m

Code:

ObjectiveFunction = @f;
         
L0=[3270 130 72 155/180*pi 218.11/180*pi 145.74/180*pi 8/180*pi]

[L,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,L0)
 



f.m

Code:

function optimization = f(L,alphaL,betaR,zW,xL,yL,zL,xR,yR,zR,d)

alphaL =[-13/180*pi,25/180*pi,8/180*pi];
betaR = [25/180*pi,-13/180*pi,8/180*pi];

zW = 510;
xL = 3238.9;
yL = -282.45;
zL = 274.29;
xR = 3237.86;
yR = 284.55;
zR = 274.31;
d = 135;

L0=[3270 130 72 155/180*pi 218.11/180*pi 145.74/180*pi 8/180*pi];
L=L0;

%xW = L(1)
%a = L(2)
%b = L(3)
%phi = L(4)
%betaL1 = L(5)
%betaL2 = L(6)
%betaL3 = L(7)

optimization = abs(sqrt((L(1)-xL-L(3).*cos(L(5))).^2+(yL+L(2)-d.*cos(alphaL(1))).^2+(zL-zW+d.*sin(alphaL(1))-L(3).*sin(L(5))).^2)-sqrt((L(1)-xR+L(3).*cos(L(5)+L(4))).^2+(L(2)-yR-d.*cos(betaR(1))).^2+(zW-zR+L(3).*sin(L(5)+L(4))-d.*sin(betaR(1))).^2))
+abs(sqrt((L(1)-xL-L(3).*cos(L(6))).^2+(yL+L(2)-d.*cos(alphaL(2))).^2+(zL-zW+d.*sin(alphaL(2))-L(3).*sin(L(6))).^2)-sqrt((L(1)-xR+L(3).*cos(L(6)+L(4))).^2+(L(2)-yR-d.*cos(betaR(2))).^2+(zW-zR+L(3).*sin(L(6)+L(4))-d.*sin(betaR(2))).^2))
+abs(sqrt((L(1)-xL-L(3).*cos(L(7))).^2+(yL+L(2)-d.*cos(alphaL(3))).^2+(zL-zW+d.*sin(alphaL(3))-L(3).*sin(L(7))).^2)-sqrt((L(1)-xR+L(3).*cos(L(7)+L(4))).^2+(L(2)-yR-d.*cos(betaR(3))).^2+(zW-zR+L(3).*sin(L(7)+L(4))-d.*sin(betaR(3))).^2));
 


er scheint zwar immer neue Sachen zu rechnen, aber tatsächlich ändern sich die werte kein bisschen. der Output ist immer

Code:

optimization =

   17.0193


ans =

    4.8276
 


und das endgültige Ergebnis entsprechend

Code:

Optimization terminated: change in best function value less than options.FunctionTolerance.

L =

   1.0e+03 *

    3.2700    0.1300    0.0720    0.0027    0.0038    0.0025    0.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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.