Exemplo n.º 1
0
double 
sigma(double beta, double p) {

  double fac2, fac3;
  double term1, term2, term3;
  double sum2, sum3, gama;
  double delta, result;
  
  delta = 1 + 4*quad(beta) + 3*qquad(beta);
  gama = 1 + 2*quad(beta);
  
  term1 = 2*pow((1 + 4*quad(beta)),-p/2.0);
  
  fac2 = 2*pow(gama,-p);
  sum2 = (1 + 2*p*qquad(beta)/quad(gama)); 
  sum2 += (3*p*(p + 2)*qqquad(beta)/(4.0*qquad(gama)));
  term2 = fac2 * sum2;
  
  fac3 = (-4*pow(delta,-p/2.0));
  sum3 = 1 + 3*p*qquad(beta)/(2*delta);
  sum3 += p*(p+2)*qqquad(beta)/(2*quad(delta));
  term3 = fac3 * sum3;
  
  result = term1 + term2 + term3;
  
  return result;
  
}
Exemplo n.º 2
0
/* Rootr and rooti are assumed to contain starting points for the root
   search on entry to lbpoly(). */
static int lbpoly(double *a, int order, double *rootr, double *rooti) {
    int	    ord, ordm1, ordm2, itcnt, i, k, mmk, mmkp2, mmkp1, ntrys;
    double  err, p, q, delp, delq, b[MAXORDER], c[MAXORDER], den;
    double  lim0 = 0.5*sqrt(DBL_MAX);

    for(ord = order; ord > 2; ord -= 2){
        ordm1 = ord-1;
        ordm2 = ord-2;
        /* Here is a kluge to prevent UNDERFLOW! (Sometimes the near-zero
           roots left in rootr and/or rooti cause underflow here...	*/
        if(fabs(rootr[ordm1]) < 1.0e-10) rootr[ordm1] = 0.0;
        if(fabs(rooti[ordm1]) < 1.0e-10) rooti[ordm1] = 0.0;
        p = -2.0 * rootr[ordm1]; /* set initial guesses for quad factor */
        q = (rootr[ordm1] * rootr[ordm1]) + (rooti[ordm1] * rooti[ordm1]);
        for(ntrys = 0; ntrys < MAX_TRYS; ntrys++)
        {
            int	found = false;

            for(itcnt = 0; itcnt < MAX_ITS; itcnt++)
            {
                double	lim = lim0 / (1 + fabs(p) + fabs(q));

                b[ord] = a[ord];
                b[ordm1] = a[ordm1] - (p * b[ord]);
                c[ord] = b[ord];
                c[ordm1] = b[ordm1] - (p * c[ord]);
                for(k = 2; k <= ordm1; k++){
                    mmk = ord - k;
                    mmkp2 = mmk+2;
                    mmkp1 = mmk+1;
                    b[mmk] = a[mmk] - (p* b[mmkp1]) - (q* b[mmkp2]);
                    c[mmk] = b[mmk] - (p* c[mmkp1]) - (q* c[mmkp2]);
                    if (b[mmk] > lim || c[mmk] > lim)
                        break;
                }
                if (k > ordm1) { /* normal exit from for(k ... */
                    /* ????	b[0] = a[0] - q * b[2];	*/
                    b[0] = a[0] - p * b[1] - q * b[2];
                    if (b[0] <= lim) k++;
                }
                if (k <= ord)	/* Some coefficient exceeded lim; */
                    break;	/* potential overflow below. */

                err = fabs(b[0]) + fabs(b[1]);

                if(err <= MAX_ERR) {
                    found = true;
                    break;
                }

                den = (c[2] * c[2]) - (c[3] * (c[1] - b[1]));
                if(den == 0.0)
                    break;

                delp = ((c[2] * b[1]) - (c[3] * b[0]))/den;
                delq = ((c[2] * b[0]) - (b[1] * (c[1] - b[1])))/den;

                p += delp;
                q += delq;

            } /* for(itcnt... */

            if (found)		/* we finally found the root! */
                break;
            else { /* try some new starting values */
                p = ((double)rand() - 0.5*RAND_MAX)/(double)RAND_MAX;
                q = ((double)rand() - 0.5*RAND_MAX)/(double)RAND_MAX;
            }

        } /* for(ntrys... */
        if((itcnt >= MAX_ITS) && (ntrys >= MAX_TRYS)){
            return(false);
        }

        if(!qquad(1.0, p, q,
                    &rootr[ordm1], &rooti[ordm1], &rootr[ordm2], &rooti[ordm2]))
            return(false);

        /* Update the coefficient array with the coeffs. of the
           reduced polynomial. */
        for( i = 0; i <= ordm2; i++) a[i] = b[i+2];
    }

    if(ord == 2){		/* Is the last factor a quadratic? */
        if(!qquad(a[2], a[1], a[0],
                    &rootr[1], &rooti[1], &rootr[0], &rooti[0]))
            return(false);
        return(true);
    }
    if(ord < 1) {
        return(false);
    }

    if( a[1] != 0.0) rootr[0] = -a[0]/a[1];
    else {
        rootr[0] = 100.0;	/* arbitrary recovery value */
    }
    rooti[0] = 0.0;

    return(true);
}