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