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

Leistungsintensive Integration optimieren (Rechenzeit)

 

Phil254
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 19.02.2013, 21:22     Titel: Leistungsintensive Integration optimieren (Rechenzeit)
  Antworten mit Zitat      
Hallo an alle Matlab Freunde!

edit: für übereifrige Helfer, die nicht alles durchlesen wollen: es geht eigentlich nur um das Integral in dem Code, ob und wie man das in Hinsicht auf die Rechenzeit optimieren könnte. Ich denke da hauptsächlich an andere Integralbefehle wie quad,. etc. was es noch gibt.

Ich bin Matlab Neuling und habe eine ziemlich komplexe (reelle Wink ) Rechnung mit Doppelintegral am Ende.
Es funktioniert zwar und ist auch OK so, aber ich frage mich ob man die Rechenzeit etwas herabsetzen kann durch intelligentes Programmieren.
Zumal es ja scheinbar ziemlich viele Varianten für das Integrieren in Matlab gibt, und ich einfach nur das 'integral' genommen habe.

Hier mal mein Code:

Code:
E_1 = 169; E_2 = 9; E_3 = 9; G_12 = 6.5; G_13 = 6.5; G_23 = 3.1; v_12 = 0.31; v_13 = 0.31; v_23 = 0.45; AL = 119/2790;

S11 =  1 / E_1;
S12 = -v_12 / E_1;
S13 = -v_13 / E_1;
S22 =  1 / E_2;
S23 = -v_23 / E_2;
S33 =  1 / E_3;
S44 =  1 / G_23;
S55 =  1 / G_13;
S66 =  1 / G_12;

S = [S11 S12 S13 0   0   0
     S12 S22 S23 0   0   0
     S13 S23 S33 0   0   0
     0   0   0   S44 0   0
     0   0   0   0   S55 0
     0   0   0   0   0   S66];

syms x
syms z

h = 1;
A = AL;
L = 1;
x_2 = L;
x_1 = 0;

PHI = atan(2*pi*A/L*(1-abs(z)/h)*cos(2*pi*x/L));
m = cos(PHI);
n = sin(PHI);

T = [m^2   0   n^2   0   2*m*n     0
     0     1   0     0   0         0
     n^2   0   m^2   0  -2*m*n     0
     0     0   0     m   0        -n
    -m*n   0   m*n   0   m^2-n^2   0
     0     0   0     n   0         m];

 R = [1  0  0  0  0  0
      0  1  0  0  0  0
      0  0  1  0  0  0
      0  0  0  2  0  0
      0  0  0  0  2  0
      0  0  0  0  0  2];

S_trans = simplify(R/T/R*S*T);

S_eff = zeros(6);

i=1;
while i<=6
    j=1;
    while j<=6
        if S_trans(i,j)~=0
            try
                S_eff(i,j) = ((2*h)^-1*(x_2-x_1)^-1)*integral2(matlabFunction(S_trans(i,j)),x_1,x_2,-h,h);
            catch err
                S_eff(i,j) = S_trans(i,j);
            end
        end
        j=j+1;
    end
    i=i+1;
end


Kurz als Erklärung:
Ich habe die Eingabeparameter am Anfang, erstelle daraus eine Matrix S und eine Transformationsmatrix T.
Zusammen mit R bilde ich aus den dreien eine neue Matrix.
Die späteren Integrationsvariablen stecken in dem Winkel PHI in der Transformationsmatrix T drin. Die ganze Rechnung passiert symbolisch.
Anschließend muss ich ein Doppelintegral dieser Matrix bilden.
Eine symbolische Integration mit 'int' ist zwar naheliegend, da ich mit bisher syms Variablen gerechnet habe, allerdings viel zu rechenintensiv, also muss ich das ganze numerisch Integrieren. Das einzige mit dem ich da bisher klargekommen bin ist der normale 'integral' / 'integral2' befehl.
Da es im Gegensatz zum Einfachintegral ( => 'arrayvalued',true) bei dem Doppelintegral nicht funktioniert die gesamte Matrix zu integrieren ('arrayvalued' gibt es nicht), mache ich das mit einer Schleife und integriere die einzelnen Einträge.
Da die Einträge noch die syms Variablen x und z enthalten muss ich das ganze mit matlabFunction() umwandeln.
Da hierbei Fehler auftreten sobald ein Eintrag ohne x oder z auftritt, also eine Konstante, habe ich einfach die Fehlerabfrage eingebaut (ich habe keine andere Möglichkeit gefunden die Einträge ohne x oder z zu identifizieren und es war so am einfachsten. Umwege über string comp oder sonstiges sind denke ich fast aufwändiger. ? aber gerne auch hier tipps Wink )

