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 = (intmalloc(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 lesenDanke, 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:
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.