Ich schreibe momentan an einem Algorithmus der iterativ die Parameter (wie Resistanzen und Reaktanzen) einer Asynchronmaschine iterative bestimmen soll. Dazu soll das Drehmoment des Motors in Abhängigkeit von den 5 unbekannten Maschinenparametern iterativ bestimmt werden und mit einem gegeben Wert des Drehmomentes verglichen werden. Stimmen die beiden Drehmomente bis auf eine gewisse Toleranz überein sollen die entsprechenden Werte der Parameter ausgegeben werden.
Das Aufstellen das Algortihmus hat als solches mit 5 verschachtelten for-Schleifen auch wunderbar funktioniert, aber meine Versuche die Rechenzeit zu verringern scheitern leider immer. Die Idee ist die Schrittweite von 0.01 auf 0.05 zu erhöhen, wenn das berechnete Moment sehr stark vom gegebenen Wert des Drehmomentes abweicht, es scheitert leider jedoch daran dass ich keine möglichkeit finde 4 Schleifen auf einmal zu verlassen.
Kann mir hierbei jemand vielleicht bitte helfen?
Danke im Voraus.
Das ist der momentane Code:
Code:
function variableschrittweite ()
UN = input('Bitte Nennspannung angeben:');
IN = input('Bitte Nennstrom angeben:');
fN = input('Bitte Nennfrequenz angeben:');
MN = input('Bitte Nennmoment angeben:');
Eta = input('Bitte Wirkungsgrad angeben:');
PN = input('Bitte Nennleistung angeben:');
p = input('Bitte Polpaarzahl angeben:');
tic
nN = ((60*PN)/(2*pi*MN));
s = (((fN*60)-nN)/(fN*60));
R1 = 0;
R2 = 0;
X1 = 0;
X2 = 0;
Xh = 0;
phi = cos(atan(((X1+(Xh*((R2^2)/(s^2))+(Xh^2)*X2+Xh*(X2^2))/(((R2^2) /(s^2))+(Xh^2)+2*Xh*X2+(X2^2))))/((R1+((Xh^2)*(R2/s))/(((R2^2)/(s^2))+(Xh^2)+2*Xh*X2+(X2^2))))));
MBer = (((sqrt(3))*UN*IN*phi*Eta)/(2*pi*(nN/60)));
for(R1=0:0.01:1) if(MBer < 0.7*MN || MBer > 1.3*MN || isnan(MBer)) for(R2= 0:0.05:1) for(Xh= 0:0.05:((4*UN)/(sqrt(3)*IN))) for(X1= 0.01*((4*UN)/(sqrt(3)*IN)):0.05:0.3*((4*UN)/(sqrt(3)*IN))) for(X2= 0:0.05:1)
phi = cos(atan(((X1+(Xh*((R2^2)/(s^2))+(Xh^2)*X2+Xh*(X2^2))/(((R2^2)/(s^2))+(Xh^2)+2*Xh*X2+(X2^2))))/((R1+((Xh^2)*(R2/s))/(((R2^2)/(s^2))+(Xh^2)+2*Xh*X2+(X2^2))))));
MBer = (((sqrt(3))*UN*IN*phi*Eta)/(2*pi*(nN/60)));
if(MBer >=0.7*MN && MBer <=1.3*MN)
%%Verlasse die vier Schleifen
end if(MBer >=MN*0.95 && MBer <=MN*1.05 && Xh>X1 && Xh>X2 && Xh >R1 && Xh>R2) fprintf('Die Parameter der Maschine lauten: \n Mber=%10.8g \n R1=%3.2g \n R2=%3.2g \n X1=%3.2g \n X2=%3.2g \n Xh=%3.2g \n', MBer, R1, R2, X1, X2, Xh);
end end end end end else for(R2= 0:0.01:1) for(Xh= 0:0.01:((4*UN)/(sqrt(3)*IN))) for(X1= 0.01*((4*UN)/(sqrt(3)*IN)):0.01:0.3*((4*UN)/(sqrt(3)*IN))) for(X2= 0:0.01:1)
phi = cos(atan(((X1+(Xh*((R2^2)/(s^2))+(Xh^2)*X2+Xh*(X2^2))/(((R2^2)/(s^2))+(Xh^2)+2*Xh*X2+(X2^2))))/((R1+((Xh^2)*(R2/s))/(((R2^2)/(s^2))+(Xh^2)+2*Xh*X2+(X2^2))))));
MBer = (((sqrt(3))*UN*IN*phi*Eta)/(2*pi*(nN/60)));
if(MBer < 0.7*MN || MBer > 1.3*MN || isnan(MBer))
%%Verlasse die vier Schleifen
end if(MBer >=MN*0.95 && MBer <=MN*1.05 && Xh>X1 && Xh>X2 && Xh >R1 && Xh>R2) fprintf('Die Parameter der Maschine lauten: \n Mber=%10.8g \n R1=%3.2g \n R2=%3.2g \n X1=%3.2g \n X2=%3.2g \n Xh=%3.2g \n', MBer, R1, R2, X1, X2, Xh);
end end end end end end end toc
das sind sehr viele verschachtelte schleifen. die kann man bestimmt auch vektorisieren.
du rechnest ja eh nur alle möglichen werte aus und guckst welche wert passt. da kannst du dir auch gleich mit
ndgrid
die matritzen erstellen und einsetzen. das sollte bei den ersten 5 schleifen jedenfalls klappen da sind es ja nicht so viele werten. bei den 2. könnte es chon etwas schwieriger werden da die matritzen größer sind. zum thema alle schleifen verlassen. du könntest auch while schleifen benutzen und dann die abbruchbedingung da verwenden.
erstmal soviel dazu. könnte man nicht dein problem auch einfach mit
fmincon
angehen um die parameter zu bestimmen ? die optimierer regeln ihre schrittweite ja selber.
_________________
Als allererstes erstmal danke für die schnelle Antwort
Die Überlegung mit der while-Schleife hatte ich auch schon, und habe auch schon versucht das Problem so zu lösen, ich muss aber leider sagen dass ich mit geschachtelten while-schleifen noch nicht ganz so gut klar komme. Wenn ich meinen Code für die While-Schleife laufen lasse sind die Berechnungen in unter einer Sekunde abgeschlossen und es werden bei weitem nicht alle Möglichkeiten durchprobiert, ich komme aber nicht auf den Fehler. Der Code sieht so aus:
Die Funktionen ngrid und fmincon kenne ich nicht, da ich gerade erst anfange Matlab zu lernen, die werde ich mir jetzt aber auf jeden Fall anschauen, vielen Dank für die Tipps.
ich kann nur Winkows Hinweis auf fmincon bzw. allgemein Optimierungsalgorithmen unterstützen. Ein Gradientenverfahren oder auch globale Optimierungslöser sind ziemlich sicher effizienter als sämtliche Kombinationen durchzuprobieren.
Grüße,
Harald
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
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.