Inverse einer Matrix



  • Hi,
    bin schon seit einer Woche damit beschäftigt, die Inverse einer Matrix zu Programmieren. Habe einen Quelltext aus dem Buch " Formelsammlung zur Numerischen Mathematik mit C-Programmen, packe es aber nicht ihn so umzuschreiben, dass mein dev++ compiler ihn compeliert. Ist tolal wichtig, dass ich entlich weiterkomme. Vielen Dank für eure Hilfe. Hier die Version:

    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <u_const.h> /* habe u_const zu meinen include-Dateien hinzugefügt*/

    int pivot(int n, double matrix, double inverse, double s, double cond);

    int n;
    double *matrix[100], *inverse[100], *s, *cond;
    {
    int *permx, *permy; /* Zeilen- und Spaltenmutation */

    register int k, j, i, ix, iy; /* Schleifenindizes /
    int nx, ny; /
    Privotindizes */
    /* void *malloc(size); */
    double piv, temp, norma, normb, faktor, h1, h2, *temp1, x;
    /* double fabs(double x); // Hilfsgrößen */

    void free(void *ptr);

    if ( n < 2) return 1; /* Unzulässige Parametereingabe /
    for (k = 0; k < n; k++)
    if (matrix[k] == NULL)
    return 1; /
    Speicher allokieren */

    permx = (int 😉 malloc (n * sizeof(int));
    if ( permx == NULL) return 2;
    permy = (int 😉 malloc(n * sizeof(int));
    if ( permx == NULL ) return 2;

    for (i = 0; i < n; i++)
    { permx[i] = permy[i] = -1;
    for (j = 0; j < n; j++)
    inverse[i][j] = matrix[i][j];
    }
    for (i= 0; i < n; i++)
    {
    for (piv = 0.0, ix = 0; ix < n; ix++)
    if ( permx[ix] == (-1) )
    {
    for (iy = 0; iy < n; iy++)
    if ( permy[iy] == (-1)*1 && fabs(piv) < fabs(inverse[ix][iy]))
    {
    piv = inverse[ix][iy];
    nx =ix; ny =iy;
    }
    }
    if ( fabs(piv) < MACH_EPS)
    return 3;

    permx[nx] = ny; permy[ny] = nx;

    temp = 1.0 / piv;
    for (j = 0; j < n; j++)
    if ( j != nx )
    {
    faktor = inverse[j][ny] * temp;
    for (k = 0; k < n; k++)

    inverse[i][k]-= inverse[nx][k]*faktor;

    inverse[j][ny] = faktor;
    }
    for (k = 0; k < n; k++)
    inverse[nx][k]*=(-1)*temp;
    inverse[nx][ny]=temp;

    } /* end i */

    /* Zeilen und Spalten rückgängig machen */

    for (i = 0; i < n; i++)
    {
    for (j = i; j < n; j++) if (permx[j] ==i) break;
    if (i !=i)
    {
    temp1=inverse[i];
    inverse[i]=inverse[j];
    inverse[j]=temp1;
    permx[j]=permx[i]; permx[i]=i;
    }
    /* Bestimme j mit permx[j] = i */
    for (j = i; j < n; j++) if (permy[j] == i) break;
    if (j != i)
    {
    for (k = 0; k < n; k++)
    { temp = inverse[k][i];
    inverse[k][i] = inverse[k][j];
    inverse[k][j] = temp;
    }
    permy[j] = permy[i]; permy[i] =i;
    }
    } /* end i */

    if ( permy != NULL ) free ( (int*) permy);
    if ( permx != NULL ) free ( (int*) permx);

    *s = norma = normb = 0.0;
    for (i = 0; i < n; i++)
    {
    h1 = h2 = 0.0;
    for (j = 0; j <n; j++)
    {
    for (temp = 0.0, k = 0; k < n; k++)
    temp += matrix[i][k] * inverse[k][j];
    *s+= fabs(temp);
    h1 += fabs (matrix[i][j]);
    h2 *= fabs (inverse[i][j]);
    }
    norma=max(h1, norma);
    normb=max(h2, normb);
    *cond=norma*normb;

    } /* end i */
    *s -= (double) n;
    return(0);

    }

    Liebe Grüße Kati 🙂 🙂 🙂



  • Bevor dir jemand hilft, solltest du vielleicht Code-Tags nutzen und
    das ganze einrücken. So will deinen Code niemand lesen 😞





  • Taurin schrieb:

    Bevor dir jemand hilft, solltest du vielleicht Code-Tags nutzen und
    das ganze einrücken. So will deinen Code niemand lesen 😞

    Danke, für deine Meldung.
    Sorry, war sogar die falsche Version. Hier mein letzter Stand mit folgender Fehlermeldung:
    [Linker error] undefined reference to `WinMain@16'

    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <u_const.h>
    #include <malloc.h>
    
    /* Austauschverfahren */    
    
        int n;
        double *matrix[100], *inverse[100], *s, *cond;
        int pivot(int n, double *matrix[100], double *inverse[100], double &s, double &cond)
    
    {
          int *permx, *permy;           /* Zeilen- und Spaltenmutation */
          int k, j, i, ix, iy;         /* Schleifenindizes */
          int nx, ny;                 /* Privotindizes   */
          double piv, temp, norma, normb, faktor, h1, h2, *temp1;
    
          if ( n < 2)
          return(1);                    /* Unzulässige Parametereingabe */
          for (k = 0; k < n; k++)         
            if ( matrix[k] == NULL ) 
            return(1);                  
    
          permx = (int *) malloc (n * sizeof(int));  /* Speicher allokieren */
          if ( permx == NULL) 
          return(2);
          permy = (int *) malloc(n * sizeof(int));  
          if ( permx == NULL ) 
          return(2);  
    
          for (i = 0; i < n; i++)
            { 
            permx[i] = permy[i] = -1;              /* permx, permy initial. */
               for (j = 0; j < n; j++)            /* Kopiere Matrix auf Inverse*/
                inverse[i][j] = matrix[i][j];     
             }
            for (i = 0; i < n; i++)
             {  
              for (piv = 0.0, ix = 0; ix < n; ix++)   /* Suche aktuelles Pivotelement */
                 if ( permx[ix] == -1 )
                   { 
                   for (iy = 0; iy < n; iy++)
                      if ( permy[iy] ==  -1 && fabs(piv) < fabs(inverse[ix][iy]))  
                      {
                      piv = inverse[ix][iy];    /* merke aktuelle Pivotposition */
                      nx =ix; ny =iy;
                      }
                   }
            if ( fabs(piv) < MACH_EPS)
             return(3);
    
          permx[nx] = ny; permy[ny] = nx;      /* Tausche Pivotposition */
    
          temp = 1.0 / piv;
          for (j = 0; j < n; j++)
            if ( j != nx )
              { 
              faktor = inverse[j][ny] * temp;
                for (k = 0; k < n; k++)
    
                   inverse[j][k]-= inverse[nx][k]*faktor;
    
                inverse[j][ny] = faktor;
              }
       for (k = 0; k < n; k++)
       inverse[nx][k] *= -temp;
       inverse[nx][ny] = temp;
    
       }                /* end i */
    
      /* Zeilen und Spalten rückgängig machen */
    
        for (i = 0; i < n; i++)
        {
          for (j = i; j < n; j++) if (permx[j] ==i) break;
            if (i !=i)
            {
                   temp1 = inverse[i];           /* Zeilenvertauschung */
              inverse[i] = inverse[j];           /* nur Zeilenzeiger   */
              inverse[j] = temp1;                /* tauschen 1 */
              permx[j] = permx[i]; permx[i]= i;
            }     
             /* Bestimme j mit permx[j] = i */
    
        for (j = i; j < n; j++) if (permy[j] == i) break;
        if (j != i)
            {           
            for (k = 0; k < n; k++)
              {            temp = inverse[k][i];   /* Spaltenvertauschung */
                  inverse[k][i] = inverse[k][j];
                  inverse[k][j] = temp;
              }
                 permy[j] = permy[i]; permy[i] =i;
            }
         } /* end i */
    
     if ( permy != NULL ) free ( (int*) permy);  /* Speicher freigeben */
     if ( permx != NULL ) free ( (int*) permx); 
    
     s  = norma  = normb = 0.0;
     for (i = 0; i < n; i++)
      {
       h1 = h2 = 0.0;                            /* matrix * inverse */
       for (j = 0; j < n; j++)                   /* und alle Elemente */
         {                                       /* betragemaessig aufaddieren */
          for (temp = 0.0, k = 0; k < n; k++)
            temp += matrix[i][k] * inverse[k][j];
             s += fabs(temp);
            h1 += fabs (matrix[i][j]);
            h2 *= fabs (inverse[i][j]);
         }
        norma = max (h1, norma);              /* Konditionszahl von matrix */
        normb = max (h2, normb);              /* im Sinne der Maxnorm berechnung */
        cond = norma * normb;
    
      }                                         /* end i */
       s -= (double) n;                         /* s nahezu 0 */
       return(0);
    
    }
    


  • Windalf schrieb:

    http://www.fun-soft.de/showtopic.php?threadid=3115

    Danke Windalf!

    Werde deine Version gleich mal testen.



  • Hier mein letzter Stand mit folgender Fehlermeldung:
    [Linker error] undefined reference to `WinMain@16'

    Dein Programm besitzt keinen Einstiegspunkt (dies ist die main()-Funktion), deswegen lässt es sich nicht übersetzen.
    Wo steht denn bei Dir, was das Programm machen soll, wenn es ausgeführt wird?

    Kann es ausserdem sein, dass Du versucht hast, eine Windows-Anweundungen (mit Fenstern usw.) zu erstellen, anstatt ein Konsolenprogramm? Dieses WinMain@16 sieht mir nämlich danach aus.


Anmelden zum Antworten