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

Rechenzeitoptimierung Determinante Intervallmatrizen

 

twixta
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 18.12.2008, 09:13     Titel: Rechenzeitoptimierung Determinante Intervallmatrizen
  Antworten mit Zitat      
Guten Morgen,

ich arbeite an einer Robotersimulation auf Basis einer Intervallanalyse (Verwendung der Toolbox INTLAB) und muss daher die DETERMINANTE einer 6x6 (Jacobi-)Matrix bestimmen (und zwar ziemlich! oft).
Leider kann die Standardfunktion det(x) nicht auf die Intervallmatrizen angewendet werden und die Toolbox INTLAB enthält noch keine solche Routine.

Ich habe von einem Kollegen folgenden Code bekommen, der auf der Leibnizformel/dem Laplace'schen Entwicklungssatz basiert. Die Funktion berechnet zwar korrekte Ergebnisse (was schonmal cool ist) braucht allerdings EWIG.

Da ich noch wenig Erfahrungen in der Programmierung, und gerade in Matlab habe, bitte ich um Tipps zur Rechenzeitoptimierung des folgenden Codes:

Code:

%----------------------------------------------------------------------------------

function deter = intdet(MAT,minormax) %, pre, secondpre)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%This programs calculates determinants for interval matrices
%and tries to do in a resonably sharp way
%Input:
%       MAT           Interval Matrix (Size NxN) (Works slow for N>6)
%       minormax      ('min' / 'max') -> Expand by the smallest/biggest column/row
%Output:
%       deter         Determinant
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    if(any(isnan(MAT)))                                 %determinant can not be computed if any element is NaN

        deter = infsup(-Inf, Inf);

    else                                                %no elements are NaN
        A = MAT;

        deter = subintdet(A, minormax);                 %Calculate the determinant recursive method
    end
end



function subdet = subintdet(A,minormax)         %Subdeterminant
    s = size(A,1);                              %number of rows
    if (isequal(size(A), [1,1]))                %The recursitivity end when the input is a 1x1 matrix
        subdet = A(1,1);              
    else

        %Recursive algorithm
        l = zeros(s,1);
        %Find the sums of the diameter of the columns and the rows and store it in l
        for i = 1:s,
            l(i)   = sum(diam(A(i,:)));         %rows
            l(i+s) = sum(diam(A(:,i)));         %columns
        end
        if strcmp(minormax, 'min')
            mi = min(l);                        %Expand by the smallest column/row
        elseif strcmp(minormax, 'max')
            mi = max(l);                        %Expand by the biggest column/row
        else
            error('Wrong input to intdet');
        end
       
        i=1;
        while (l(i) ~= mi),                     %Find the index of the smallest/biggest row (can be done easier, i know!)
            i=i+1;
        end
       
        subdet = 0;
        for j = 1:s;
            U = A;
            if (i<=s)                           %Calculate subdeterminant by the row
                U(i,:) = [];                    %Clear the other rows and columns.
                U(:,j) = [];
                sig    = mod(i+j,2);            %Set the sign.
                subdet = subdet+((-1)^sig)*A(i,j)*subintdet(U,minormax); %The next subdeterminant is calculated
            else                                %Calculate subdeterminant by the column
                r      = i-s;
                U(:,r) = [];
                U(j,:) = [];
                sig    = mod(r+j,2);
                subdet = subdet+((-1)^sig)*A(j,r) * subintdet(U,minormax);
            end
        end
    end
end

 


Vielen Dank für Eure Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2008, 09:22     Titel:
  Antworten mit Zitat      
Was ist eine Intervallmatrix?
 
twixta
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 18.12.2008, 10:15     Titel:
  Antworten mit Zitat      
Soll bedeuten, dass jedes Matrixelement als ein Intervall [a,b] definiert ist (vgl. Intervallarithmetik zB Wikipedia). Die Toolbox INTLAB stellt weitestgehend alle Rechenoperationen bereit, nur leider nicht für die Determinantenberechnung (Habe der Entwickler Prof. Rump von der TU Hamburg persönlich hierzu befragt). Anscheinend ist noch keine Routine fertiggestellt die Ihren Ansprüchen für eine Implementierung in die Toolbox genügt.
Daher mussten wir halt selbst ran und die gängigen Berechnungsroutine zur Determinantenbestimmung auf Basis der "erlaubten" Rechenoperationen für Intervalle umsetzen.
Wer also evtl noch irgendwo potential hinsichtlich zeit und rechen effizienz sieht, würde mir sehr weiterhelfen.
Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 18.12.2008, 10:19     Titel:
  Antworten mit Zitat      
Was sagt den der MATLAB Profiler? Wo ist der Flaschenhals?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
twixta
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 18.12.2008, 10:57     Titel:
  Antworten mit Zitat      
