35 std::cout<<
"Approximation bounds are ["<<
apstrt<<
","<<
apend<<
"]\n";
36 std::cout<<
"Precision of arithmetic is "<<precision<<std::endl;
106 unsigned long pnum,
unsigned long pden)
110 return generateApprox(num_degree, den_degree, pnum, pden, 0, a_param, a_pow);
115 unsigned long pnum,
unsigned long pden,
116 int a_len,
double *a_param,
int *a_pow)
118 std::cout<<
"Degree of the approximation is ("<<num_degree<<
","<<den_degree<<
")\n";
119 std::cout<<
"Approximating the function x^("<<pnum<<
"/"<<pden<<
")\n";
122 if (num_degree !=
n || den_degree !=
d)
allocate(num_degree,den_degree);
129 for (
int j=0; j<a_len; j++) {
149 std::cout<<
"Iteration " <<
iter-1<<
" spread "<<(double)
spread<<
" delta "<<(
double)
delta<<std::endl;
153 std::cout<<
"Delta too small, try increasing precision\n";
162 double error = (double)
getErr(
mm[0],&sign);
163 std::cout<<
"Converged at "<<
iter<<
" iterations; error = "<<error<<std::endl;
167 std::cout<<
"Root finding failed\n";
182 std::cout<<
"Cannot handle case: Numerator degree neq Denominator degree\n";
187 std::cout<<
"Approximation not yet generated\n";
192 std::cout<<
"Roots not found, so PFE cannot be taken\n";
199 for (
int i=0; i<
n; i++) r[i] =
roots[i];
200 for (
int i=0; i<
d; i++) p[i] =
poles[i];
206 *Norm = (double)
norm;
207 for (
int i=0; i<
n; i++) Res[i] = (
double)r[i];
208 for (
int i=0; i<
d; i++) Pole[i] = (
double)p[i];
221 std::cout<<
"Cannot handle case: Numerator degree neq Denominator degree\n";
226 std::cout<<
"Approximation not yet generated\n";
231 std::cout<<
"Roots not found, so PFE cannot be taken\n";
239 for (
int i=0; i<
n; i++) {
249 for (
int i=0; i<
n; i++) {
250 Res[i] = (double)r[i];
251 Pole[i] = (double)p[i];
272 for (
long i = 1; i < ncheb; i++) {
273 r = 0.5 * (1 -
cos((
M_PI * i)/(
double)
a));
275 r = (
exp((
double)r)-1.0)/(
exp(1.0)-1.0);
281 for (
long i = 0; i <= ncheb; i++) {
282 r = 0.5 * (1 -
cos(
M_PI * (2*i+1)/(
double)
a));
284 r = (
exp((
double)r)-1.0)/(
exp(1.0)-1.0);
294 for (
int i = 1; i <
neq; i++)
step[i] =
xx[i] -
xx[i-1];
301 int i, meq, emsign, ensign, steps;
311 for (i = 0; i < meq; i++) {
314 if (i == meq-1) xx1 =
apend;
319 if (xn < xx0 || xn >= xx1) {
335 if (++steps > 10)
break;
348 if (eclose > ym) eclose = ym;
349 if (farther < ym) farther = ym;
354 q = (farther - eclose);
355 if (eclose != 0.0) q /= eclose;
359 for (i = 0; i <
neq; i++) {
361 if (q != 0.0) q = yy[i] / q - (
bigfloat)1l;
364 q *=
mm[i+1] -
mm[i];
369 for (i = 0; i <
neq; i++) {
371 if (xm <=
apstrt)
continue;
372 if (xm >=
apend)
continue;
390 for (i = 0; i <
neq; i++) {
397 for (j = 0; j <=
n; j++) {
403 for (j = 0; j <
d; j++) {
412 std::cout<<
"simq failed\n";
429 for (i =
n-1; i >= 0; i--) yn = x * yn +
param[i];
431 for (i =
n+
d-1; i >
n; i--) yd = x * yd +
param[i];
459 else y = pow_bf(x,z);
464 return y * exp_bf(
sum);
474 int i, j, ij, ip, ipj, ipk, ipn;
476 int k, kp, kp1, kpk, kpn;
482 int *IPS =
new int[(
neq) *
sizeof(
int)];
488 for (i = 0; i <
n; i++) {
491 for(j = 0; j <
n; j++) {
493 if(rownrm < q) rownrm = q;
497 std::cout<<
"simq rownrm=0\n";
504 for (k = 0; k < nm1; k++) {
508 for (i = k; i <
n; i++) {
511 size = abs_bf(A[ipk]) * X[ip];
519 std::cout<<
"simq big=0\n";
525 IPS[k] = IPS[idxpiv];
532 for (i = kp1; i <
n; i++) {
535 em = -A[ipk] / pivot;
540 for (j = kp1; j <
n; j++) {
542 A[ipj] = A[ipj] + em * *aa++;
546 kpn =
n * IPS[
n-1] +
n - 1;
548 std::cout<<
"simq A[kpn]=0\n";
556 for (i = 1; i <
n; i++) {
560 for (j = 0; j < i; j++) {
561 sum += A[ipj] * X[j];
567 ipn =
n * IPS[
n-1] +
n - 1;
568 X[
n-1] = X[
n-1] / A[ipn];
570 for (iback = 1; iback <
n; iback++) {
577 for (j= i + 1; j <
n; j++)
579 X[i] = (X[i] -
sum) / A[nip+i];
597 for (i=0; i<=
n; i++) poly[i] =
param[i];
599 for (i=
n-1; i>=0; i--) {
601 if (
roots[i] == 0.0) {
602 std::cout<<
"Failure to converge on root "<<i+1<<
"/"<<
n<<
"\n";
605 poly[0] = -poly[0]/
roots[i];
606 for (j=1; j<=i; j++) poly[j] = (poly[j-1] - poly[j])/
roots[i];
611 for (i=0; i<
d; i++) poly[i] =
param[
n+1+i];
613 for (i=
d-1; i>=0; i--) {
615 if (
poles[i] == 0.0) {
616 std::cout<<
"Failure to converge on pole "<<i+1<<
"/"<<
d<<
"\n";
619 poly[0] = -poly[0]/
poles[i];
620 for (j=1; j<=i; j++) poly[j] = (poly[j-1] - poly[j])/
poles[i];
633 for (
int i=size-1; i>=0; i--) f = f*x + poly[i];
640 for (
int i=size-1; i>0; i--) df = df*x + (
bigfloat)i*poly[i];
652 for (j=1; j<=
JMAX;j++) {
657 if (abs_bf(dx) < xacc)
return rtn;
659 std::cout<<
"Maximum number of iterations exceeded in rtnewt\n";
673 for (i=1; i<
n; i++) {
680 for (j=0; j<
n; j++) {
681 for (i=
n-1; i>=0; i--) {
682 numerator[i] *= -res[j];
683 denominator[i] *= -
poles[j];
685 numerator[i] += numerator[i-1];
686 denominator[i] += denominator[i-1];
693 for (i=0; i<
n; i++) numerator[i] -= denominator[i];
697 for (i=0; i<
n; i++) {
699 for (j=
n-1; j>=0; j--) {
700 res[i] =
poles[i]*res[i]+numerator[j];
702 for (j=
n-1; j>=0; j--) {
713 for (j=0; j<
n; j++) {
715 for (i=j+1; i<
n; i++) {
729 delete [] denominator;
750 double lambda_low =
apstrt;
751 double lambda_high=
apend;
752 for (
double x=lambda_low; x<lambda_high; x*=1.05) {
755 os<< x<<
","<<r<<
","<<f<<
","<<r-f<<std::endl;
accelerator_inline Grid_simd< S, V > cos(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > exp(const Grid_simd< S, V > &r)
vobj::scalar_object sum(const vobj *arg, Integer osites)
bigfloat func(bigfloat x)
void pfe(bigfloat *res, bigfloat *poles, bigfloat norm)
int getPFE(double *res, double *pole, double *norm)
void allocate(int num_degree, int den_degree)
void csv(std::ostream &os)
void search(bigfloat *step)
bigfloat polyDiff(bigfloat x, bigfloat *poly, long size)
AlgRemez(double lower, double upper, long prec)
double evaluateApprox(double x)
bigfloat rtnewt(bigfloat *poly, long i, bigfloat x1, bigfloat x2, bigfloat xacc)
double evaluateInverseFunc(double x)
double generateApprox(int num_degree, int den_degree, unsigned long power_num, unsigned long power_den, int a_len, double *a_param, int *a_pow)
double evaluateFunc(double x)
int getIPFE(double *res, double *pole, double *norm)
int simq(bigfloat *A, bigfloat *B, bigfloat *X, int n)
bigfloat polyEval(bigfloat x, bigfloat *poly, long size)
void setBounds(double lower, double upper)
bigfloat getErr(bigfloat x, int *sign)
void stpini(bigfloat *step)
double evaluateInverseApprox(double x)
bigfloat approx(bigfloat x)
static void setDefaultPrecision(unsigned long dprec)