| 
 | 
  
	
		 | 
		fmincon Funktion bei Leichtbau Träger optimierung | 
		 | 
	 
 
 
| Stud1234 | 
 
  
 
Forum-Newbie
 
 
 | 
 
  | 
Beiträge: 6
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 10.10.20
 | 
  | 
 
 | 
 
  | 
Wohnort: München
 | 
  | 
 
 | 
 
  | 
Version: ---
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 10.10.2020, 15:20    
Titel: fmincon Funktion bei Leichtbau Träger optimierung
 | 
  | 
 
 
|   | 
  | 
           | 
 
 
Hallo Zussamen,
 
 
kann mir jmnd bezüglich fmincon helfen.
 
Bei der Optimierung eines Trägers sollte man die Optimale Werte für die Parameter n,t,a,h,A & Iy.
 
Gegeben sind 2 Bedingungen (im funktion constraint).
 
 
Der Programm zeigt mir den folgenden fehler :
 
'Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.'
 
 
Wäre nett von einer von euch diesbezüglich helfen könnte
 
 
Vielen Dank im Voraus
 
 
%% Gegeben 
 
 
E         = 70120;      %[N/mm^2]
 
Sig_Zul   = 148;        %[N/mm^2] 
 
My        = 5.2*10^5;   %[Nmm]
 
b         = 524;        %[mm]
 
alpha     = 32.4;       %[°]
 
 
%%
 
x0 = [ 1,   1,   1  ];
 
x = fmincon(@Flaeche,x0,[],[],[],[],[],[],constraint);
 
 
fprintf('Sicken Anzahl   n        = %.0f\n',x(3));
 
fprintf('Wanddicke        t         = %.4f\n',x(2));
 
fprintf('Schenkelbreite  a         = %.4f\n',x(1));
 
fprintf('Sickenhöhe       h         = %.4f\n',h);
 
fprintf('Gesamtfläche    A_ges  = %.4f\n',Flaeche);
 
fprintf('Gesamt Iy        Iy        = %.4f\n',Iy_Sicke);
 
 
 
% Flächenträgheitsmomente für eine Hälfte der Sicken Profil
 
        % Eigenanteil = Main
 
        global n t a
 
        h = (b * tand(alpha))/( 2*a );
 
        phi        = atand(h/x(1));
 
        I_Eta      = ( t * ( a^3) ) / 12;
 
        I_Zeta     = ( ( t^3 ) * a ) / 12;
 
        I_Eta_Zeta = 0;
 
        N          = (I_Eta + I_Zeta)/2;
 
        Q          = ((I_Eta + I_Zeta)*cosd(2*phi))/2; 
 
        P          = I_Eta_Zeta*sind(2*phi);
 
        Iy_Main    = 2*( N + Q + P);
 
        %Steineranteil = St
 
        Iy_St      = 0;
 
        % Flächenträgheitsmoment für eine Hälfte der Sicken Profil
 
        Iy         = ( (Iy_Main + Iy_St) * n );
 
        % Gesamte Flächenträgheitsmoment für eine Sicke (Gleichschenklige Dreieck)
 
        Iy_Sicke   = 2*Iy;
 
 
function [Area] = Flaeche(x)
 
 
    global t a n 
 
    a = x(1);
 
    t = x(2);
 
    n = x(3);
 
    Area= 2*(x(1)*x(2)*x(3));
 
    
 
end
 
 
 
function [c,ceq] = constraint(x)
 
 
    function[krit_spann]=Sig_Crit(t,b)
 
        global E 
 
        krit_spann=21.7*E.*(t./b).^2;
 
    end  
 
 
    global My h Iy_Sicke t b Sig_Zul
 
    c(1:3) = ((My.*h)./(2.*Iy_Sicke)) - Sig_Crit(t,b);
 
    c(1:3) = ((My.*h)./(2.*Iy_Sicke)) - Sig_Zul;
 
    ceq(x) = [];
 
    
 
end
 _________________
  Stud
 |   
 | 
 
| 
 | 
 
 
		
		 |  
		
		
		
  
		 | 
		 
		
