Jetzt hab ich leider noch ein Problem festgestellt.
Also für die Diagonalmatrix läuft alles einwandfrei. Für die Hilbertmatrix aber leider nicht... Da konvergiert das Ganze irgendwie nicht, wobei ich das seltsam finde da es ja der selbe algorithmus ist, oder habe ich da irgendwo nen fehler übersehen?
Mein fertiger Code sieht jetzt so aus:
Code:
#include <iostream>
#include <cmath>
using namespace std;
// Dimension
const int n=5;
// Diagonalmatrix
void diagMatrix( double A[n][n] )
{
for( int i=0; i<n; ++i )
{
for( int k=0; k<n; ++k )
{
if( i==k )
{
A[i][k] = i+1.0;
}
else
{
A[i][k] = 0.0;
}
}
}
}
// Hilbertmatrix
void hilbertMatrix( double A[n][n] )
{
for( int i=0; i<n; ++i )
{
for( int k=0; k<n; ++k )
{
A[i][k] = 1/(i+k+1.0);
}
}
}
// Multiplikation A * x = erg
void mult( const double A[n][n], const double x[n], double erg[n] )
{
for( int i=0; i<n; ++i )
{
erg[i] = 0.0;
for( int k=0; k<n; ++k )
{
erg[i] += A[i][k] * x[i];
}
}
}
// Funktion f
void f( const double x[n], const double tau, const double erg[n], const double b[n], double fX[n] )
{
for( int i=0; i<n; ++i )
{
fX[i] = x[i]-(tau*(erg[i]-b[i]));
}
}
// Residuum
void residuum( const double erg[n], const double b[n], double r[n] )
{
for( int i=0; i<n; ++i )
{
r[i] = erg[i] - b[i];
}
}
// Norm berechnen
double norm2( const double v[n] )
{
double summe = 0.0;
for( int i=0; i<n; ++i )
{
summe += v[i]*v[i];
}
return sqrt(summe);
}
// Hauptfunktion
int main()
{
double A[n][n], x[n], b[n], erg[n], fX[n], r[n];
double tau;
double eps = 0.00001;
double e = 1.0;
int m;
int z=0;
// Eingabe
cout << "Bitte waehlen Sie die Matrix.\n1) Diagonalmatrix\n2) Hilbertmatrix" << endl; cin >> m; cout << endl;
cout << "Bitte geben sie ein TAU > 0 ein: "; cin >> tau; cout << endl;
// Vektor b und x erstellen bzw initialisieren
for( int i=0; i<n; ++i )
{
b[i] = i;
x[i] = 0.0;
}
// Matrix einfügen
if( m==1 )
{
diagMatrix( A );
}
else if( m==2 )
{
hilbertMatrix( A );
}
// Folge
while( e>=eps )
{
mult( A, x, erg );
f( x, tau, erg, b, fX );
for( int i=0; i<n; ++i )
{
x[i] = fX[i];
}
mult( A, x, erg );
residuum( erg, b, r );
e = norm2( r )/norm2( b );
++z;
}
// Ausgabe
cout << "--------------------------------------------------" << endl;
cout << "Die Loesung des linearen Gleichungssystems" << endl << endl;
for( int i=0; i<n; ++i )
{
cout << "| ";
for( int k=0; k<n; ++k )
{
cout << A[i][k] << " ";
}
cout << "|" << " ";
cout << "| " << "x[" << i << "]" << " |";
cout << " = ";
cout << "| " << b[i] << " |" << endl;
}
cout << endl << "nach " << z << " Iterationsschritten, ist:" << endl << endl;
for( int i=0; i<n; ++i )
{
cout << "x[" << i << "] = " << x[i] << endl;
}
cout << endl;
cout << "--------------------------------------------------" << endl;
return 0;
}
Danke schonmal.
mfg joh
Lesezeichen