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

fmincon Funktion bei Leichtbau Träger optimierung

 

Stud1234
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.10.20
Wohnort: München
Version: ---
     Beitrag Verfasst am: 10.10.2020, 16:20     Titel: fmincon Funktion bei Leichtbau Träger optimierung
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.10.2020, 22:55     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Stud1234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.10.20
Wohnort: München
Version: ---
     Beitrag Verfasst am: 11.10.2020, 12:18     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.10.2020, 12:19     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Stud1234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.10.20
Wohnort: München
Version: ---
     Beitrag Verfasst am: 11.10.2020, 16:35     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.10.2020, 16:50     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Stud1234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.10.20
Wohnort: München
Version: ---
     Beitrag Verfasst am: 11.10.2020, 17:58     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.10.2020, 18:43     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Stud1234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.10.20
Wohnort: München
Version: ---
     Beitrag Verfasst am: 11.10.2020, 18:54     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Stud1234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.10.20
Wohnort: München
Version: ---
     Beitrag Verfasst am: 11.10.2020, 21:23     Titel: Re: fmincon Funktion bei Leichtbau Träger optimierung
  Antworten mit Zitat      

_________________

Stud
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.10.2020, 22:38     Titel:
  Antworten mit Zitat      
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 ;)
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.