1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| Vecteur MatriceBande::GradientConjugue(const Vecteur &B, double epsilon)
{
MatriceBande &M = (*this);
Vecteur r0(N), r1(N), x0(N), p0(N);
double a, b;
int n = 0, Nmax=100000;
r0 = B - M*x0;
p0 = r0;
b = 0;
while (r0.NormeCarree() >= epsilon*epsilon)
{
n++;
if (n>Nmax)
{
cout << " Le gradient conjugue n'a pas converge en moins de "<< Nmax <<" iterations." << endl;
cout << " (||r||^2 = " << r0.NormeCarree()<< " )" << endl;
break;
}
a = r0.NormeCarree() / (M*p0*p0);
x0 = x0 + a*p0;
r1 = r0;
r0 = r0 - a*(M*p0);
p0 = r0 + b*p0;
b = r0.NormeCarree() / r1.NormeCarree();
}
return x0;
} |
Partager