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

Optimierung iterativer Algorithmus

 

matze w
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2016, 11:45     Titel: Optimierung iterativer Algorithmus
  Antworten mit Zitat      
Guten morgen zusammen!

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
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 10.04.2016, 12:32     Titel:
  Antworten mit Zitat      
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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
matze w
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2016, 13:43     Titel:
  Antworten mit Zitat      
Als allererstes erstmal danke für die schnelle Antwort Smile
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:

Code:
function whileschleife ()
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 = 1;
MBer = (((sqrt(3))*UN*IN*phi*Eta)/(2*pi*(nN/60)));
for (R1=0:0.01:1)
    while (MBer<0.75*MN || MBer>1.25*MN || isnan (MBer) && X1<= 1)
            X1 = X1 + 0.05;
            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>=MN*0.999 && MBer<=MN*1.001)
            fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
            end
             while (MBer<0.75*MN || MBer>1.25*MN || isnan (MBer) && X2<= 1)
             X2 = X2 + 0.05;
             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>=MN*0.999 && MBer<=MN*1.001)
             fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
             end
              while (MBer<0.75*MN || MBer>1.25*MN || isnan (MBer) && R2<= 1)
              R2 = R2 + 0.05;
              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>=MN*0.999 && MBer<=MN*1.001)
              fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
              end
               while (MBer<0.75*MN || MBer>1.25*MN || isnan (MBer) && Xh <= ((4*UN)/(IN*sqrt(2))))
                Xh = Xh + 0.05;
                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>=MN*0.999 && MBer<=MN*1.001)
                 fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
                end
               end
              end
             end
    end
   
    while (MBer >= 0.75*MN && MBer <= 1.25*MN && X1<= 1)
    X1 = X1 + 0.01;
    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>=MN*0.999 && MBer<=MN*1.001)
      fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
     end
     while (MBer >= 0.75*MN && MBer <= 1.25*MN && X2<= 1)
     X2 = X2 + 0.01;
     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>=MN*0.999 && MBer<=MN*1.001)
      fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
     end
      while (MBer >= 0.75*MN && MBer <= 1.25*MN && R2<= 1)
      R2 = R2 + 0.01;
      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>=MN*0.999 && MBer<=MN*1.001)
       fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
      end
      while (MBer >= 0.75*MN && MBer <= 1.25*MN && Xh <=((4*UN)/(IN*sqrt(2))))
        Xh = Xh + 0.01;
        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>=MN*0.999 && MBer<=MN*1.001)
         fprintf ('Die Parameter der Maschine lauten: \n Mber=%9.7g \n R1=R2=%3.2g \n X1=X2=%3.2g \n Xh=%3.2g \n',MBer ,R1 ,R2 ,X1 ,X2 ,Xh);
        end
      end
      end
     end
    end
end
toc


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.04.2016, 15:37     Titel:
  Antworten mit Zitat      
Hallo,

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