Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

01.07.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.

Ähnliche Präsentationen


Präsentation zum Thema: "01.07.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure."—  Präsentation transkript:

1 01.07.2000 Universität Dortmund, Lehrstuhl Informatik 1 dittrich@cs.uni-dortmund.de EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure II Prof. Dr. Gisbert Dittrich

2 21-2 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gliederung Vektoren und Matrizen als ADTs Deren Implementierungen Lösung linearer Gleichungssysteme Gaußsches Eliminationsverfahren Version 0 – Entwurf – Implementierung Gauß mit Pivotisierung Matrixinvertierung Literatur: B.H. Flowers: An Introduction to Numerical Methods in C++, p. 188ff, Oxford University Press, 2000

3 21-3 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren als ADT Hier: Reellwertige Vektoren (+ Matrizen) Vektoren haben: Größe (Dimension) Operationen Erzeugen Entfernen Einlesen Auslesen Operationen i.e.S: – Projektion auf Komponente : [ ]- Zuweisung: = – Addition: += - Subtraktion: -= – Multiplikation mit Skalar: *= - Skalarmultiplikation

4 21-4 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen als ADT Matrizen haben: Größe: Anzahl Reihen und Anzahl Spalten Operationen Erzeugen Entfernen Einlesen Auslesen Operationen i.e.S: – Projektion auf Zeile : [ ]- Zuweisung: = – Addition: += - Subtraktion: -= – Multiplikation mit Skalar: *= - Matrixmultiplikation – Invertierung

5 21-5 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Error-Funktion: Implementierung void error (char*); void error (char* errmsg) { cerr << "An unexpected error has occured!" << endl; cerr << "reason: " << errmsg; cerr << "\n\nProgram execution" << "terminated!" << endl; exit(-1); } Anmerkung: cerr Fehler-Output-Stream

