joh
19-11-2008, 23:26
Hallo,
ich bin so langsam echt am verzweifeln. Und zwar soll ich ein Programm implementieren wie hier beschrieben:
http://www11.file-upload.net/thumb/20.11.08/hiz5oz.jpg (http://www.file-upload.net/view-1265360/Scannen0001.jpg.html)
Ich sollte vielleicht erwähnen dass ich kein blutiger Anfänger bin, aber auch nicht besonders versiert. :rolleyes: Ich hab bisher folgenden Quellcode, aber ich bekomm einfach nicht das richtige heraus...
#include <iostream>
#include <cmath>
using namespace std;
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 erstellen
for( int i=0; i<n; ++i )
{
b[i] = i;
}
// Vektor x initialisieren
for( int i=0; i<n; ++i )
{
x[i] = 0.0;
}
// Matrix einfügen
if( m==1 )
{
diagMatrix( A );
}
else if( m==2 )
{
hilbertMatrix( A );
}
else
{
cout << "Eingabe muss 1 oder 2 sein." << endl;
}
// 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 );
}
return 0;
}
Könnt ihr mir vielleicht helfen?
mfg joh
ich bin so langsam echt am verzweifeln. Und zwar soll ich ein Programm implementieren wie hier beschrieben:
http://www11.file-upload.net/thumb/20.11.08/hiz5oz.jpg (http://www.file-upload.net/view-1265360/Scannen0001.jpg.html)
Ich sollte vielleicht erwähnen dass ich kein blutiger Anfänger bin, aber auch nicht besonders versiert. :rolleyes: Ich hab bisher folgenden Quellcode, aber ich bekomm einfach nicht das richtige heraus...
#include <iostream>
#include <cmath>
using namespace std;
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 erstellen
for( int i=0; i<n; ++i )
{
b[i] = i;
}
// Vektor x initialisieren
for( int i=0; i<n; ++i )
{
x[i] = 0.0;
}
// Matrix einfügen
if( m==1 )
{
diagMatrix( A );
}
else if( m==2 )
{
hilbertMatrix( A );
}
else
{
cout << "Eingabe muss 1 oder 2 sein." << endl;
}
// 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 );
}
return 0;
}
Könnt ihr mir vielleicht helfen?
mfg joh