Schwer zu sagen, keine Fehlermeldungen, soweit ich feststellen konnte richtige ergebnisse aber die berechnung einer 6x6 Matrix mit moderaten Intervallgerenzen zB +/- 10 duert die Operation gerne über ne Sekunde, was sich aber bei mehreren zehn- bis hunderttausend nötigen berechnungen ganz gut summiert Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 18.12.2008, 11:04     Titel:
  Antworten mit Zitat      
Schon klar, dass sich das aufsummiert, aber der MATLAB Profiler (über Menü oder per Befehl) zeigt auf, wo die meiste Zeit verbraten wird. Wenn man das weiss kann man versuchen diesen Teil des Codes schneller zu machen.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
twixta
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 18.12.2008, 11:42     Titel:
  Antworten mit Zitat      
Das problem ist für mich selbst auch schwer zu durchschauen, da sich die Funktion subdet ja mehrfach selbst aufrufen muss um die Unterdeterminanten zu bilden

Zeile:
subdet = subdet+((-1)^sig)*A(i,j)*subintdet(U,minormax); %The next subdeterminant is calculated

und an der stelle geht natürlich auch die meiste rechenzeit drauf, das bestätigt auch der profiler.

Ich glaube allerdings nicht, dass sich dies an der stelle vermeiden lässt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2008, 11:52     Titel:
  Antworten mit Zitat      
Kannst Du denn mal eine kleines Beispiel geben, wie z.B. der genaue Rechnungsgang für eine Matrix A=[a b;c d] und meinetwegen den Intervallgrenzen +-10 auszusehen hat?
Oder wie genau sieht denn eine Intervallmatrix aus?
Die ganze Thematik ist mir nämlich völlig fremd... Idea
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 18.12.2008, 11:58     Titel:
  Antworten mit Zitat      
Im Profiler bitte auch noch auf subintdet klicken, dann zeigt es an wo da innerhalb die Rechenzeit verbleibt.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
twixta
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 18.12.2008, 12:28     Titel:
  Antworten mit Zitat      
ja klar...

der Laplace'sche Entwicklungssatz ist ganz gut bei wiki erläutert:
[url]
http://de.wikipedia.org/wiki/Determinante_(Mathematik)
[/url]

Meine Beispielmatrix sieht dann aus wie folgt:

Code:

intval MAT =
  Columns 1 through 5
[   -1.0000,    2.0000] [    2.0000,    5.0000] [   -3.0000,   -1.0000] [   -3.0000,    1.0000] [   -1.0000,    2.0000]
[   -3.0000,    1.0000] [   -3.0000,   -1.0000] [   -3.0000,   -1.0000] [    2.0000,    5.0000] [   -1.0000,    2.0000]
[   -3.0000,    1.0000] [   -3.0000,   -1.0000] [    0.0000,    3.0000] [    2.0000,    5.0000] [   -1.0000,    2.0000]
[   -3.0000,   -1.0000] [    0.0000,    3.0000] [   -3.0000,    1.0000] [   -1.0000,    2.0000] [    2.0000,    5.0000]
[    0.0000,    3.0000] [    2.0000,    5.0000] [   -1.0000,    2.0000] [   -3.0000,   -1.0000] [   -3.0000,    1.0000]
[   -1.0000,    2.0000] [   -3.0000,    1.0000] [   -3.0000,   -1.0000] [    2.0000,    5.0000] [   -1.0000,    2.0000]
  Column 6
[    2.0000,    5.0000]
[   -3.0000,    1.0000]
[   -3.0000,    1.0000]
[   -3.0000,   -1.0000]
[    2.0000,    5.0000]
[   -3.0000,   -1.0000]
 


Das Ergebnis ist wieder ein Intervall, das quasi alle Ergebnisse der möglichen Kombinationen Innerhalb der Matrix umfasst:

Code:

intval ans =
  1.0e+005 *
[   -5.2148,    5.2055]
 


Laut Profiler verbraucht der in sich selbst verschachtelte subdet aufruf 39% der rechenzeit, kann leider keine jpg.screenshots anhängen.

zum ausführen des m-files: (INTLAB Toolbox muss installiert sein !)
[url]
http://www.ti3.tu-harburg.de/rump/intlab/
[/url]
Code:


function deter = intdet_test%(MAT,minormax) %, pre, secondpre)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%This programs calculates determinants for interval matrices
%and tries to do in a resonably sharp way
%Input:
%       MAT           Interval Matrix (Size NxN) (Works slow for N>6)
%Output:
%       deter         Determinant
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

MAT(1,1) = infsup(-1,2);
MAT(1,2) = infsup(2,5);
MAT(1,3) = infsup(-3,-1);
MAT(1,4) = infsup(-3,1);
MAT(1,5) = infsup(-1,2);
MAT(1,6) = infsup(2,5);