6 21-6 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung class Vector { friend class matrix; // allows access to private attributes of matrix private: int size; double * vec; int range (int); // dimension of the vector public: Vector (int); // constructor: constructs vector // with given dimension Vector ( const double*, int); //..+ init w. field Vector ( const Vector&); // Copy-constructor ~Vector();

7 21-7 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Anmerkungen friend : Schlüsselwort. Durch friend bezeichnete Funktionen oder Klassen haben auch Zugriff auf die private members, obwohl: Durch friend bezeichnete Funktionen oder Klassen sind nicht member der Klasse.

8 21-8 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Anmerkungen & : Referenz Alternativer Name für ein Objekt X& bedeutet Referenz auf X int ii = 1; int& rr = ii; rr++; // ii wird um 1 // inkrementiert int* pp = &rr // pp zeigt auf ii Hauptanwendung: Angabe von Argumenten und Rückgabewerten von Funktionen Insbesondere: für überladene Operatoren (s.u.) 1 ii: rr: &ii pp:

9 21-9 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Anmerkungen const vor Zeiger oder Referenz macht zugehöriges Objekt (jedoch nicht Zeiger oder Referenz) zur Konstanten. Unser Beispiel: Vector ( const Vector&); [ Zeiger zur Konstante zu machen erreicht man durch *const]

10 21-10 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung class Vector // Fortsetzung {.... public: double& operator[] (int i) { return vec[range(i)];} Vector& operator=(const Vector&); // assignment Vector& operator+=(const Vector&);// add-assignment Vector& operator-=(const Vector&);//minus-assignmnt Vector& operator*=(double); // mult by double int getsize() {return size;}...... };

11 21-11 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Anmerkungen operator : Schlüsselwort. Beschreibt Spezifikation der Überladung von Operationen über Objekten der (neuen) Klasse: – arithmetische – andere (z. B. Einlesen, auslesen) Infixnotation weiter verwendbar

12 21-12 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung class Vector // Fortsetzung {.... public: friend Vector operator* (double, const Vector&); friend double scalar (const Vector&, const Vector&); // scalar product friend Vector operator* (const matrix&, const Vector&); friend Vector operator* (const Vector&, const matrix&); friend ostream& operator<< (ostream&, const Vector&); friend istream& operator>> (istream&, Vector&); };

13 21-13 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector::Vector (int n) { size=n; vec = new double [size]; if (!vec) error ("allocation failure in ¬ // ¬: carriage return Vector::Vector(int)!"); for (int i=0; i<size; ++i) vec[i]=0; }

14 21-14 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector::Vector (const double *a, int n) { size=n; vec = new double [size]; if (!vec) error ("allocation failure in ¬ Vector::Vector(double*, int)!"); for (int i=0; i<size; ++i) vec[i]=a[i]; }

15 21-15 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector::Vector (const Vector &v) { size=v.size; vec = new double [size]; if (!vec) error ("allocation failure in ¬ Vector::Vector(Vector&)!"); for (int i=0; i<size; ++i) vec[i]=v.vec[i]; }

16 21-16 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector::~Vector () {delete vec;} inline int Vector::range (int i) {return (i = size) ? ¬ (error ¬ ("error in range-function in class vector"), -1) ¬ : i; }

17 21-17 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector& Vector::operator= (const Vector &v) { if (size != v.size) error ("diff size in vector& ¬ vector::op=(const vector&)!"); for (int i=0; i<size; ++i) vec[i]=v.vec[i]; return *this; }

18 21-18 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector& Vector::operator+= (const Vector &v) { if (size != v.size) error ("diff size in vector& ¬ vector::op+=(const vector&)!"); for (int i=0; i<size; ++i) vec[i]+=v.vec[i]; return *this; }

19 21-19 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector& Vector::operator-= (const Vector &v) { if (size != v.size) error ("diff size in vector& ¬ vector::op-=(const vector&)!"); for (int i=0; i<size; ++i) vec[i]-=v.vec[i]; return *this; }

20 21-20 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung Vector& Vector::operator*=(double x) { for (int i=0; i< size; ++i) vec[i]*=x; return *this; } Vector operator* (double d, const Vector &v) { Vector vd=v; vd *= d; return vd; }

21 21-21 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung double scalar (const Vector &u, const Vector &v) { double t=0; int n=u.size; if (u.size != v.size) error ("error in function scalar ¬ in class Vector"); for (int i=0; i<n; ++i) t += u.vec[i]*v.vec[i]; return t; }

22 21-22 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung istream& operator>>(istream &s, Vector &v) { int n=v.size; cout << "enter " << n << " elements:\n"; for (int i=0; i<n; ++i) { cout << "v [" << i << "] = "; s >> v.vec[i]; } return s; }

23 21-23 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Vektoren: Implementierung ostream& operator<<(ostream &s, const Vector &v) { int n=v.size; cout << "( "; for (int i=0; i<n; ++i) s << v.vec[i] << " | "; s << " )" << "\n"; return s; }

24 21-24 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung class matrix { private: int numrows;// how many rows? int numcols;// how many columns? Vector **mat; int range(int); // row range check public: matrix (int, int);// constr: rectangular matrix matrix (int);// constr: square matrix matrix (const matrix&);// constr: rectang. matrix ~matrix(); // destructor

25 21-25 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung class matrix // Fortsetzung {...... public:..... int getsize();// def. for square matrix only! void swap(int a, int b); matrix transpose(); Vector& operator[] (int i) { return *mat[range(i)];} matrix& operator=(const matrix&); friend Vector operator* (const matrix&, const Vector&); friend Vector operator* (const Vector&, const matrix&); friend ostream& operator<< (ostream&,const matrix&); friend istream& operator>> (istream&, matrix&); };

26 21-26 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung matrix::matrix (int nrows, int ncols) {numrows=nrows; numcols=ncols; mat=new Vector* [numrows]; if (!mat) error ("row alloc failure in ¬ matrix::matrix(int, int)"); for (int i=0; i<numrows; ++i) { mat[i] = new Vector (numcols); if (!mat[i]) error ("col alloc failure in ¬ matrix::matrix(int, int)"); } }

27 21-27 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung matrix::matrix (int n) {numrows=numcols=n; mat=new Vector* [numrows]; if (!mat) error ("row alloc failure in ¬ matrix::matrix(int)"); for (int i=0; i<numrows; ++i) { mat[i] = new Vector (numcols); if (!mat[i]) error ("col alloc failure in ¬ matrix::matrix(int)"); } }

28 21-28 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung matrix::matrix (const matrix &m) {numrows=m.numrows; numcols=m.numcols; mat=new Vector* [numrows]; if (!mat) error ("row alloc failure in ¬ matrix::matrix(matrix&)"); for (int i=0; i<numrows; ++i) { mat[i] = new Vector (numcols); if (!mat[i]) error ("col alloc failure in ¬ matrix::matrix(matrix&)"); } for (int i=0; i<numrows; ++i) *mat[i]=*m.mat[i]; }

29 21-29 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung matrix::~matrix() { for (int i=numrows; i>0; --i) delete mat[i-1]; delete mat; } int matrix::range (int i) { return (i =numrows) ? ¬ (error ("matrix row index out of range!"), -1): i; }

30 21-30 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung int matrix::getsize() { if (numrows != numcols) {error ("getsize() requires square matrix"); } return numrows; } void matrix::swap(int i, int j) { Vector *tmp = mat[range(i)]; mat[i]=mat[range(j)]; mat[j]=tmp; }

31 21-31 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung matrix matrix::transpose() { int p=numrows, q=numcols; matrix mt(q,p);// create transposed matrix for (int i=0; i<q; ++i) { for (int j=0; j<p; ++j) mt.mat[i]->vec[j] = mat[j]->vec[i]; } return mt; }

32 21-32 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung matrix& matrix::operator=(const matrix &m) { if (m.numrows != numrows || m.numcols != numcols) error ("diff sizes in matrix& ¬ matrix::operator=(const matrix &m)!"); for (int i=0; i<numrows; ++i) *mat[i] = *m.mat[i]; return *this; }

33 21-33 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung Vector operator* (const matrix &m, const Vector &v) { int nr=m.numrows; if (m.numcols != v.size) error ("diff sizes in ¬ vector op*(const matrix&, const vector&)!"); Vector u(nr); for (int i=0; i < nr; ++i) u[i] = scalar(*m.mat[i], v); return u; }

34 21-34 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung Vector operator* (const Vector &v, const matrix &m) { int nr=m.numrows, nc = m.numcols; if (v.size != nr) error ("diff sizes in ¬ vector op* (const vector&, const matrix&)!"); Vector u(nc); for (int i=0; i < nc; ++i) { double t=0; for (int j=0; j < nr; ++j) t += v.vec[j] * m.mat[j]->vec[i]; u.vec[i] = t; } return u; }

35 21-35 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrizen: Implementierung ostream& operator<< (ostream &s, const matrix &m) { int nr=m.numrows; for (int i=0; i<nr; ++i) s << *m.mat[i]; return s; } istream& operator>> (istream &s, matrix &m) { int nr=m.numrows; cout << "\nenter " << nr << " row vectors\n\n"; for (int i=0; i<nr; ++i) { cout << "enter row vector " << i << "\n"; s >> *m.mat[i]; } return s; }

36 21-36 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Beispiel #include #include "error.cpp" #include "vector.cpp" #include "matrix.cpp"

37 21-37 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Beispiel int main() { int nr, nc; cout << "Enter number of rows of the matrix: "; cin >> nr; cout << "Enter number of columns of the matrix: "; cin >> nc; matrix m(nr,nc); Vector x(nc), b(nc); cout << "\nEnter matrix m\n"; cin >> m; cout << "Enter vector "; cin >> b; x = m*b; cout <<x; // x = b*m; cout << x ; return 0; }

38 21-38 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Beispiel: Ausgabe Enter number of rows of the matrix: 3 Enter number of columns of the matrix: 3 Enter matrix m enter 3 row vectors enter row vector 0enter 3 elements: v [0] = 1v [1] = 2v [2] = 3 enter row vector 1enter 3 elements: v [0] = 4v [1] = 5v [2] = 6 enter row vector 2enter 3 elements: v [0] = 7v [1] = 8v [2] = 9 Enter vector enter 3 elements: v [0] = 1v [1] = 0v [2] = 1 ( 4 | 10 | 16 | ) ( 8 | 10 | 12 | ) [Umbruch geändert GD]

39 21-39 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Anwendung: Gauß Ziel: Gaußsche Elimination zur Gleichungslösung Idee: Trianguläre Darstellung des Gleichungssystems, Dann rückwärts ausrechnen.

40 21-40 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Anwendung: Gauß Beispiel: 5x 0 + 2x 1 = 20 3x 0 + 4x 1 = 26 Triangulation: Ziehe (3/5)x Zeile 1 von Zeile 2 ab 5x 0 + 2x 1 = 20 (14/5)x 1 = 14 Rechne von unten nach oben die Lösung aus: x 1 = 5 Einsetzen von x 1 in die vorherige (hier erste) Zeile: 5x 0 + 2*5 = 20 x 0 = 2 in Matrixdarstellung:

41 21-41 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß-Elimination: Implementierung const double gauss0_toosmall=3.0E-7; void triangulate(matrix &a, Vector &b) // make matrix an upper triangular { int n=a.getsize(); for (int i=0; i<n-1; i++) { double diag = a[i][i]; if (fabs(diag) < gauss0_toosmall) // fabs means absolute value error ("diagonal too small in triangulate()"); for (int j=i+1; j<n; j++) { double mult=a[j][i]/diag; a[j]-= mult * a[i]; b[j]-= mult * b[i]; }} }

42 21-42 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß-Elimination: Implementierung void backsubst(matrix &a, Vector &x, Vector &b) // given triangulated a, solve for x given b { int n = a.getsize(); for (int i=n-1; i>=0; i--) { double diag = a[i][i]; if (fabs(diag) < gauss0_toosmall) // to avoid division by zero error ("diagonal too small in backsubst()"); x[i]=(b[i]-scalar(a[i], x))/diag; }} void gauss0 (matrix &m, Vector &x, Vector &b) {triangulate(m,b); backsubst(m, x, b); }

43 21-43 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Main: Implementierung int main() { int n; cout << "Enter number of variables" > n; matrix m(n);Vector x(n), b(n); cout > m; matrix m1=m; cout > b; gauss0 (m,x,b); cout << "Solution Vector x is:\n";cout << x; cout << "\n\nNow, the verification: " << endl; Vector u = m1*x; cout << "\nproduct vector is: " << u; return 0; }

44 21-44 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß-Elimination; Ausgabe für Beispiel Enter number of variables of the equation system: 2 Enter matrix m enter 2 row vectorsenter row vector 0 enter 2 elements: v [0] = 5v [1] = 2 enter row vector 1enter 2 elements: v [0] = 3v [1] = 4 Enter Vector benter 2 elements: v [0] = 20v [1] = 26 Solution Vector x is: ( 2 | 5 | ) Now, the verification: product vector is: ( 20 | 26 | )

45 21-45 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung 5x 0 + 2x 1 = 20 (14/5)x 1 = 14 Vertausche Gleichungen: (14/5)x 1 = 14 5x 0 + 2x 1 = 20 Gauß-Elimination versagt, da a 00 = 0, obwohl das Gleichungssystem lösbar ist (s. o.!). Lösung: Versuche Teilen durch 0 möglichst zu vermeiden. Passiert durch Pivotisierung.

46 21-46 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung Am Beispiel: 3x 0 + 4x 1 = 26 5x 0 + 2x 1 = 20 Suche zum zu betrachtenden Diagonalelement (zu Beginn a 00 ) größten Koeffizienten in der Spalte (aber nur darunter). Vertausche die aktuelle mit der/einer Zeile, die größten solchen Koeffizienten aufweist. 5x 0 + 2x 1 = 20 3x 0 + 4x 1 = 26 Führe hierfür Triangulation durch. (Dadurch wird immer durch größtmöglichen Koeffizienten geteilt)

47 21-47 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung: Implementierung double pivot (matrix &a, Vector &b, int i) { // row i to have largest element from lower col i as //diag int n=a.getsize(); int j=i;// row variable double t=0; for (int k=i; k<n; ++k)// find max elem { double aki=fabs(a[k][i]); if (aki > t) { t=aki; j=k; }} if (j>i)// swap equations { a.swap(i,j);// swap matrix rows b.swap(i,j); } // swap indices return a[i][i]; }

48 21-48 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß-Elimination: Implementierung void triangulate(matrix &a, Vector &b)//Wiederholung // make matrix an upper triangular { int n=a.getsize(); for (int i=0; i<n-1; i++) { double diag = a[i][i]; if (fabs(diag) < gauss0_toosmall) // fabs means absolute value error ("diagonal too small in triangulate()"); for (int j=i+1; j<n; j++) { double mult=a[j][i]/diag; a[j]-= mult * a[i]; b[j]-= mult * b[i]; } }}

49 21-49 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung: Implementierung void triangulate(matrix &a, Vector &b) // with pivoting { int n=a.getsize(); for (int i=0; i<n-1; ++i) { double diag = pivot (a,b,i); if (fabs(diag) < gauss0_toosmall) // to avoid division by zero error ("zero determinant!"); for (int j=i+1; j<n; ++j) { double mult=a[j][i]/diag; for (int k=i+1; k<n; ++k) a[j][k]-=mult*a[i][k]; b[j]-=mult*b[i]; } }}

50 21-50 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung: Implementierung double dotprod (Vector &u, Vector &v, int k1, int k2) {// sum u[i]*v[i], i=k1...k2 double sum=0; for (int i=k1; i<=k2; ++i) sum+=u[i]*v[i]; return sum; }

51 21-51 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß-Elimination: Implementierung Wiedhlg void backsubst(matrix &a, Vector &x, Vector &b) { int n = a.getsize(); for (int i=n-1; i>=0; i--) { double diag = a[i][i]; //....... x[i]=(b[i]-scalar(a[i], x))/diag; }} void gauss0 (matrix &m, Vector &x, Vector &b) { triangulate(m,b); backsubst(m, x, b); }

52 21-52 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung: Implementierung void backsubst(matrix &a, Vector &x, Vector &b) { int n = a.getsize(); for (int i=n-1; i>=0; i--) { double diag = a[i][i]; x[i]=(b[i]-dotprod(a[i],x,i+1,n-1))/diag; }} void gauss (matrix &m, Vector &x, Vector &b) { triangulate(m,b); backsubst(m, x, b); }

53 21-53 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung: Implementierung int main() { int n; cout << "Enter number of variables > n; matrix m(n); Vector x(n), b(n); cout > m; matrix m1=m; cout > b; gauss (m,x,b); cout << "Solution Vector x is:\n"; cout << x; cout << "\n\nNow, the verification: " << endl; Vector u = m1*x; cout << "\nproduct vector is: " << u; return 0; }

54 21-54 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Gauß mit Pivotisierung: Implementierung Ausgabe: Enter number of variables of the equation system: 3 Enter matrix m enter 3 row vectors enter row vector 0 enter 3 elements: v [0] = 3v [1] = 5v [2] = 1 enter row vector 1enter 3 elements: v [0] = 2v [1] = 4v [2] = 5 enter row vector 2enter 3 elements: v [0] = 1v [1] = 2v [2] = 2 Enter Vector benter 3 elements: v [0] = 4v [1] = -9v [2] = -3 Solution Vector x is:( -1 | 2 | -3 | ) Now, the verification: product vector is: ( 4|-9|-3|)

55 21-55 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Multiplikation: Implementierung Ergänzung um Matrix-Multiplikation in: class Vector {.... friend matrix operator* ¬ (const matrix&, const matrix&);.....} class matrix {.... friend matrix operator* ¬ (const matrix&, const matrix&);.....}

56 21-56 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix -Multiplikation: Implementierung matrix operator* (const matrix &m1, const matrix &m2) // caution: friend-declaration in "matrix" and // "Vector" necessary. { int r,c; if (m1.numcols != m2.numrows) error ("Dimensions of the two matrices ¬ don't fit in ¬ operator* (const matrix &m1, const matrix &m2)"); r=m1.numrows; c=m2.numcols; // dimension of the result-matrix;..... }

57 21-57 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix -Multiplikation: Implementierung matrix operator* (const matrix &m1, const matrix &m2) // Fortsetzung {...... matrix mult(r,c); for (int i=0; i < r; ++i) {for (int k =0;k<c;++k) { double t=0; for (int j=0; j < m1.numcols; ++j) t += m1.mat[i]->vec[j] * m2.mat[j]->vec[k]; mult.mat[i]->vec[k] = t; }} return mult; }

58 21-58 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Multiplikation: main int main() { int r1,c1,r2,c2; cout > r1; cout > c1; matrix m1(r1,c1); cin >> m1; cout > r2; cout > c2; matrix m2(r2,c2); cin >> m2; matrix mult (r1,c2); mult=m1*m2; cout << "\nErgebnis der Multiplikation:" << endl; cout << m1 <<endl; cout << "\n*\n"; cout << m2; cout << "\n=\n"; cout << mult; cout << "\n Transponierte Matrix:\n"; cout << m1.transpose(); return 0; }

59 21-59 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Multiplikation: Ausgabe Enter number of rows: 2 Enter number of cols: 2 enter 2 row vectors enter row vector 0enter 2 elements: v [0] = 1v [1] = 2 enter row vector 1enter 2 elements: v [0] = 1v [1] = 2 Enter number of rows: 2Enter number of cols: 2 enter 2 row vectors enter row vector 0enter 2 elements: v [0] = 1v [1] = 1 enter row vector 1enter 2 elements: v [0] = 1v [1] = 1

60 21-60 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Multiplikation: Ausgabe // Fortsetzung Ergebnis der Multiplikation: ( 1 | 2 | ) * ( 1 | 1 | ) = ( 3 | 3 | ) Transponierte Matrix: ( 1 | 1 | ) ( 2 | 2 | )

61 21-61 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Invertierung: Implementierung Ergänzung zu Gauss: matrix identity (int n) { matrix m(n); // initialized to zero for (int i=0; i<n; ++i) m[i][i]=1; return m; }

62 21-62 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Invertierung: Implementierung matrix invert (const matrix& m) { int n=m.numcols; matrix m2=m; matrix e=identity(n); matrix result(n); Vector x(n); for (int r=0; r<n;++r) { gauss (m2,x,*e.mat[r]); // Gauss changes m2 *result.mat[r]=x; // columnvectors are included // as rows. Therefore "transpose" below ! m2=m; } result=result.transpose(); return result; }

63 21-63 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Invertierung: Implementierung matrix invert (const matrix& m) int main() { int n; cout << "Enter number of rows of matrix to invert: "; cin >> n; matrix m(n), m1(n); Vector x(n); cout << "\nEnter matrix m\n"; cin >> m; cout << "inverse matrix:" << endl;; cout << invert (m) << endl; m1=invert (m); m1= m*m1; cout << m1; return 0; }

64 21-64 Prof. Dr. G. Dittrich 01.07.2000 EINI II Kap. 21: Zur Rechnung mit Matrizen Matrix-Invertierung: Ausgabe Enter number of rows of matrix to invert: 3 Enter matrix menter 3 row vectors enter row vector 0enter 3 elements: v [0] = 3v [1] = 5v [2] = 1 enter row vector 1enter 3 elements: v [0] = 2v [1] = 4v [2] = 5 enter row vector 2enter 3 elements: v [0] = 1v [1] = 2v [2] = 2 inverse matrix: ( 2 | 8 | -21 | ) ( -1 | -5 | 13 | ) ( 0 | 1 | -2 | ) Matrix mal Inverse: ( 1 | 3.10862e-15 | -8.88178e-16 | ) ( 0 | 1 | -4.44089e-15 | ) ( 0 | 8.88178e-16 | 1 | )


Herunterladen ppt "01.07.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure."

Ähnliche Präsentationen


Google-Anzeigen