aatami_start.m setAnalysisMode ———— 设置分析模式 ———— Global Af_analysisMode ———— setupInit.txt ———— loadCtrlGUI.txt lMakeInterp 插入法求效率 mat erfcore(mat x, int jint) { //if ~isreal(x), // error('MATLAB:erfcore:ComplexInput', 'Input argument must be real.') //end rowvec tmp; tmp << gNaN; mat result = repmat(tmp, x.n_rows, x.n_cols); mat y, z, xnum, xden, del; // evaluate erf for |x| <= 0.46875 double xbreak = 0.46875; uvec k = find(abs(x) <= xbreak); if(!k.is_empty()) //if ~isempty(k) { mat a;// = [3.16112374387056560e00; 1.13864154151050156e02; 3.77485237685302021e02; 3.20937758913846947e03; 1.85777706184603153e-1]; mat b;// = [2.36012909523441209e01; 2.44024637934444173e02; 1.28261652607737228e03; 2.84423683343917062e03]; a << 3.16112374387056560e00 << 1.13864154151050156e02 << 3.77485237685302021e02 << 3.20937758913846947e03 << 1.85777706184603153e-1; b << 2.36012909523441209e01 << 2.44024637934444173e02 << 1.28261652607737228e03 << 2.84423683343917062e03; y = abs( x(k) ); //y = abs(x(k)); z = y % y; xnum = a(4)*z; // xnum = a(5)*z; xden = z; for(int i=0; i<3; i++) { xnum = (xnum + a(i)) % z; xden = (xden + b(i)) % z; } result(k) = x(k) % (xnum + a(3)) / (xden + b(3)); // result(k) = x(k) % (xnum + a(4)) / (xden + b(4)); if(jint != 0) result(k) = 1 - result(k); //result(k) = 1 - result(k); if(jint == 2) result(k) = exp(z) % result(k); //result(k) = exp(z) % result(k); } // evaluate erfc for 0.46875 <= |x| <= 4.0 k = find((abs(x) > xbreak) && (abs(x) <= 4.)); if(!k.is_empty()) { mat c;/* = [5.64188496988670089e-1; 8.88314979438837594e00; 6.61191906371416295e01; 2.98635138197400131e02; 8.81952221241769090e02; 1.71204761263407058e03; 2.05107837782607147e03; 1.23033935479799725e03; 2.15311535474403846e-8];*/ mat d;/* = [1.57449261107098347e01; 1.17693950891312499e02; 5.37181101862009858e02; 1.62138957456669019e03; 3.29079923573345963e03; 4.36261909014324716e03; 3.43936767414372164e03; 1.23033935480374942e03];*/ c << 5.64188496988670089e-1 << 8.88314979438837594e00 << 6.61191906371416295e01 << 2.98635138197400131e02 << 8.81952221241769090e02 << 1.71204761263407058e03 << 2.05107837782607147e03 << 1.23033935479799725e03 << 2.15311535474403846e-8; d << 1.57449261107098347e01 << 1.17693950891312499e02 << 5.37181101862009858e02 << 1.62138957456669019e03 << 3.29079923573345963e03 << 4.36261909014324716e03 << 3.43936767414372164e03 << 1.23033935480374942e03; y = abs( x(k) );//y = abs(x(k)); xnum = c(8) * y; //xnum = c(9)*y; xden = y; for(int i=0; i<7; i++) { xnum = (xnum + c(i)) % y; xden = (xden + d(i)) % y; } result(k) = (xnum + c(7)) / (xden + d(7)); // result(k) = (xnum + c(8)) / (xden + d(8)); if(jint != 2) { z = fix(y*16)/16; del = (y-z)%(y+z); result(k) = exp(-z%z) % exp(-del) % result(k); // result(k) = exp(-z%z) % exp(-del) % result(k); } } // evaluate erfc for |x| > 4.0 k = find(abs(x) > 4.0); if(!k.is_empty()) { mat p;/* = [3.05326634961232344e-1; 3.60344899949804439e-1; 1.25781726111229246e-1; 1.60837851487422766e-2; 6.58749161529837803e-4; 1.63153871373020978e-2]*/; mat q;/* = [2.56852019228982242e00; 1.87295284992346047e00; 5.27905102951428412e-1; 6.05183413124413191e-2; 2.33520497626869185e-3];*/ p << 3.05326634961232344e-1 << 3.60344899949804439e-1 << 1.25781726111229246e-1 << 1.60837851487422766e-2 << 6.58749161529837803e-4 << 1.63153871373020978e-2; q << 2.56852019228982242e00 << 1.87295284992346047e00 << 5.27905102951428412e-1 << 6.05183413124413191e-2 << 2.33520497626869185e-3; y = abs( x(k) ); //y = abs(x(k)); z = 1 / (y % y); xnum = p(5)*z; // xnum = p(6)%z; xden = z; for(int i=0; i<4; i++) { xnum = (xnum + p(i)) % z; xden = (xden + q(i)) % z; } result(k) = z % (xnum + p(4)) / (xden + q(4)); // result(k) = z % (xnum + p(5)) / (xden + q(5)); result(k) = (1/sqrt(pi_) - result(k)) / y; // result(k) = (1/sqrt(pi_) - result(k)) / y; if(jint != 2) { z = fix(y*16)/16; del = (y-z)%(y+z); result(k) = exp(-z%z) % exp(-del) % result(k); // result(k) = exp(-z%z) % exp(-del) % result(k); k = find_nonfinite(result); //k = find(~isfinite(result)); MatAssign(result, k, 0); } } // fix up for negative argument, erf, etc. if(jint == 0) { k = find(x > xbreak); result(k) = (0.5 - result(k)) + 0.5; k = find(x < -xbreak); result(k) = (-0.5 + result(k)) - 0.5; } else if(jint == 1) { k = find(x < -xbreak); result(k) = 2. - result(k); } else // jint must = 2 { k = find(x < -xbreak); z = fix( x(k) * 16 )/16; del = (x(k)-z)%(x(k)+z); y = exp(z%z) % exp(del); result(k) = (y+y) - result(k); // result(k) = (y+y) - result(k); } return result; }