MAT(2,1) = infsup(-3,1);
MAT(2,2) = infsup(-3,-1);
MAT(2,3) = infsup(-3,-1);
MAT(2,4) = infsup(2,5);
MAT(2,5) = infsup(-1,2);
MAT(2,6) = infsup(-3,1);

MAT(3,1) = infsup(-3,1);
MAT(3,2) = infsup(-3,-1);
MAT(3,3) = infsup(0,3);
MAT(3,4) = infsup(2,5);
MAT(3,5) = infsup(-1,2);
MAT(3,6) = infsup(-3,1);

MAT(4,1) = infsup(-3,-1);
MAT(4,2) = infsup(0,3);
MAT(4,3) = infsup(-3,1);
MAT(4,4) = infsup(-1,2);
MAT(4,5) = infsup(2,5);
MAT(4,6) = infsup(-3,-1);

MAT(5,1) = infsup(0,3);
MAT(5,2) = infsup(2,5);
MAT(5,3) = infsup(-1,2);
MAT(5,4) = infsup(-3,-1);
MAT(5,5) = infsup(-3,1);
MAT(5,6) = infsup(2,5);

MAT(6,1) = infsup(-1,2);
MAT(6,2) = infsup(-3,1);
MAT(6,3) = infsup(-3,-1);
MAT(6,4) = infsup(2,5);
MAT(6,5) = infsup(-1,2);
MAT(6,6) = infsup(-3,-1);

minormax = 'min';
%minormax = 'max';


    if(any(isnan(MAT)))                                 %determinant can not be computed if any element is NaN

        deter = infsup(-Inf, Inf);

    else                                                %no elements are NaN
        A = MAT;
profile on
        deter = subintdet(A, minormax);                 %Calculate the determinant recursive method
profile viewer    
    end
end



function subdet = subintdet(A,minormax)         %Subdeterminant
    s = size(A,1);                              %number of rows
    if (isequal(size(A), [1,1]))                %The recursitivity end when the input is a 1x1 matrix
        subdet = A(1,1);              
    else

        %Recursive algorithm
        l = zeros(s,1);
        %Find the sums of the diameter of the columns and the rows and store it in l
        for i = 1:s,
            l(i)   = sum(diam(A(i,:)));         %rows
            l(i+s) = sum(diam(A(:,i)));         %columns
        end
        if strcmp(minormax, 'min')
            mi = min(l);                        %Expand by the smallest column/row
        elseif strcmp(minormax, 'max')
            mi = max(l);                        %Expand by the biggest column/row
        else
            error('Wrong input to intdet');
        end
       
        i=1;
        while (l(i) ~= mi),                     %Find the index of the smallest/biggest row (can be done easier, i know!)
            i=i+1;
        end
       
        subdet = 0;
        for j = 1:s;
            U = A;
            if (i<=s)                           %Calculate subdeterminant by the row
                U(i,:) = [];                    %Clear the other rows and columns.
                U(:,j) = [];
                sig    = mod(i+j,2);            %Set the sign.
                subdet = subdet+((-1)^sig)*A(i,j)*subintdet(U,minormax); %The next subdeterminant is calculated
            else                                %Calculate subdeterminant by the column
                r      = i-s;
                U(:,r) = [];
                U(j,:) = [];
                sig    = mod(r+j,2);
                subdet = subdet+((-1)^sig)*A(j,r) * subintdet(U,minormax);
            end
        end
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2008, 13:23     Titel:
  Antworten mit Zitat      
Kannst Du mir mal den Vorgang am Beispiel der 2x2 Matrix erklären, also mal händisch vorrechnen?:
Zitat:
intval MAT =
[ -1.0000, 2.0000] [ 2.0000, 5.0000]
[ -3.0000, 1.0000] [ -3.0000, -1.0000]
intval ans =
[ -11.0000, 18.0000]

Wie kommt man auf das Ergebnis?
 
twixta
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 18.12.2008, 14:46     Titel:
  Antworten mit Zitat      
hey kein problem, aber ich hab heute leider keine zeit mehr, es gibt so nette verpflichtungen wie institutsweihnachtsfeiern;) ich poste morgen vormittag was!
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2008, 15:41     Titel:
  Antworten mit Zitat      
Hm, ok.
Das gewünschte Ergebnis ist offenbar
Code:
det([2 5;1 -3])
det([-1 -3;5 -3 ])
. Leicht für eine 2x2 Matrix.
Jetzt muss ich mal eine 4x4 Matrix durchrödeln, um zu verstehen, welchen der Einträge man nehmen muss und wie dabei die alternierenden Vorzeichen beim Entwicklungssatz zu berücksichtigen sind.
Ich möchte eigentlich aus der Intervallmatrix zwei 'normale' Matrizen machen, daraus dann für die untere und obere Grenze wieder zwei einzelne Matrizen machen (mit jeweils den richtigen Elementen) und darauf dann das det von Matlab loslassen.
 
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 - 2024 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.