|
|
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.495
|
|
|
|
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.495
|
|
|
|
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.495
|
|
|
|
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.495
|
|
|
|
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.495
|
|
|
|
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.
|
|