具有大数值的Jacobi预处理器的计算误差

时间:2015-12-27 02:51:15

标签: c++ matrix

最近,我正在研究使用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];


}

0 个答案:

没有答案