Konjugierte Gradienten Verfahren



  • Hallo.
    Vielleicht kennt sich hier jemand mit konjugierten Gradienten aus. Ich sehe leider den Fehler in meinem Programm nicht. Laut Fehlerausgabe ist die Lösung viel zu ungenau.

    int cg (Sparse_Matrix &A , const Vektor &b , Vektor &x0 , int k_max , double &eps) {
    
    	double a_k, b_k;
    	cout << k_max;
    
    if (x0.Laenge()==1) 
    	{
    		x0.ReDim(b.Laenge());
    		for (int i=0; i<x0.Laenge(); ++i) x0(i)=1;	
    	}
    
    	if (A.Zeilen()!=b.Laenge() || A.Zeilen()!=x0.Laenge() || b.Laenge()!=x0.Laenge())
    		return -1;
    
    	// Symmetrisch?
    	for (int i = 0; i<A.Zeilen(); i++) 
    		for (int j=0; j<A.Zeilen(); j++) {
    			if (A(i,j)!=A(j,i))
    				cout << "Warnung: Matrix nicht symmetrisch!" << endl;
    			break;
    		}
    
    	Vektor r = Vektor(b.Laenge());
    	Vektor q = Vektor(b.Laenge());
    	Vektor d = Vektor(b.Laenge());
    	r = b-(A*x0);
    	d = r;
    
    	for (int k = 0; k<k_max; ++k) {
    
    		a_k = (r.Norm2()*r.Norm2())/((A*d)*d);
    		x0 += a_k*d;
    		q = r- a_k*(A*d);
    		b_k = (q.Norm2()*q.Norm2())/(r.Norm2()*r.Norm2());
    
    		if ((r.Norm2())<eps) {
    			eps = r.Norm2();
    			return k;                    //War das Programm erfolgreich, soll die Anzahl der Iterationsschritte angegeben werden
    				     }
    
    	}
    
    	return 0;                  //Rückgabe beim Erreichen der maximalen, vorgegebenen, Anzahl der Iterationsschritte
    ;
    
    }
    

    Wenn mir da einer helfen könnte, wäre das echt toll.
    Viele Grüße


Log in to reply