R03

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

R03
wofür steht nIter !?!?

Es wird ja sowieso gleich auf 0 gesetzt, von daher ist das als Parameterübergabe schon etwas sinnfrei? Oder übersehe ich da etwas?


Anzahl der Iterationen.

Edit: Steht jetzt auch auf den Uebungsblatt! Ist ein Rueckgabewert


Ist dieses Blatt die letzte Rechnerübung? Oder wird es noch eine geben?



drei oder vier mal sehen…


hi,
hab nochmal ne frage zum jacobi verfahren.

die berechnungsformel für die einzelnen werte des neuen vektors (in der aufgabe = updated) lautet doch:

x_{i}^{n+1} = 1/a_{i,i} * (b_{i} - Summe(a_{i,j}*x_{j}^{n})) oder ? (gibts hier im forum eigentlich ne möglichkeit formeln irgendwie einzugeben ?)

so wenn ich jetzt zum beispiel die Matrix A0.mat

    2  -1   0   0   0
   -1   2  -1   0   0

A0 = 0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2

aus dem data-verzeichnis nehme und für x0 = (1 1 1 1 1) und für b = (-1 -1 -1 -1 -1) annehme kommt man als exakte Lösung auf (-2,5 -4 -4,5 -4 -2,5)

mein Vector nach dem ersten Schritt des Jacobi-Verfahrens lautet (0,5 1 1 1 0,5). dadurch dass alle diagonalelemente von A0 gleich 2 sind werden die Elemente meines Ergebnisvektors mit jedem Schritt kleiner(könnt ihr ja auch mal ausprobieren). Meine Lösung konvergiert also auf keinen Fall gegen das exakte Ergebnis.

sollte das überhaupt konvergieren ? Die Matrix ist ja nicht strikt Diagonaldominant. Oder hab ich beim Jacobi Verfahren nen Fehler ?

mfg,
Hendrik


Also bei mir konvergiert das Verfahren nach 21 Iterationen glaube ich und der Lösungsverctor stimmt mit dem im Beispiel überein. Also ich glaube du hast irgendwo nen Fehler!


hmm ok^^ kann mir jemand sagen, ob meine Berechnung des neuen Vektors ueberhaupt stimmt ?


Stimmt nicht!

Hinweis: Du summierst ueber eine Element zu viel!


Aufgabe 4, ist der Integer der übergeben wird die Größe der Matrix wie auf dem Aufgabenblatt steht oder irgend eine subMatrixSize wie im code steht, wenn ja welche Submatrix?


ach ja, und außerdem was zur hölle sollen wir da machen :stuck_out_tongue:


wenn du auf die folien schaust, wird klar was zu tun ist.


jo, das erinnert mich an das alte lied “ein loch ist im eimer liebe liesl, liebe liesl …”
ich werd mal mein hirn zermartern :wink:


hi,
hab ne frage zum SOR-Verfahren:

duerfen wir den Relaxationsparameter selbst waehlen ? Oder muessen wir den irgendwo ausrechnen…
ciao


