最近,我正在研究使用C ++语言的迭代求解器。为了获得更好的迭代,必须做一些预处理。但现在我遇到了一个严重的问题。没有jacobi预处理器,我可以得到一个好结果。应用此预处理器后,迭代无法收敛!
我认为问题是关于我在jacobi预处理器中所做的乘法。在代码data
中是我从MatrixMarket获得的矩阵中元素的值。一般来说,它大约是10e8或更高。
我不知道如何解决这个问题。
我附上了关于jacobi预处理器的代码
densematrixvector_imp.h
//Jacobi Preconditioner
template <class M, class V>
void preconditoner(const std::string & filename, M &A, V &b) {
std::ifstream myfile;
myfile.open(filename.c_str());
int MM, NN, PP;
// ignore headers and comments
while(myfile.peek()=='%') myfile.ignore(2048,'\n');
//information from MatrixMarket MM is number of rows
//NN is number of columns, PP is terms
myfile>>MM>>NN>>PP;
double *PRE=new double[MM];
// get information from MatrixMarket
for(int i=0, j=0; i<PP; i++) {
// mm is the row of element, nn is the column of element
// data is the value of element
int mm,nn;
double data;
myfile>>mm>>nn>>data;
if(mm==nn) {
// inverse of P : Pii=( 1/Aii )
PRE[j]=1./data;
j++;
}
}
// Jacobi preconditioner with Yale sparse matrix format : (inverse of P) *A
for(int i=0; i<A.m; i++) {
for(int j=A.columnptr[i]; j<A.columnptr[i+1]; j++) {
A.a[j]=A.a[j]*PRE[A.lineindex[j]];
}
}
// right hand side : (inverse of P )*b
for(int i=0; i<A.m; i++) b.a[i]=b.a[i]*PRE[i];
}