#include #include #include #include "nr.h" using namespace std; void NR::linbcg(Vec_I_DP &b, Vec_IO_DP &x, const int itol, const DP tol, const int itmax, int &iter, DP &err) { DP ak,akden,bk,bkden=1.0,bknum,bnrm,dxnrm,xnrm,zm1nrm,znrm; const DP EPS=1.0e-14; int j; int n=b.size(); Vec_DP p(n),pp(n),r(n),rr(n),z(n),zz(n); iter=0; atimes(x,r,0); for (j=0;j EPS*znrm) { dxnrm=fabs(ak)*snrm(p,itol); err=znrm/fabs(zm1nrm-znrm)*dxnrm; } else { err=znrm/bnrm; continue; } xnrm=snrm(x,itol); if (err <= 0.5*xnrm) err /= xnrm; else { err=znrm/bnrm; continue; } } cout << "iter=" << setw(4) << iter+1 << setw(12) << err << endl; if (err <= tol) break; } }