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

Fehlermeldung bei fminsearch

 

Flitzi123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2018, 14:30     Titel: Fehlermeldung bei fminsearch
  Antworten mit Zitat      
Hallo,

ich bin ein Matlab-Neuling und habe ein Skript, das ich mit "fminsearch" optimieren soll. Allerdings bekomme ich jedes Mal folgende Fehlermeldung:

Assignment has more non-singleton rhs dimensions than non-singleton subscripts

Error in fminsearch (line 200)
fv(:,1) = funfcn(x,varargin{:});

Error in kEinsetzen (line 106)
x = fminsearch(AcD,x0,options);

Der Code ist angehängt. Kann mir vielleicht jeamnd helfen? Das wäre sehr nett!

Code:

%Definition der Vektrogröße, damit Dimensionen immer gleich sind
vector_groesse = 100;

%Definition von Lambda, hier 0,4 bis 1 Mikrometer
%für Spektralbereich 0.5 bis 0.7 Mikrometer hier die Werte ändern
lambda_start = .4;
lambda_end = 1;
lx = (lambda_end - lambda_start) / (vector_groesse - 1);
lambda = lambda_start:lx:lambda_end;

%Definition von Phi, hier 0° bis 180°
phi1_start = 0;
phi1_end = 180;
px = (phi1_end - phi1_start) / (vector_groesse - 1);
phi1 = phi1_start:px:phi1_end;

%Definition von d, hier 0 bis 500 Mikrometer
d1_start = 0;
d1_end = 500;
dx = (d1_end - d1_start) / (vector_groesse - 1);
d1 = d1_start:dx:d1_end;

%Definition der ordentlichen und der ausßerordentlichen Brechzahl
n_o = sqrt(1+(0.663044.*lambda.^2)./(lambda.^2-0.0600^2)+(0.517852.*...
    lambda.^2)./(lambda.^2-0.1060^2)+(0.175912*lambda.^2)./(lambda.^2-...
    0.1190^2)+(0.565380*lambda.^2)./(lambda.^2-8.844^2)+(1.675299*...
    lambda.^2)./(lambda.^2-20.742^2));

n_e = sqrt(1+((0.665721*lambda.^2)./(lambda.^2-0.0600.^2)+(0.503511.*...
    lambda.^2)./(lambda.^2-0.1060.^2)+(0.214792*lambda.^2)./(lambda.^2-...
    0.1190.^2)+(0.539173*lambda.^2)./(lambda.^2-8.792.^2)+(1.8076613*...
    lambda.^2)./(lambda.^2-19.70.^2)));

%Berechnung Brechzahldifferenz
delta_n = n_e - n_o;

d_1 = 15.7;
d_2 = 31.2;
phi_1 = 0;
phi_2 = 54.1;

%Berechnung Delta = Verögerung
delta1 = ((2.*pi.*delta_n)./lambda).*d_1;
delta2 = ((2.*pi.*delta_n)./lambda).*d_2;

%Definition der Matrixelemente der Wellenplatte
c11 = cos(delta1./2)+1i.*sin(delta1/2).*cos(2.*phi_1);
c21 = 1i.*sin(delta1./2).*sin(2.*phi_1);
c31 = 1i.*sin(delta1./2).*sin(2.*phi_1);
c41 = cos(delta1./2)-1i.*sin(delta1./2).*cos(2.*phi_1);

c12 = cos(delta2./2)+1i.*sin(delta2/2).*cos(2.*phi_2);
c22 = 1i.*sin(delta2./2).*sin(2.*phi_2);
c32 = 1i.*sin(delta2./2).*sin(2.*phi_2);
c42 = cos(delta2./2)-1i.*sin(delta2./2).*cos(2.*phi_2);

%Zusammensetzen der Wellenplattenmatrix
C1 = [c11 c21; c31 c41];
C2 = [c12 c22; c32 c42];

%Definition der Elemente der Produktmatrix, Matrixelemente rückwärts
%multiplizieren
A = c12 .* c11' + c22 .* c21';
B = c12 .* c31' + c22 .* c41';
B_conj = -conj(B);
A_conj = conj(A);

%Zusammensetzen der Produktmatrix
M = [A B; B_conj A_conj];

%Berechnung der Verzögerung des Systems
Delta_matrix = 2 * atan(sqrt((imag(A)^2 + imag(B)^2)./(real(A)^2 + real(B)^2)));
Delta = Delta_matrix(:);
%Definition von Delta_0
Delta_0 = pi / 2;

%Definition der Funktionen des Integrals
fun1 = @(x) (abs(Delta - Delta_0).^2)*x;
fun2 = @(x) x;

%Definition der Funktion "achromatism degree"
%beschreibt den Unterschied zwischen der Systemverzögerung Delta und
%der Zielfunktion Delta_0, bezogen auf das Spektrum Lambda
AcD = @(x)(sqrt(integral(fun1,lambda_start,lambda_end,'ArrayValued',true)))...
    / (sqrt(integral(fun2,lambda_start,lambda_end,'ArrayValued',true)));

% AcD_min = min(AcD(:));
% AcD_grad = AcD_min * 180 / pi;
%
% f_N = max(Delta(:)) - min(Delta(:));

lambda_start = .4;
lambda_end = 1;
lx2 = (lambda_end - lambda_start) / (vector_groesse*100 - 1);
lambda2 = lambda_start:lx2:lambda_end;

plot(lambda2,Delta)

options = optimset('PlotFcns',@optimplotfval);
x0 = [rand,rand];
x = fminsearch(AcD,x0,options);
 


Harald
Forum-Meister

Forum-Meister


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

was ist das Ergebnis von AcD? Ich vermute mal ein Array. Für fminsearch muss es aber ein Skalar sein - denn was soll denn sonst optimiert werden?

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
 
Flitzi123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2018, 14:09     Titel:
  Antworten mit Zitat      
Ich weiß es ehrlich gesagt nicht mehr so genau und das Skript ist auch veraltet.
Insgesamt funktioniert jetzt der Rest von dem, was ich erreichen muss und habe mal ein absolut vereinfachtes Besipiel zu fminsearch, das auch nicht funktioniert. Vielleicht ist es da leichter mir zu helfen:

Code:

a = 1:1000;
b = 2:1001;
f = @(x)(abs(a-b).^2.*x);

x0 = [1,1];
[x,fval] = fminsearch(f,x0,[]);
 


Ich habe auch versucht für a und b nur Zahlenwerte als Start vorzugeben, aber beides funktioniert nicht.
Bei der dargestellten Variante bekomme ich als Fehler, dass die Matrixdimensionen nicht übereinstimmen. Aber wenn ich fminsearch auskommentiere, bekomme ich den Fehler nicht, also ist er nicht im f.
Wenn ich nur Zahlen eingebe bekomme ich folgenden Fehler:
Assignment has more non-singleton rhs dimensions than non-singleton subscripts
 
Harald
Forum-Meister

Forum-Meister


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

wie gesagt: die Zielfunktion muss einen einzigen Wert zurückgeben.

Deine Funktion lässt sich nicht mal für den Startwert ausführen:
Code:
f(x0)
Matrix dimensions must agree.
Error in @(x)(abs(a-b).^2.*x)


Wenn du Skalare a und b verwendest, dann gibt die Funktion immer noch einen Vektor zurück, und das ist von fminsearch eben nicht unterstützt:
Code:
a = 1;
b = 2;
f = @(x)(abs(a-b).^2.*x);
size(f(x0))
ans =
     1     2


Was soll denn mit diesem zwei-elementigen Vektor gemacht werden?

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.