selber waehlen. irgendwas zwischen ]0 2[


edit: hmne…ich glaube die idee war falsch…
was genau muss man da jetzt machen ? die matrix sieht ja immer gleich aus oder ? immer diese spezielle struktur, wie in den folien und immer der größe n^2*n^2 . (Da hätte ich mal ne Frage: in Aufgabe 4.1 war n=5 und als Lösung hab ich da ne 16x16 matrix rausbekommen. Also der Dimension (n-1)^2 * (n-1)^2 und nicht 25x25 wies in den Folien steht. Was ist jetzt richtig ?)
Und wenn man die Matrix dann aufgestellt hat, was macht man dann mit den übergebenen Vektoren rightHandSide und initialGuess ? Braucht man die überhaupt ?
Wie kann ich denn meine Interationsverfahren mit der Matrix testen ? Ich versteht irgendwie noch nicht ganz, wozu die überhaupt da ist, also was man mit der machen kann.

mfg,
hendrik


hm jemand ne antwort auf meine frage ? :slight_smile:
gibts es denn jetzt eigentlich ein testscript ?
und nochne frage zum Blatt3: konvergieren die Verfahren denn für alle angegebenen Matrizen und Vektoren aus dem data Vereichnis ?
mfg
henne


soviel ich verstanden habe, du musst nur die Matrix (nn,nn) mit Einträgen füllen, wie es in der Vorlesung beschrieben ist. Die Vektoren rightHandSide und initialGuess brauchste um deine jacobi, sor und gausseidel zu testen.
…Nein die Verfahren konvergieren nicht für alle Matrizen aus DATA…weil du hast ja dort nicht alle Matrizen diagonal dominant…aber ich glaube, die haben paar LösungsVectoren vertauscht…muss mal ein wenig aufpassen :wink:


in farbe … und bunt …

#include "SquareMatrix.h"
#include "Vector.h"
#include "Solver.h"
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <cmath>

//credits to benni :D

////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ANMERKUNGEN !!!!!!
// keine garantien!!
// 	have phun........
////////////////////////////////////////////////////////////////////////////////////////////////////////////

using namespace std;

#define delim "/////////////////////////////////////////////////////////////////////////////////////////////\n"
#define total_tests (22)
int passed=0;


static void compare(Vector &a, Vector &b) {

	assert(a.n() == b.n());

	for ( int i = 0; i < a.n(); i++) {
		
			if( fabs(a(i)-b(i)) > 1e-5)   {
				cout<<"... \033[31m[FAIL]\033[0m"<<endl;  return; 
			}
		
	}
	cout<<"... \033[32m[OK]\033[0m"<<endl;
	passed++;
	
}

static void m_compare(SquareMatrix & A2, SquareMatrix & l_ref) {
	
	assert(A2.n() == l_ref.n() );
	
	for (int i=0;i<A2.n();i++) {
		for(int j=0;j<A2.n();j++) {

				if( fabs(A2(i,j)-l_ref(i,j)) > 1e-5)   {
					cout<<"... \033[31m[FAIL]\033[0m"<<endl;  return; 
				}
			
		}
	}
	cout<<"... \033[32m[OK]\033[0m"<<endl;
	passed++;	
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////

int main ( int argc, char** argv )
{
	bool conv=false; 
	double resi=0.0;
	int nIter = 0; 
	
	cout << "\n\nTest script fuer R03, keine Garantie auf Korrektheit !\n";
	cout << "1) Jacobi \n";
	cout << delim << endl;

	for ( int i = 0; i<6; i++) {

		char mat_file[64];
		sprintf(mat_file, "data/A%d.mat", i);
		const SquareMatrix A1(mat_file);

		char init_file[64];
		sprintf(init_file, "data/x%d.vec", i);
		const Vector init(init_file);

		char right_file[64];
		sprintf(right_file, "data/b%d.vec", i);
		const Vector right(right_file);
		Vector v = IterativeSolver::jacobi(A1, right, init, conv, resi, nIter, 10000, 1e-6);

		char ref_file[64]; 
		sprintf(ref_file, "data/ref_J_%d.vec", i);
		Vector v_ref = Vector(ref_file);


		cout << "data " << i <<" conv " << conv << " resi " << resi << " nIter " << nIter;
		compare(v, v_ref);
		cout << "reference vector v:\n" << v_ref;
		cout << "output vector: \n"<< v <<endl;	
	}

	cout << "2) Gauss Seidel \n";
	cout << delim << endl;

	for ( int i = 0; i<6; i++) {
		char mat_file[64];
		sprintf(mat_file, "data/A%d.mat", i);
		const SquareMatrix A1(mat_file);

		char init_file[64];
		sprintf(init_file, "data/x%d.vec", i);
		const Vector init(init_file);

		char right_file[64];
		sprintf(right_file, "data/b%d.vec", i);
		const Vector right(right_file);
		Vector v = IterativeSolver::gaussseidel(A1, right, init, conv, resi, nIter, 10000, 1e-6);

		char ref_file[64]; 
		sprintf(ref_file, "data/ref_GS_%d.vec", i);
		Vector v_ref = Vector(ref_file);


		cout << "data " << i <<" conv " << conv << " resi " << resi << " nIter " << nIter ;
		compare(v, v_ref);
		cout << "reference vector v:\n" << v_ref;
		cout << "output vector: \n"<< v <<endl;	
	}

	cout << "3) a) SOR 1.7 \n";
	cout << delim << endl;

	for ( int i = 0; i<1; i++) {
		char mat_file[64];
		sprintf(mat_file, "data/A%d.mat", i);
		const SquareMatrix A1(mat_file);

		char init_file[64];
		sprintf(init_file, "data/x%d.vec", i);
		const Vector init(init_file);

		char right_file[64];
		sprintf(right_file, "data/b%d.vec", i);
		const Vector right(right_file);
		Vector v = IterativeSolver::sor(A1, right, init, 1.7, conv, resi, nIter, 10000, 1e-6);

		char ref_file[128]; 
		sprintf(ref_file, "data/ref_SOR_%d_omega_1.7.vec", i);
		Vector v_ref = Vector(ref_file);

		cout << "data " << i <<" conv " << conv << " resi " << resi << " nIter " << nIter ;
		compare(v, v_ref);
		cout << "reference vector v:\n" << v_ref;
		cout << "output vector: \n"<< v <<endl;
	}

	cout << "3) b) SOR 1.05 \n";
	cout << delim << endl;

	for ( int i = 1; i<4; i++) {
		char mat_file[64];
		sprintf(mat_file, "data/A%d.mat", i);
		const SquareMatrix A1(mat_file);

		char init_file[64];
		sprintf(init_file, "data/x%d.vec", i);
		const Vector init(init_file);

		char right_file[64];
		sprintf(right_file, "data/b%d.vec", i);
		const Vector right(right_file);
		Vector v = IterativeSolver::sor(A1, right, init, 1.05, conv, resi, nIter, 10000, 1e-6);

		char ref_file[128]; 
		sprintf(ref_file, "data/ref_SOR_%d_omega_1.05.vec", i);
		Vector v_ref = Vector(ref_file);

		cout << "data " << i <<" conv " << conv << " resi " << resi << " nIter " << nIter ;
		compare(v, v_ref);
		cout << "reference vector v:\n" << v_ref;
		cout << "output vector: \n"<< v <<endl;	
	}
	cout << "3) c) SOR 0.9 \n";
	cout << delim << endl;



	for ( int i = 4; i<6; i++) {
		char mat_file[64];
		sprintf(mat_file, "data/A%d.mat", i);
		const SquareMatrix A1(mat_file);

		char init_file[64];
		sprintf(init_file, "data/x%d.vec", i);
		const Vector init(init_file);

		char right_file[64];
		sprintf(right_file, "data/b%d.vec", i);
		const Vector right(right_file);
		Vector v = IterativeSolver::sor(A1, right, init, 0.9, conv, resi, nIter, 10000, 1e-6);

		char ref_file[128]; 
		sprintf(ref_file, "data/ref_SOR_%d_omega_0.9.vec", i);
		Vector v_ref = Vector(ref_file);

		cout << "data " << i <<" conv " << conv << " resi " << resi << " nIter " << nIter ;
		compare(v, v_ref);
		cout << "reference vector v:\n" << v_ref;
		cout << "output vector: \n"<< v <<endl;
	}

	cout << "4) 2D La Place \n";
	cout << delim << endl;

	SquareMatrix A2(64);
	SquareMatrix laplace_ref("data/ALaplace8.mat");
	Vector laplace_right(A2.n());
	Vector laplace_init(A2.n());	

	cout<<"La Place Erstellung ";

	IterativeSolver::create2DLaplaceSystem(8, A2, laplace_right, laplace_init);
	m_compare(A2,laplace_ref);
	cout<<A2<<endl<<endl;


	cout << "5) a) 2D La Place --> Jacobi\n";
	cout << delim << endl;
	Vector v = IterativeSolver::jacobi(A2, laplace_right, laplace_init, conv, resi, nIter, 10000, 1e-6);
	Vector j_laplace_ref("data/ref_J_Laplace8.vec");
	compare(v,j_laplace_ref);
	cout << "reference vector v:\n" <<j_laplace_ref;
	cout << "output vector: \n"<< v <<endl;


	cout << "5) b) 2D La Place --> Gauss-Seidel\n";
	cout << delim << endl;
	v = IterativeSolver::gaussseidel(A2, laplace_right, laplace_init, conv, resi, nIter, 10000, 1e-6);
	Vector gs_laplace_ref("data/ref_GS_Laplace8.vec");
	compare(v,gs_laplace_ref);
	cout << "reference vector v:\n" <<gs_laplace_ref;
	cout << "output vector: \n"<< v <<endl;

	
	cout << "5) c) 2D La Place --> SOR 1.7\n";
	cout << delim << endl;
	v = IterativeSolver::sor(A2, laplace_right, laplace_init, 1.7,conv, resi, nIter, 10000, 1e-6);
	Vector sor_laplace_ref("data/ref_SOR_Laplace8_omega_1.7.vec");
	compare(v,sor_laplace_ref);
	cout << "reference vector v:\n" <<sor_laplace_ref;
	cout << "output vector: \n"<< v <<endl;	


	cout << "6) Minimum fuer 'optimalen Relaxationsparameter für das SOR-Verfahren bei n = 8' \n";
	cout << delim << endl;

	int min=10000;
	double o_min=1000.0;

	for (double d=1.400;d<1.600;d+=0.001) {
		IterativeSolver::sor(laplace_ref, laplace_right, laplace_init, d ,conv, resi, nIter, 100, 1e-6);
//		cout<<nIter<<" Iterationen bei ω = "<<d<<endl;		
		if (nIter<min) { min=nIter; o_min = d; }
	}
	cout<<"Das errechnete Minimum ist : "<<min<<" Iterationen bei ω = "<<o_min<<endl<<endl;


	cout<<"\n"<<delim<<endl<<"Alle Tests fertig.  "<< passed << " von "<<total_tests<<" 'bestanden'."<<endl;
	if (total_tests == passed) cout<<"Alle Tests erfolgreich bestanden. Gratulation!"<<endl<<endl;	

	return 0;

}