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

Rechenzeit mit symbolischen Werten - Gleichungssysteme löse

 

Sora1337
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2016, 10:41     Titel: Rechenzeit mit symbolischen Werten - Gleichungssysteme löse
  Antworten mit Zitat      
Hallo,

ich habe vor 2 Tagen schon einmal etwas gefragt, um Gleichungssysteme zu lösen.

http://www.gomatlab.de/umformen-sym.....-matrizenform-t41812.html

Da meine Frage zum Teil in eine andere Richtung geht, habe ich nochmal einen neuen Thread aufgemacht.

Allgemein suche ich eine Möglichkeit große Gleichungssysteme effizient zu lösen. Beim derzeitigen Stand habe ich ein LGS symbolisch erstellt und und überführe es dann in die Form Ax=b, wie im obigen Thread.

Code:

Ich erhalte je nach Größe sehr unterschiedliche Berechnungszeiten für die Umwandlung der Matrix A. Dabei möchte ich möglichst viele Einträge/Zeit umwandeln. Ich hätte gedacht, dass größer werdende Matrizen auch effizienter umgewandelt werden können, was jedoch nicht der Fall ist.

Code:

dim=20;
tic
A_part=double(A(1:dim,1:dim));
time=toc
efficiency=(dim^2)/time;
 


Angenommen man wählt dim=1, so benötigt mein Rechner etwa 8 Sekunden, um den symbolischen Wert umzuwandeln. Bei etwas größer werdenden Werten ist es kaum ein Unterschied. Die Effizienz verbessert sich dann natürlich, da mehr Einträge umgewandelt werden. Die Effizienz wird besser bis zum Wert von dim=300 und verschlechtert sich anschließend wieder. Man kann bei sehr großen Matrizen also Zeit sparen, indem man immer wieder Teile der Matrix einzeln umwandelt. Warum ist das so?
Meine Matrix hat etwa 7000x7000 Einträge, was beim gesamten Umwandeln immernoch mehrere Stunden dauern würde. Oder geht es auch besser?

Bisher habe ich diese Vorgehensweise gewählt, da hier http://www.tm-mathe.de/Themen/html/.....rgleich_backslash-op.html deutlich wurde, dass der Backslash-Operator Gleichungssysteme effizient löst.
Vielleicht hat ja sonst auch jemand eine andere Idee, wie ich das Problem angehen kann.
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: 24.08.2016, 11:40     Titel:
  Antworten mit Zitat      
Hallo,

am besten wäre es natürlich, wenn du die Werte von Anfang an numerisch erzeugst.

Was Performance-Probleme mit einzelnen Funktionen angeht, kann ich nur eine Kontaktaufnahme mit dem Technischen Support von MathWorks empfehlen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2016, 10:13     Titel:
  Antworten mit Zitat      
Hallo,

erstmal danke für die Antwort.

Bei Mathworks wurde mir mitgeteilt, dass man beim symbolischen Rechnen durchaus lange Rechenzeiten erwarten kann. Mir wurde allerdings noch ein Vorschlag gemacht, das ganze zu beschleunigen.

Da in meinem Fall eine dünnbesetzte Matrix vorliegt, macht es Sinn diese zunächst in eine sparse Matrix umzurechnen. Der Befehl sparse(A) funktioniert erst einmal nur für double oder logical Variablentypen, daher kann man mit find() zunächst die entscheidenden Einträge suchen. Zudem habe ich die Matrix auch in diesem Fall in Untermatrizen unterteilt.

Code:

[dim,~]=size(A);

width=850;
num=floor(dim/width);
row = zeros(0,0);
col=zeros(0,0);
val=zeros(0,0);
for i=1:(num+1)
    for j=1:(num+1)
        if i==(num+1) && j==(num+1)
            [row_hold,col_hold,val_hold]=find(A(1+width*(i-1):end,1+width*(j-1):end));
        elseif i==(num+1)
            [row_hold,col_hold,val_hold]=find(A(1+width*(i-1):end,1+width*(j-1):width*j));
        elseif j==(num+1)
            [row_hold,col_hold,val_hold]=find(A(1+width*(i-1):width*i,1+width*(j-1):end));
        else
            [row_hold,col_hold,val_hold]=find(A(1+width*(i-1):width*i,1+width*(j-1):width*j));
        end
        additional=length(row_hold);
        row(end+1:end+additional,1)=row_hold+(i-1)*width;
        col(end+1:end+additional,1)=col_hold+(j-1)*width;
        val(end+1:end+additional,1)=val_hold;
    end
end
A=sparse(row,col,val);
b=double(b);
 


Warum die Aufteilung und Berechnung mit Untermatrizen schneller funktioniert, kann ich nicht sagen. Bei der Funktion find() scheint das Optimum etwa bei der Größe 850x850 zu liegen.
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.