| Harald | 
 
  
 
Forum-Meister
 
 
 | 
 
  | 
Beiträge: 24.502
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 26.03.09
 | 
  | 
 
 | 
 
  | 
Wohnort: Nähe München
 | 
  | 
 
 | 
 
  | 
Version: ab 2017b
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 10.10.2020, 21:55    
Titel: 
 | 
  | 
 
 
Hallo,
 
 
globale Variablen sollte man vermeiden.
 
 
Deine Constraints hängen derzeit nur insofern von x ab, als du schreibst:
 
ceq(x) = []
 
Da hat das (x) aber nichts verloren. Stattdessen musst du Größen wie h, die von x abhängen, auch wirklich in der constraint-Funktion von x abhängig berechnen, sonst werden sie ja nicht aktualisiert.
 
 
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 ;)
 |   
 | 
 
| 
 | 
 
 
 
| Stud1234 | 
 
Themenstarter
  
  
 
Forum-Newbie
 
 
 | 
 
  | 
Beiträge: 6
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 10.10.20
 | 
  | 
 
 | 
 
  | 
Wohnort: München
 | 
  | 
 
 | 
 
  | 
Version: ---
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 11:18    
Titel: 
 | 
  | 
 
 
Hallo Harald,
 
 
vielen Dank für deine Schnelle antwort. Das hatte ich übersehen.
 
 
Jetzt stoße ich aber auf einen anderen Problem und nämlich bekkome ich eine MEldung das : `'Attempt to execute SCRIPT fmincon as a function:'.
 
 
Vielen Dank im Voraus
 
 
Stud1234
 _________________
  Stud
 |   
 | 
 
| 
 | 
 
 
 
| Harald | 
 
  
 
Forum-Meister
 
 
 | 
 
  | 
Beiträge: 24.502
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 26.03.09
 | 
  | 
 
 | 
 
  | 
Wohnort: Nähe München
 | 
  | 
 
 | 
 
  | 
Version: ab 2017b
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 11:19    
Titel: 
 | 
  | 
 
 
Hallo,
 
 
du hast vermutlich dein eigenes Skript fmincon genannt. Dadurch überlagerst du den Befehl fmincon. Also: dein Skript umbenennen.
 
 
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 ;)
 |   
 | 
 
| 
 | 
 
 
 
| Stud1234 | 
 
Themenstarter
  
  
 
Forum-Newbie
 
 
 | 
 
  | 
Beiträge: 6
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 10.10.20
 | 
  | 
 
 | 
 
  | 
Wohnort: München
 | 
  | 
 
 | 
 
  | 
Version: ---
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 15:35    
Titel: 
 | 
  | 
 
 
|   | 
  | 
           | 
 
 
Hallo Zussamen 
 
 
habe mein Script nochmal umgeschrieben und es funktioniert schon.
 
Iwie habe ich aber trotzdem iwas verpeilt und ich komme nicht drauf :
 
 
Wenn ich den Program laufen lasse kriege ich die Folgende Ergebnisse:
 
 
Sicken Anzahl   n     = 0
 
Wanddicke       t     = 0.0000
 
Schenkelbreite  a     = 0.0000
 
Sickenhöhe      h     = 0.0000
 
Gesamtfläche    A_ges = 0.0000
 
 
Also das macht ja kein sinn!!
 
 
Vllcht habe ich bei der abhängigkeit von x was falsch gemacht , aber es fällt mir iwie nicht ein was mein fehler sein sollte.
 
 
Vielen Dank im Voraus ihr seit ein toller Forum
 
 
%% Gegeben 
 
 
E         = 70120;      %[N/mm^2]
 
Sig_Zul   = 148;        %[N/mm^2] 
 
My        = 5.2*10^5;   %[Nmm]
 
b         = 524;        %[mm]
 
alpha     = 32.4;       %[°]
 
 
%%
 
 
x0    = [ 1,   1,   1  ];
 
Area  = @(x) 2*(x(1)*x(2)*x(3));
 
const = @constraint;                              % Handle der Constraint
 
[x,Area,fval]   = fmincon(Area,x0,[],[],[],[],[],[],const);
 
 
fprintf('Sicken Anzahl   n     = %.0f\n',x(3));
 
fprintf('Wanddicke       t     = %.4f\n',x(2));
 
fprintf('Schenkelbreite  a     = %.4f\n',x(1));
 
fprintf('Sickenhöhe      h     = %.4f\n',x(1)*sin(alpha));
 
fprintf('Gesamtfläche    A_ges = %.4f\n',Area);
 
% fprintf('Gesamt Iy       Iy    = %.4f\n',Iy_Sicke);
 
 
% H = Hilfsvariablen(x);
 
 
function[Iy]=Hilfsvariablen
 
 
    alpha     = 32.4; 
 
    a = b/(2*n*cosd(alpha));
 
    My        = 5.2*10^5;   %[Nmm]
 
    b         = 524;
 
    alpha     = 32.4;  
 
    E         = 70120;      %[N/mm^2]     
 
    h = (b * tand(alpha))/( 2*a );
 
    
 
        % Flächenträgheitsmomente für eine Hälfte der Sicken Profil
 
        % Eigenanteil = Main 
 
        phi        = atand(h/a);
 
        I_Eta      = (t * a^3) / 12;
 
        I_Zeta     = (t^3 * a) / 12;
 
        I_Eta_Zeta = 0;
 
        N          = (I_Eta + I_Zeta)/2;
 
        Q          = ((I_Eta - I_Zeta)*cosd(2*phi))/2; 
 
        P          = I_Eta_Zeta*sind(2*phi);
 
        Iy_Main    = ( N + Q + P);
 
        %Steineranteil = St
 
        Iy_St      = 0;
 
        % Flächenträgheitsmoment für beide Hälfte der Sicken Profil
 
        Iy(x)         = ( (Iy_Main + Iy_St) * n );
 
 
function [c,ceq] = constraint(x)
 
 
   
 
 
    function[krit_spann]=Sig_Crit(t,b)       
 
        E         = 70120;      %[N/mm^2]     
 
        krit_spann=21.7*E.*(t./b).^2;
 
    end  
 
 
 
    Sig_Zul   = 148;        %[N/mm^2] 
 
    % c(1) = Vllcht die Gleichung für bs=b/m;
 
    c(1) = ((My*h)/(2*Iy)) - Sig_Crit(t,b);
 
    c(2) = ((My*h)/(2*Iy)) - Sig_Zul;
 
    ceq(x) = [];
 
    
 
end
 
 
end
 _________________
  Stud
 |   
 | 
 
| 
 | 
 
 
 
| Harald | 
 
  
 
Forum-Meister
 
 
 | 
 
  | 
Beiträge: 24.502
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 26.03.09
 | 
  | 
 
 | 
 
  | 
Wohnort: Nähe München
 | 
  | 
 
 | 
 
  | 
Version: ab 2017b
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 15:50    
Titel: 
 | 
  | 
 
 
Hallo,
 
 
die angesprochenen Probleme von 10.10, 22:55 bestehen nach wie vor.
 
Insbesondere sind Anweisungen wie 
ceq(x) = []
 immer noch nicht sinnvoll, das muss 
ceq = []
 heißen. Dann fehlt aber die Abhängigkeit von x. Wenn Variablen wie h und Iy_Sicke von x abhängen, dann müssen sie in der constraint-Funktion auch neu berechnet 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 ;)
 |   
 | 
 
| 
 | 
 
 
 
| Stud1234 | 
 
Themenstarter
  
  
 
Forum-Newbie
 
 
 | 
 
  | 
Beiträge: 6
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 10.10.20
 | 
  | 
 
 | 
 
  | 
Wohnort: München
 | 
  | 
 
 | 
 
  | 
Version: ---
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 16:58    
Titel: 
 | 
  | 
 
 
|   | 
  | 
           | 
 
 
Hallo Harald,
 
 
klasse das hat funktioniert bin fast am Lösung.
 
 
Ich bekomme jetzt : 
 
 
Sicken Anzahl   n     = 7
 
Wanddicke       t     = 1.5000
 
Schenkelbreite  a     = 200.0000
 
Sickenhöhe      h     = 166.5519
 
Gesamtfläche    A_ges = 4154.6219
 
 
Jedoch kann man leicht merken das bei t und a wird die kleinste grenze genommen (ja ich habe grenzen zu der lösung gesetzt).
 
 
Weisst du vllcht woran das liegen könnte ?
 
 
Höchst wahrscheinlich funktioniert meine constraint nicht einwandfrei und die variablen t und a werden gar nicht auf die bedingungen im constraint  überprüft.
 
 
Vielen Dank nochmal im voraus 
 
 
%%
 
 
x0    = [50   0.1  2 ];
 
lb    = [50   0.1  2 ];
 
ub    = [200  1.5  16];
 
const = @constraint;
 
[x]   = fmincon(@objective,x0,[],[],[],[],lb,ub,const);
 
 
AreaOpt = A(x);
 
 
 
 
fprintf('Sicken Anzahl   n     = %.0f\n',x(3));
 
fprintf('Wanddicke       t     = %.4f\n',x(2));
 
fprintf('Schenkelbreite  a     = %.4f\n',x(1));
 
fprintf('Sickenhöhe      h     = %.4f\n',x(1)*sin(alpha));
 
fprintf('Gesamtfläche    A_ges = %.4f\n',AreaOpt);
 
% fprintf('Gesamt Iy       Iy    = %.4f\n',Iy);
 
 
 
function Area = A(x)
 
 
  Area = 2*(x(1)*x(2)*x(3));
 
 
end
 
 
function obj = objective(x)
 
 
    obj = -A(x);
 
end
 
   
 
 
function [c,ceq] = constraint(x)
 
        
 
        My        = 5.2*10^5;  
 
        alpha     = 32.4; 
 
        b         = 524;
 
        E         = 70120;      %[N/mm^2]  
 
        x(1) = b/(2*x(3)*cosd(alpha));           
 
        h    = (b * tand(alpha))/( 2*x(1) );
 
    
 
        % Flächenträgheitsmomente für eine Hälfte der Sicken Profil
 
        % Eigenanteil = Main 
 
        phi        = atand(h/x(1));
 
        I_Eta      = (x(2) * x(1)^3) / 12;
 
        I_Zeta     = (x(2)^3 * x(1)) / 12;
 
        I_Eta_Zeta = 0;
 
        N          = (I_Eta + I_Zeta)/2;
 
        Q          = ((I_Eta - I_Zeta)*cosd(2*phi))/2; 
 
        P          = I_Eta_Zeta*sind(2*phi);
 
        Iy_Main    = ( N + Q + P);
 
        %Steineranteil = St
 
        Iy_St      = 0;
 
        % Flächenträgheitsmoment für beide Hälfte der Sicken Profil
 
        Iy         = ( (Iy_Main + Iy_St) * x(3) );
 
   
 
    function[krit_spann]=Sig_Crit(x) 
 
        
 
        E           =  70120;      %[N/mm^2]     
 
        krit_spann  =  21.7*E.*(x(2)./b).^2;
 
    end  
 
 
    Sig_Zul   = 148;            %[N/mm^2] 
 
    c(1) = ((My*h)/(2*Iy)) - Sig_Crit(x);
 
    c(2) = ((My*h)/(2*Iy)) - Sig_Zul;
 
    ceq = [];
 
    
 
end
 _________________
  Stud
 |   
 | 
 
| 
 | 
 
 
 
| Harald | 
 
  
 
Forum-Meister
 
 
 | 
 
  | 
Beiträge: 24.502
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 26.03.09
 | 
  | 
 
 | 
 
  | 
Wohnort: Nähe München
 | 
  | 
 
 | 
 
  | 
Version: ab 2017b
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 17:43    
Titel: 
 | 
  | 
 
 
Hallo,
 
 
jetzt sieht das besser aus. Was mich noch irritiert:
 
c(1) und c(2) sind die gleichen Ungleichungen, nur mit unterschiedlichem Schwellwert. Warum fasst du das nicht zu einer zusammen und nutzt das Minimum als Schwellwert?
 
 
Dass die kleinsten Werte genommen werden, kann daran liegen, dass sie ein (lokales) Minimum sind. Du kannst mal die Startwerte x0 ändern und schauen, ob das Ergebnis gleich bleibt.
 
 
Grüße,
 
Harald
 
 
P.S.: bitte die Code-Umgebung verwenden.
 _________________
  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 ;)
 |   
 | 
 
| 
 | 
 
 
 
| Stud1234 | 
 
Themenstarter
  
  
 
Forum-Newbie
 
 
 | 
 
  | 
Beiträge: 6
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 10.10.20
 | 
  | 
 
 | 
 
  | 
Wohnort: München
 | 
  | 
 
 | 
 
  | 
Version: ---
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 17:54    
Titel: 
 | 
  | 
 
 
Hallo Harald,
 
 
ich denke ich muss 2 Ungleichungen haben, weil die sinf halt 2 versciedene Kriterien und man kann die nicht zussamenfassen (nämlich : Festigkeitskriterium und Beulenkriterium).
 
Also in einen kann ich die nicht zussamenfassen.
 
 
Ich habe probiert den startwert zu ändern, jedoch bleiben die Ergebnisse bei (a) & (n) nicht gleich (höchstwahrscheinlich habe ich für diese 2 grössen unkorrekte beziehungen gestellt). Die grosse (t) ändert sich nicht bei eine änderung der x0 (es sieht so aus das für t habe ich die richtige beziehungen gestellt).
 
 
Es wird schwierig den fehler zu erkennen. Aber zumindest habe ich schonmal was.
 
 
Sollte dir schonmal was auffällige zu meine beziehungen für a und t auffallen, wäre es mega nice.
 
 
Gruß und Danke
 
 
Stud1234
 _________________
  Stud
 |   
 | 
 
| 
 | 
 
 
 
| Stud1234 | 
 
Themenstarter
  
  
 
Forum-Newbie
 
 
 | 
 
  | 
Beiträge: 6
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 10.10.20
 | 
  | 
 
 | 
 
  | 
Wohnort: München
 | 
  | 
 
 | 
 
  | 
Version: ---
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 20:23    
Titel: Re: fmincon Funktion bei Leichtbau Träger optimierung
 | 
  | 
 
 
 | 
 
| 
 | 
 
 
 
| Harald | 
 
  
 
Forum-Meister
 
 
 | 
 
  | 
Beiträge: 24.502
 | 
  | 
 
 | 
 
  | 
Anmeldedatum: 26.03.09
 | 
  | 
 
 | 
 
  | 
Wohnort: Nähe München
 | 
  | 
 
 | 
 
  | 
Version: ab 2017b
 | 
  | 
 
 | 
 
 
 | 
 
  | 
 
  | 
      
Verfasst am: 11.10.2020, 21:38    
Titel: 
 | 
  | 
 
 
Hallo,
 
 
 
	  | Zitat: | 
	 
	
	  ich denke ich muss 2 Ungleichungen haben, weil die sinf halt 2 versciedene Kriterien und man kann die nicht zussamenfassen (nämlich : Festigkeitskriterium und Beulenkriterium).
 
Also in einen kann ich die nicht zussamenfassen. | 
	 
 
 
Doch. Ich habe zwar keine Ahnung von deiner Anwendung, aber von Mathematik.
 
a-b <= 0 und a-c <= 0 ist genau dann erfüllt, wenn a - min(b,c) <= 0
 
Wenn sich das nicht so umschreiben lässt, dann hast du noch einen ganz anderen Fehler drin.
 
 
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 ;)
 |   
 | 
 
| 
 | 
 
 
 
 
 
  
 | 
  
 | 
 
| 
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 
 | 
 
 
 
 |  
 
 
  Impressum
 | Nutzungsbedingungen
 | Datenschutz
 | FAQ
 |   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.
  
 
 | 
 
 
		 |