LR Zerlegung

Neue Frage »

blurry Auf diesen Beitrag antworten »
LR Zerlegung
stimmt der pseudo Code für die LR Zerlegung bei wikipedia ?

Hab ihn meiner Meinung nach 1:1 implementiert aber es kommt was anderes raus unglücklich
http://de.wikipedia.org/wiki/Gau%C3%9Fsc...s_in_Pseudocode
Math1986 Auf diesen Beitrag antworten »
RE: LR Zerlegung
Zitat:
Original von blurry
stimmt der pseudo Code für die LR Zerlegung bei wikipedia ?

Hab ihn meiner Meinung nach 1:1 implementiert aber es kommt was anderes raus unglücklich
Kannst du deine Implementierung und ein Beispiel, bei dem etwas anderes herauskommt, mal posten?
blurry Auf diesen Beitrag antworten »

ja hier meine IMplementierung:

int mat[3][3]={ {6,0,0 },{9,2,0},{3,8,1 }};
int n=3;
int r= 1;

for(int i = 0; i<n;i++)
{
// obere Matrix
for ( int j = i; j<n;j++)
{
for(int k=0;k<i-1;k++)
mat[i][j]-=mat[i][k]*mat[k][j];
}
//untere Matrix
for(int j = i+1 ;j<n;j++)
{
for(int k = 1; k<i-1;k++)
mat[j][i]-=mat[j][k] * mat[k][i];
mat[j][i]/=mat[i][i] ;
}


}
Math1986 Auf diesen Beitrag antworten »

Kann auch nicht funktionieren...

Erstens kompiliert der code nichtmal (ersetze "int mat[3][3]" durch "int mat[][]"), zweitens hat deine Matrix int-Einträge, also Ganzzahlen. Eine LU-Zerlegung ist aber nicht zwingend ganzzahlig, was aus der Zeile mat[j][i]/=mat[i][i] ; klar werden sollte. Du solltest hier den Typ double verwenden.

Zur Kontrolle (Matlab), die Zerlegung ist nicht ganzzahlig:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
>>  m=[6,0,0;9,2,0;3,8,1]

m =

     6     0     0
     9     2     0
     3     8     1

>> lu(m)

ans =

   9.000000000000000   2.000000000000000                   0
   0.333333333333333   7.333333333333333   1.000000000000000
   0.666666666666667  -0.181818181818182   0.181818181818182
blurry Auf diesen Beitrag antworten »

hast du dich hier verschrieben ??

(ersetze "int mat[3][3]" durch "int mat[3][3]")



Und LR- Zerlegung ist doch was anderes als LU Zerlegung ?
Math1986 Auf diesen Beitrag antworten »

1) Ja, habe mich verschrieben. Gemeint war mat[][], wie du auch selbst hättest herausfinden können. Frage mich, wie du das gestestet haben willst.

2) LR und LU (für lower-upper) ist das selbe. Steht auch im Wikipedia-Artikel:
Zitat:
Will man das Lösen eines quadratischen eindeutig lösbaren Gleichungssystems Ax=b als Computerprogramm umsetzen, bietet es sich an, den Gaußalgorithmus als LR-Zerlegung (auch LU-Zerlegung oder Dreieckszerlegung genannt) zu interpretieren.
 
 
blurry Auf diesen Beitrag antworten »

Das ganze ist c++ Code. mat[][] geht nicht !!

UNd auch double hilft nicht . Keine Ahnung wo der Fehler liegt
Math1986 Auf diesen Beitrag antworten »

Ach, C++.... Bin von Java ausgegangen. In C++ vergiss, was ich gesagt habe. Macht sonst auch keinen Unterschied.

Rechne es von Hand und mach dir an den einzelnen Schritten Console-Ausgaben, dann kannst du den fehler finden. Der Code auf Wikipedia scheint auf den ersten blick korrekt zu sein.
blurry Auf diesen Beitrag antworten »

die 1.Zeile der matrix stimmt ja auch immer. NUr die anderen nicht also bei einer 3 dim Matrix die Zeilen 2 und 3 . Und der Code kompiliert.
Math1986 Auf diesen Beitrag antworten »

Zitat:
Original von blurry
die 1.Zeile der matrix stimmt ja auch immer. NUr die anderen nicht also bei einer 3 dim Matrix die Zeilen 2 und 3 . Und der Code kompiliert.
Tja, dann poste doch mal die Ausgabe.
blurry Auf diesen Beitrag antworten »

ich habe den Pseudo Code 1:1 abgetippt. Nur dass halt bei C++ der Index bei 0 losgeht. Ich weiss echt nicht wo der Fehler liegen kann.
Math1986 Auf diesen Beitrag antworten »

Dann mach dir innerhalb der Schleifen Debug-Ausgaben und lass dir die Schritte ganz genau ausgeben. Ich vermute mal, du hast irgendwo einen Indizierungsfehler, der Rest scheint zu stimmen.
qwert-Taste Auf diesen Beitrag antworten »

Falls noch Interesse besteht: Es muss <= statt < heißen
Math1986 Auf diesen Beitrag antworten »

Ja, das hilft bei 4mal < im Code nicht so ganz

Poste doch mal den funktionierenden Code

PS: Bist du der ursprüngliche Fragesteller? Wenn ja, dann bleib doch bei dem Account.
qwert-Taste Auf diesen Beitrag antworten »

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
     double mat[3][3]={ {1,2,3 },{1,1,1},{3,3,1 }};
 int n=2;


 for(int i = 0; i<=n;i++)
          {
           // obere Matrix
            for ( int j = i; j<=n;j++)
            {
                for(int k=0;k<=i-1;k++)
                mat[i][j]-=mat[i][k]*mat[k][j];
            }
             //untere Matrix
             for(int j = i+1 ;j<=n;j++)
             {
                     for(int k = 0; k<=i-1;k++)
                      mat[j][i]-=mat[j][k] * mat[k][i];
             mat[j][i]/=mat[i][i] ;
              }
              }
for (int b=0;b<=n;b++){
    for (int c=0;c<=n;c++){
        printf("%f,",mat[b][c]);}
        printf("\n");}


bzw.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
       double mat[3][3]={ {1,2,3 },{1,1,1},{3,3,1 }};
 int n=3;


 for(int i = 0; i<n;i++)
          {
           // obere Matrix
            for ( int j = i; j<n;j++)
            {
                for(int k=0;k<=i-1;k++)
                mat[i][j]-=mat[i][k]*mat[k][j];
            }
             //untere Matrix
             for(int j = i+1 ;j<n;j++)
             {
                     for(int k = 0; k<=i-1;k++)
                      mat[j][i]-=mat[j][k] * mat[k][i];
             mat[j][i]/=mat[i][i] ;
              }
              }
for (int b=0;b<n;b++){
    for (int c=0;c<n;c++){
        printf("%f,",mat[b][c]);}
        printf("\n");}
 


Und nein, ich bin nicht der Fragesteller
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »