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

Genetic Algorithm->Index exceeds the number of array elem

 

D_Filipovic
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 06.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2019, 16:54     Titel: Genetic Algorithm->Index exceeds the number of array elem
  Antworten mit Zitat      
Ich möchte eine Funktion mit meinem Genetischen Algorithmus Optimieren. Problem hierbei habe ich aber irgendetwas falsch gemacht.

Die Funktion welche ich mit meinem GA optimieren möchte sieht wie folgt aus:

Code:
% Das ist meine Funktion.

function [mu_x_cartesian,mu_y_cartesian,mu_z_cartesian] = cartesian_ga_function(x,y,z)

u_distance_abs = 0.000005; % [muem]
u_distance_rel = 0.000005; % [muem]
u_azimuth = 0.000005; % [muem]
u_elevation = 0.000005; % [muem]

fhi= atan(y ./x);

theta = acos(z ./sqrt(x.^2+y.^2+z.^2));
distance_r = sqrt(x.^2+y.^2+z.^2);
u2_distance =  u_distance_abs + u_distance_rel * distance_r;

mu_x_cartesian = sqrt(u2_distance.^2 .*cos(fhi).^2 .*cos(theta).^2 + u_elevation.^2 .* distance_r.^2 .* cos(fhi).^2 .* sin(theta).^2 + u_azimuth.^2 .* distance_r.^2 .* sin(fhi).^2 .* cos(theta).^2);
mu_y_cartesian = sqrt(u2_distance.^2 .*cos(fhi).^2 .*sin(theta).^2 + u_elevation.^2 .* distance_r.^2 .* cos(fhi).^2 .* cos(theta).^2 + u_azimuth.^2 .* distance_r.^2 .* sin(fhi).^2 .* sin(theta).^2);
mu_z_cartesian = sqrt(u2_distance.^2 .*sin(fhi).^2 +  u_azimuth.^2 .* distance_r.^2 .* cos(fhi).^2);
mu_abs_cartesian = sqrt(mu_x_cartesian.^2 + mu_y_cartesian.^2 + mu_z_cartesian.^2);

end
 



Mein Genetischer Algorithmus sieht wie folgt aus:
Code:

x = 1:60;
y = 1:60;
z = 1:60;


fun = @(x,y,z)cartesian_ga_function([x(1:60),y(1:60),z(1:60)])
nvars = 3;
[optimum] = ga(fun,nvars)


Hierbei möchte ich, dass der ideale Wert bei einem Kartesischen Koordiantensystem bei 60x60x60 gefunden wird.

Die Fehler die mir angezeigt werden lauten:

Index exceeds the number of array elements (3).

Error in test_cartesian>@(x,y,z)cartesian_ga_function([x(1:60),y(1:60),z(1:60)])

Error in createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
fcn_handle = @(x) fcn(x,FcnArgs{:});

Error in makeState (line 47)
firstMemberScore = FitnessFcn(state.Population(initScoreProvided+1,: ));

Error in gaunc (line 40)
state = makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);

Error in ga (line 398)
[x,fval,exitFlag,output,population,scores] = gaunc(FitnessFcn,nvars, ...

Error in test_cartesian (line 65)
[optimum] = ga(fun,nvars)

Caused by:
Failure in initial user-supplied fitness function evaluation. GA cannot continue.


Bin für jede Hilfe offen.
Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

für ga muss die Fitnessfunktion ein Input- und ein Outputargument haben. Bei dir sind es stattdessen jeweils drei. Zudem muss der Output eine Zahl sein, woran ich auch Zweifel habe.
Was willst du denn optimieren? Das wird für mich nicht klar.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
D_Filipovic
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 06.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2019, 19:08     Titel:
  Antworten mit Zitat      
Hallo,

Es gibt ein Messunsicherheitsmodell mit dem ich arbeiten muss. Ich soll den besten Wert finden. Den Wert mit der geringsten Abweichung soll mir zurückgegeben werden


Code:
% Das ist meine Funktion

function [mu_x_cartesian,mu_y_cartesian,mu_z_cartesian,mu_abs_cartesian] = cartesian_ga_function(x,y,z)
%[hier stehen die Rückgabewerte] = hier_ist_der_funktionsname (hier sind die eingabeparameter)

u_distance_abs = 0.000005; % [muem] Hier sind nur statische Werte
u_distance_rel = 0.000005; % [muem]
u_azimuth = 0.000005; % [muem]
u_elevation = 0.000005; % [muem]

fhi= atan(y ./x);
% Die Funktion muss ich umrechnen, weil der Algorithmus nur in kartesichen Koordinaten rechnen kann

theta = acos(z ./sqrt(x.^2+y.^2+z.^2));
% Die Funktion muss ich umrechnen, weil der Algorithmus nur in kartesichen Koordinaten rechnen kann
distance_r = sqrt(x.^2+y.^2+z.^2);
% Die Funktion muss ich umrechnen, weil der Algorithmus nur in kartesichen Koordinaten rechnen kann

u2_distance =  u_distance_abs + u_distance_rel * distance_r;

mu_x_cartesian = sqrt(u2_distance.^2 .*cos(fhi).^2 .*cos(theta).^2 + u_elevation.^2 .* distance_r.^2 .* cos(fhi).^2 .* sin(theta).^2 + u_azimuth.^2 .* distance_r.^2 .* sin(fhi).^2 .* cos(theta).^2);
mu_y_cartesian = sqrt(u2_distance.^2 .*cos(fhi).^2 .*sin(theta).^2 + u_elevation.^2 .* distance_r.^2 .* cos(fhi).^2 .* cos(theta).^2 + u_azimuth.^2 .* distance_r.^2 .* sin(fhi).^2 .* sin(theta).^2);
mu_z_cartesian = sqrt(u2_distance.^2 .*sin(fhi).^2 +  u_azimuth.^2 .* distance_r.^2 .* cos(fhi).^2);
mu_abs_cartesian = sqrt(mu_x_cartesian.^2 + mu_y_cartesian.^2 + mu_z_cartesian.^2);

% Mu_x -> Mu_z soll die Messunsicherheit berechnen

end

% Hier endet die Funktion. Diese Funktion soll im GA optimiert werden

% Hier gebe ich den Optimierungsbereich an. Jeder Wert von 1 bis 60 soll in allen Richtungen überprüft werden
x = 1:60;  
y = 1:60;
z = 1:60;

% das @ Zeichen bedeutet nach dieser Funktion soll der GA optimieren.
% als erstes gebe ich (x,y,z) ein um zu sagen gib die Werte ein
% wenn ich beispielsweise nur einen Wert eingebe bekomme ich Werte raus (welche aber falsch sind)
fun = @(x,y,z)cartesian_ga_function(10,10,10)
nvars = 4;
[optimum] = ga(fun,nvars)

% Wenn ich das ganze normal mit einem Array mache bekomme ich die richtigen Werte raus, nur halt ohne automatische Optimierung
[a,b,c,d]=cartesian_ga_function(1:60,1:60,1:60);


 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.12.2019, 19:21     Titel:
  Antworten mit Zitat      
Hallo,

wie gesagt:
Zitat:
für ga muss die Fitnessfunktion ein Input- und ein Outputargument haben. Bei dir sind es stattdessen jeweils drei.

Solange du das nicht änderst, wird der Code nicht laufen.

Was sollen x, y, z denn sein? Vektoren oder nur Zahlen?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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 - 2024 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.