54 lines
1.3 KiB
C++
54 lines
1.3 KiB
C++
/* $Header: /var/lib/cvs/dynare_cpp/sylv/cc/IterativeSylvester.cpp,v 1.1.1.1 2004/06/04 13:00:20 kamenik Exp $ */
|
|
|
|
/* Tag $Name: $ */
|
|
|
|
#include "IterativeSylvester.h"
|
|
#include "KronUtils.h"
|
|
|
|
void IterativeSylvester::solve(SylvParams& pars, KronVector& x) const
|
|
{
|
|
int max_steps = *(pars.max_num_iter);
|
|
int steps = 1;
|
|
double max_norm = *(pars.convergence_tol);
|
|
double norm = performFirstStep(x);
|
|
|
|
QuasiTriangular* kpow = matrixK->clone();
|
|
QuasiTriangular* fpow = matrixF->clone();
|
|
while (steps < max_steps && norm > max_norm) {
|
|
kpow->multRight(SqSylvMatrix(*kpow)); // be careful to make copy
|
|
fpow->multRight(SqSylvMatrix(*fpow)); // also here
|
|
norm = performStep(*kpow, *fpow, x);
|
|
steps++;
|
|
}
|
|
|
|
delete fpow;
|
|
delete kpow;
|
|
|
|
pars.converged = (norm <= max_norm);
|
|
pars.iter_last_norm = norm;
|
|
pars.num_iter = steps;
|
|
}
|
|
|
|
double IterativeSylvester::performFirstStep(KronVector& x) const
|
|
{
|
|
KronVector xtmp((const KronVector&)x);
|
|
KronUtils::multKron(*matrixF, *matrixK, xtmp);
|
|
x.add(-1., xtmp);
|
|
double norm = xtmp.getMax();
|
|
return norm;
|
|
}
|
|
|
|
double IterativeSylvester::performStep(const QuasiTriangular& k, const QuasiTriangular& f,
|
|
KronVector& x)
|
|
{
|
|
KronVector xtmp((const KronVector&)x);
|
|
KronUtils::multKron(f, k, xtmp);
|
|
x.add(1.0, xtmp);
|
|
double norm = xtmp.getMax();
|
|
return norm;
|
|
}
|
|
|
|
// Local Variables:
|
|
// mode:C++
|
|
// End:
|