Sodalla.
Ich hoffe sehr mir kann jemand helfen.
Diese Rechnung wird nämlich weiterhin mit unterschiedlichen AL Werten gerechnet um einen Plot zu erstellen. Und es dauert bereits für 10 Werte relativ lange..

Vielen Dank für jede Hilfe und jede Antwort!!

Gruß,
Philipp.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.02.2013, 22:06     Titel:
  Antworten mit Zitat      
Hallo,

"relativ lange" ist relativ. Heute hat jemand hier von einem Beispiel geschrieben, bei dem er mit einer Rechenzeit von 4 Tagen rechnet.

Ich habe dein Programm mal im Profiler durchlaufen lassen. Die meiste Zeit wird gar nicht mit den Integralen, sondern mit symbolischen Berechnungen (insbesondere simplify) verbracht.

Bei R/T werden lineare Gleichungssysteme gelöst, ist das beabsichtigt?

Und wenn dich am Ende ohnehin nur Integrale interessieren, die du numerisch berechnest, warum machst du dann nicht gleich alles numerisch? Multiplizieren von Matrizen und Lösen von Gleichungssystemen geht da ja blitzschnell.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 19.02.2013, 23:33     Titel:
  Antworten mit Zitat      
Hallo Harald, danke für deine Antwort!

Ja, das mit dem 'relativ lange' ist natürlich richtig, allerdings sollte es für meine Anwendung möglichst schnell gehen und nicht 4 stunden dauern Smile

Wie meinst du das mit den linearen Gleichungssystemen?
Also grundsätzlich ist R/T die Multiplikation von R mit der Inversen von T, aber wenn ich das mit inv(T) in den Code schreibe, dann sagt Matlab mir mit /T wäre es besser. Ja und den Term R*T/R könnte man auch gleich zusammenziehen, das ist natürlich richtig, das ist eine rein formale Sache und ich war bisher zu faul das zu vereinfachen Smile

Hm ok, ich habe mich natürlich freudig auf die Symbolic Toolbox gestürzt, weil es für mich als Neuling am einfachsten war.
Ich weiss ehrlichgesagt garnicht wie ich die Matrizenrechnung numerisch umsetze, aber das ist natürlich ein guter Hinweis, ich werde mich mal damit beschäftigen, danke!

Trotzdem nochmal die Frage: Lässt sich die Integration irgendwie optimieren oder ist das schon OK so ?

Vielen Dank nochmal für deine Hilfe Harald!
Gruß,
Philipp.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.02.2013, 08:29     Titel:
  Antworten mit Zitat      
Hallo,

ohne symbolische Matrizen wird das nicht wirklich komplizierter.

Ich würde die Berechnung von S_trans in eine eigene Funktion auslagern:

Code:
function S = S_trans(x,z)
...

und darauf beim Aufruf von integral2 verweisen.

Das Integrieren dauerte in dem Fall bei mir nur ca. 1s von insgesamt 20s, ist also quasi vernachlässigbar und auch gut so, sofern sich die Integrale jetzt nicht beispielsweise auf einfache Weise aus einander berechnen lassen. Dann könnte man das ganze auch noch vereinfachen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 20.02.2013, 20:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

nur nochmal danke für deine Hilfe! Smile Denke es ist vorerst alles beantwortet.

Gruß,
Phil.
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.