zoukankan      html  css  js  c++  java
  • c语言spline

     1 #define NRANSI
     2 #include "nrutil.h"
     3 
     4 void spline(float x[], float y[], int n, float yp1, float ypn, float y2[])
     5 {
     6     int i,k;
     7     float p,qn,sig,un,*u;
     8 
     9     u=vector(1,n-1);
    10     if (yp1 > 0.99e30)
    11         y2[1]=u[1]=0.0;
    12     else {
    13         y2[1] = -0.5;
    14         u[1]=(3.0/(x[2]-x[1]))*((y[2]-y[1])/(x[2]-x[1])-yp1);
    15     }
    16     for (i=2;i<=n-1;i++) {
    17         sig=(x[i]-x[i-1])/(x[i+1]-x[i-1]);
    18         p=sig*y2[i-1]+2.0;
    19         y2[i]=(sig-1.0)/p;
    20         u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
    21         u[i]=(6.0*u[i]/(x[i+1]-x[i-1])-sig*u[i-1])/p;
    22     }
    23     if (ypn > 0.99e30)
    24         qn=un=0.0;
    25     else {
    26         qn=0.5;
    27         un=(3.0/(x[n]-x[n-1]))*(ypn-(y[n]-y[n-1])/(x[n]-x[n-1]));
    28     }
    29     y2[n]=(un-qn*u[n-1])/(qn*y2[n-1]+1.0);
    30     for (k=n-1;k>=1;k--)
    31         y2[k]=y2[k]*y2[k+1]+u[k];
    32     free_vector(u,1,n-1);
    33 }
    34 #undef NRANSI
    spline.c

      1 #ifndef _NR_H_
      2 #define _NR_H_
      3 
      4 #ifndef _FCOMPLEX_DECLARE_T_
      5 typedef struct FCOMPLEX {float r,i;} fcomplex;
      6 #define _FCOMPLEX_DECLARE_T_
      7 #endif /* _FCOMPLEX_DECLARE_T_ */
      8 
      9 #ifndef _ARITHCODE_DECLARE_T_
     10 typedef struct {
     11     unsigned long *ilob,*iupb,*ncumfq,jdif,nc,minint,nch,ncum,nrad;
     12 } arithcode;
     13 #define _ARITHCODE_DECLARE_T_
     14 #endif /* _ARITHCODE_DECLARE_T_ */
     15 
     16 #ifndef _HUFFCODE_DECLARE_T_
     17 typedef struct {
     18     unsigned long *icod,*ncod,*left,*right,nch,nodemax;
     19 } huffcode;
     20 #define _HUFFCODE_DECLARE_T_
     21 #endif /* _HUFFCODE_DECLARE_T_ */
     22 
     23 #include <stdio.h>
     24 
     25 #if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */
     26 
     27 void addint(double **uf, double **uc, double **res, int nf);
     28 void airy(float x, float *ai, float *bi, float *aip, float *bip);
     29 void amebsa(float **p, float y[], int ndim, float pb[],    float *yb,
     30     float ftol, float (*funk)(float []), int *iter, float temptr);
     31 void amoeba(float **p, float y[], int ndim, float ftol,
     32     float (*funk)(float []), int *iter);
     33 float amotry(float **p, float y[], float psum[], int ndim,
     34     float (*funk)(float []), int ihi, float fac);
     35 float amotsa(float **p, float y[], float psum[], int ndim, float pb[],
     36     float *yb, float (*funk)(float []), int ihi, float *yhi, float fac);
     37 void anneal(float x[], float y[], int iorder[], int ncity);
     38 double anorm2(double **a, int n);
     39 void arcmak(unsigned long nfreq[], unsigned long nchh, unsigned long nradd,
     40     arithcode *acode);
     41 void arcode(unsigned long *ich, unsigned char **codep, unsigned long *lcode,
     42     unsigned long *lcd, int isign, arithcode *acode);
     43 void arcsum(unsigned long iin[], unsigned long iout[], unsigned long ja,
     44     int nwk, unsigned long nrad, unsigned long nc);
     45 void asolve(unsigned long n, double b[], double x[], int itrnsp);
     46 void atimes(unsigned long n, double x[], double r[], int itrnsp);
     47 void avevar(float data[], unsigned long n, float *ave, float *var);
     48 void balanc(float **a, int n);
     49 void banbks(float **a, unsigned long n, int m1, int m2, float **al,
     50     unsigned long indx[], float b[]);
     51 void bandec(float **a, unsigned long n, int m1, int m2, float **al,
     52     unsigned long indx[], float *d);
     53 void banmul(float **a, unsigned long n, int m1, int m2, float x[], float b[]);
     54 void bcucof(float y[], float y1[], float y2[], float y12[], float d1,
     55     float d2, float **c);
     56 void bcuint(float y[], float y1[], float y2[], float y12[],
     57     float x1l, float x1u, float x2l, float x2u, float x1,
     58     float x2, float *ansy, float *ansy1, float *ansy2);
     59 void beschb(double x, double *gam1, double *gam2, double *gampl,
     60     double *gammi);
     61 float bessi(int n, float x);
     62 float bessi0(float x);
     63 float bessi1(float x);
     64 void bessik(float x, float xnu, float *ri, float *rk, float *rip,
     65     float *rkp);
     66 float bessj(int n, float x);
     67 float bessj0(float x);
     68 float bessj1(float x);
     69 void bessjy(float x, float xnu, float *rj, float *ry, float *rjp,
     70     float *ryp);
     71 float bessk(int n, float x);
     72 float bessk0(float x);
     73 float bessk1(float x);
     74 float bessy(int n, float x);
     75 float bessy0(float x);
     76 float bessy1(float x);
     77 float beta(float z, float w);
     78 float betacf(float a, float b, float x);
     79 float betai(float a, float b, float x);
     80 float bico(int n, int k);
     81 void bksub(int ne, int nb, int jf, int k1, int k2, float ***c);
     82 float bnldev(float pp, int n, long *idum);
     83 float brent(float ax, float bx, float cx,
     84     float (*f)(float), float tol, float *xmin);
     85 void broydn(float x[], int n, int *check,
     86     void (*vecfunc)(int, float [], float []));
     87 void bsstep(float y[], float dydx[], int nv, float *xx, float htry,
     88     float eps, float yscal[], float *hdid, float *hnext,
     89     void (*derivs)(float, float [], float []));
     90 void caldat(long julian, int *mm, int *id, int *iyyy);
     91 void chder(float a, float b, float c[], float cder[], int n);
     92 float chebev(float a, float b, float c[], int m, float x);
     93 void chebft(float a, float b, float c[], int n, float (*func)(float));
     94 void chebpc(float c[], float d[], int n);
     95 void chint(float a, float b, float c[], float cint[], int n);
     96 float chixy(float bang);
     97 void choldc(float **a, int n, float p[]);
     98 void cholsl(float **a, int n, float p[], float b[], float x[]);
     99 void chsone(float bins[], float ebins[], int nbins, int knstrn,
    100     float *df, float *chsq, float *prob);
    101 void chstwo(float bins1[], float bins2[], int nbins, int knstrn,
    102     float *df, float *chsq, float *prob);
    103 void cisi(float x, float *ci, float *si);
    104 void cntab1(int **nn, int ni, int nj, float *chisq,
    105     float *df, float *prob, float *cramrv, float *ccc);
    106 void cntab2(int **nn, int ni, int nj, float *h, float *hx, float *hy,
    107     float *hygx, float *hxgy, float *uygx, float *uxgy, float *uxy);
    108 void convlv(float data[], unsigned long n, float respns[], unsigned long m,
    109     int isign, float ans[]);
    110 void copy(double **aout, double **ain, int n);
    111 void correl(float data1[], float data2[], unsigned long n, float ans[]);
    112 void cosft(float y[], int n, int isign);
    113 void cosft1(float y[], int n);
    114 void cosft2(float y[], int n, int isign);
    115 void covsrt(float **covar, int ma, int ia[], int mfit);
    116 void crank(unsigned long n, float w[], float *s);
    117 void cyclic(float a[], float b[], float c[], float alpha, float beta,
    118     float r[], float x[], unsigned long n);
    119 void daub4(float a[], unsigned long n, int isign);
    120 float dawson(float x);
    121 float dbrent(float ax, float bx, float cx,
    122     float (*f)(float), float (*df)(float), float tol, float *xmin);
    123 void ddpoly(float c[], int nc, float x, float pd[], int nd);
    124 int decchk(char string[], int n, char *ch);
    125 void derivs(float x, float y[], float dydx[]);
    126 float df1dim(float x);
    127 void dfour1(double data[], unsigned long nn, int isign);
    128 void dfpmin(float p[], int n, float gtol, int *iter, float *fret,
    129     float (*func)(float []), void (*dfunc)(float [], float []));
    130 float dfridr(float (*func)(float), float x, float h, float *err);
    131 void dftcor(float w, float delta, float a, float b, float endpts[],
    132     float *corre, float *corim, float *corfac);
    133 void dftint(float (*func)(float), float a, float b, float w,
    134     float *cosint, float *sinint);
    135 void difeq(int k, int k1, int k2, int jsf, int is1, int isf,
    136     int indexv[], int ne, float **s, float **y);
    137 void dlinmin(float p[], float xi[], int n, float *fret,
    138     float (*func)(float []), void (*dfunc)(float [], float[]));
    139 double dpythag(double a, double b);
    140 void drealft(double data[], unsigned long n, int isign);
    141 void dsprsax(double sa[], unsigned long ija[], double x[], double b[],
    142     unsigned long n);
    143 void dsprstx(double sa[], unsigned long ija[], double x[], double b[],
    144     unsigned long n);
    145 void dsvbksb(double **u, double w[], double **v, int m, int n, double b[],
    146     double x[]);
    147 void dsvdcmp(double **a, int m, int n, double w[], double **v);
    148 void eclass(int nf[], int n, int lista[], int listb[], int m);
    149 void eclazz(int nf[], int n, int (*equiv)(int, int));
    150 float ei(float x);
    151 void eigsrt(float d[], float **v, int n);
    152 float elle(float phi, float ak);
    153 float ellf(float phi, float ak);
    154 float ellpi(float phi, float en, float ak);
    155 void elmhes(float **a, int n);
    156 float erfcc(float x);
    157 float erff(float x);
    158 float erffc(float x);
    159 void eulsum(float *sum, float term, int jterm, float wksp[]);
    160 float evlmem(float fdt, float d[], int m, float xms);
    161 float expdev(long *idum);
    162 float expint(int n, float x);
    163 float f1(float x);
    164 float f1dim(float x);
    165 float f2(float y);
    166 float f3(float z);
    167 float factln(int n);
    168 float factrl(int n);
    169 void fasper(float x[], float y[], unsigned long n, float ofac, float hifac,
    170     float wk1[], float wk2[], unsigned long nwk, unsigned long *nout,
    171     unsigned long *jmax, float *prob);
    172 void fdjac(int n, float x[], float fvec[], float **df,
    173     void (*vecfunc)(int, float [], float []));
    174 void fgauss(float x, float a[], float *y, float dyda[], int na);
    175 void fill0(double **u, int n);
    176 void fit(float x[], float y[], int ndata, float sig[], int mwt,
    177     float *a, float *b, float *siga, float *sigb, float *chi2, float *q);
    178 void fitexy(float x[], float y[], int ndat, float sigx[], float sigy[],
    179     float *a, float *b, float *siga, float *sigb, float *chi2, float *q);
    180 void fixrts(float d[], int m);
    181 void fleg(float x, float pl[], int nl);
    182 void flmoon(int n, int nph, long *jd, float *frac);
    183 float fmin(float x[]);
    184 void four1(float data[], unsigned long nn, int isign);
    185 void fourew(FILE *file[5], int *na, int *nb, int *nc, int *nd);
    186 void fourfs(FILE *file[5], unsigned long nn[], int ndim, int isign);
    187 void fourn(float data[], unsigned long nn[], int ndim, int isign);
    188 void fpoly(float x, float p[], int np);
    189 void fred2(int n, float a, float b, float t[], float f[], float w[],
    190     float (*g)(float), float (*ak)(float, float));
    191 float fredin(float x, int n, float a, float b, float t[], float f[], float w[],
    192     float (*g)(float), float (*ak)(float, float));
    193 void frenel(float x, float *s, float *c);
    194 void frprmn(float p[], int n, float ftol, int *iter, float *fret,
    195     float (*func)(float []), void (*dfunc)(float [], float []));
    196 void ftest(float data1[], unsigned long n1, float data2[], unsigned long n2,
    197     float *f, float *prob);
    198 float gamdev(int ia, long *idum);
    199 float gammln(float xx);
    200 float gammp(float a, float x);
    201 float gammq(float a, float x);
    202 float gasdev(long *idum);
    203 void gaucof(int n, float a[], float b[], float amu0, float x[], float w[]);
    204 void gauher(float x[], float w[], int n);
    205 void gaujac(float x[], float w[], int n, float alf, float bet);
    206 void gaulag(float x[], float w[], int n, float alf);
    207 void gauleg(float x1, float x2, float x[], float w[], int n);
    208 void gaussj(float **a, int n, float **b, int m);
    209 void gcf(float *gammcf, float a, float x, float *gln);
    210 float golden(float ax, float bx, float cx, float (*f)(float), float tol,
    211     float *xmin);
    212 void gser(float *gamser, float a, float x, float *gln);
    213 void hpsel(unsigned long m, unsigned long n, float arr[], float heap[]);
    214 void hpsort(unsigned long n, float ra[]);
    215 void hqr(float **a, int n, float wr[], float wi[]);
    216 void hufapp(unsigned long index[], unsigned long nprob[], unsigned long n,
    217     unsigned long i);
    218 void hufdec(unsigned long *ich, unsigned char *code, unsigned long lcode,
    219     unsigned long *nb, huffcode *hcode);
    220 void hufenc(unsigned long ich, unsigned char **codep, unsigned long *lcode,
    221     unsigned long *nb, huffcode *hcode);
    222 void hufmak(unsigned long nfreq[], unsigned long nchin, unsigned long *ilong,
    223     unsigned long *nlong, huffcode *hcode);
    224 void hunt(float xx[], unsigned long n, float x, unsigned long *jlo);
    225 void hypdrv(float s, float yy[], float dyyds[]);
    226 fcomplex hypgeo(fcomplex a, fcomplex b, fcomplex c, fcomplex z);
    227 void hypser(fcomplex a, fcomplex b, fcomplex c, fcomplex z,
    228     fcomplex *series, fcomplex *deriv);
    229 unsigned short icrc(unsigned short crc, unsigned char *bufptr,
    230     unsigned long len, short jinit, int jrev);
    231 unsigned short icrc1(unsigned short crc, unsigned char onech);
    232 unsigned long igray(unsigned long n, int is);
    233 void iindexx(unsigned long n, long arr[], unsigned long indx[]);
    234 void indexx(unsigned long n, float arr[], unsigned long indx[]);
    235 void interp(double **uf, double **uc, int nf);
    236 int irbit1(unsigned long *iseed);
    237 int irbit2(unsigned long *iseed);
    238 void jacobi(float **a, int n, float d[], float **v, int *nrot);
    239 void jacobn(float x, float y[], float dfdx[], float **dfdy, int n);
    240 long julday(int mm, int id, int iyyy);
    241 void kendl1(float data1[], float data2[], unsigned long n, float *tau, float *z,
    242     float *prob);
    243 void kendl2(float **tab, int i, int j, float *tau, float *z, float *prob);
    244 void kermom(double w[], double y, int m);
    245 void ks2d1s(float x1[], float y1[], unsigned long n1,
    246     void (*quadvl)(float, float, float *, float *, float *, float *),
    247     float *d1, float *prob);
    248 void ks2d2s(float x1[], float y1[], unsigned long n1, float x2[], float y2[],
    249     unsigned long n2, float *d, float *prob);
    250 void ksone(float data[], unsigned long n, float (*func)(float), float *d,
    251     float *prob);
    252 void kstwo(float data1[], unsigned long n1, float data2[], unsigned long n2,
    253     float *d, float *prob);
    254 void laguer(fcomplex a[], int m, fcomplex *x, int *its);
    255 void lfit(float x[], float y[], float sig[], int ndat, float a[], int ia[],
    256     int ma, float **covar, float *chisq, void (*funcs)(float, float [], int));
    257 void linbcg(unsigned long n, double b[], double x[], int itol, double tol,
    258      int itmax, int *iter, double *err);
    259 void linmin(float p[], float xi[], int n, float *fret,
    260     float (*func)(float []));
    261 void lnsrch(int n, float xold[], float fold, float g[], float p[], float x[],
    262      float *f, float stpmax, int *check, float (*func)(float []));
    263 void load(float x1, float v[], float y[]);
    264 void load1(float x1, float v1[], float y[]);
    265 void load2(float x2, float v2[], float y[]);
    266 void locate(float xx[], unsigned long n, float x, unsigned long *j);
    267 void lop(double **out, double **u, int n);
    268 void lubksb(float **a, int n, int *indx, float b[]);
    269 void ludcmp(float **a, int n, int *indx, float *d);
    270 void machar(int *ibeta, int *it, int *irnd, int *ngrd,
    271     int *machep, int *negep, int *iexp, int *minexp, int *maxexp,
    272     float *eps, float *epsneg, float *xmin, float *xmax);
    273 void matadd(double **a, double **b, double **c, int n);
    274 void matsub(double **a, double **b, double **c, int n);
    275 void medfit(float x[], float y[], int ndata, float *a, float *b, float *abdev);
    276 void memcof(float data[], int n, int m, float *xms, float d[]);
    277 int metrop(float de, float t);
    278 void mgfas(double **u, int n, int maxcyc);
    279 void mglin(double **u, int n, int ncycle);
    280 float midexp(float (*funk)(float), float aa, float bb, int n);
    281 float midinf(float (*funk)(float), float aa, float bb, int n);
    282 float midpnt(float (*func)(float), float a, float b, int n);
    283 float midsql(float (*funk)(float), float aa, float bb, int n);
    284 float midsqu(float (*funk)(float), float aa, float bb, int n);
    285 void miser(float (*func)(float []), float regn[], int ndim, unsigned long npts,
    286     float dith, float *ave, float *var);
    287 void mmid(float y[], float dydx[], int nvar, float xs, float htot,
    288     int nstep, float yout[], void (*derivs)(float, float[], float[]));
    289 void mnbrak(float *ax, float *bx, float *cx, float *fa, float *fb,
    290     float *fc, float (*func)(float));
    291 void mnewt(int ntrial, float x[], int n, float tolx, float tolf);
    292 void moment(float data[], int n, float *ave, float *adev, float *sdev,
    293     float *var, float *skew, float *curt);
    294 void mp2dfr(unsigned char a[], unsigned char s[], int n, int *m);
    295 void mpadd(unsigned char w[], unsigned char u[], unsigned char v[], int n);
    296 void mpdiv(unsigned char q[], unsigned char r[], unsigned char u[],
    297     unsigned char v[], int n, int m);
    298 void mpinv(unsigned char u[], unsigned char v[], int n, int m);
    299 void mplsh(unsigned char u[], int n);
    300 void mpmov(unsigned char u[], unsigned char v[], int n);
    301 void mpmul(unsigned char w[], unsigned char u[], unsigned char v[], int n,
    302     int m);
    303 void mpneg(unsigned char u[], int n);
    304 void mppi(int n);
    305 void mprove(float **a, float **alud, int n, int indx[], float b[],
    306     float x[]);
    307 void mpsad(unsigned char w[], unsigned char u[], int n, int iv);
    308 void mpsdv(unsigned char w[], unsigned char u[], int n, int iv, int *ir);
    309 void mpsmu(unsigned char w[], unsigned char u[], int n, int iv);
    310 void mpsqrt(unsigned char w[], unsigned char u[], unsigned char v[], int n,
    311     int m);
    312 void mpsub(int *is, unsigned char w[], unsigned char u[], unsigned char v[],
    313     int n);
    314 void mrqcof(float x[], float y[], float sig[], int ndata, float a[],
    315     int ia[], int ma, float **alpha, float beta[], float *chisq,
    316     void (*funcs)(float, float [], float *, float [], int));
    317 void mrqmin(float x[], float y[], float sig[], int ndata, float a[],
    318     int ia[], int ma, float **covar, float **alpha, float *chisq,
    319     void (*funcs)(float, float [], float *, float [], int), float *alamda);
    320 void newt(float x[], int n, int *check,
    321     void (*vecfunc)(int, float [], float []));
    322 void odeint(float ystart[], int nvar, float x1, float x2,
    323     float eps, float h1, float hmin, int *nok, int *nbad,
    324     void (*derivs)(float, float [], float []),
    325     void (*rkqs)(float [], float [], int, float *, float, float,
    326     float [], float *, float *, void (*)(float, float [], float [])));
    327 void orthog(int n, float anu[], float alpha[], float beta[], float a[],
    328     float b[]);
    329 void pade(double cof[], int n, float *resid);
    330 void pccheb(float d[], float c[], int n);
    331 void pcshft(float a, float b, float d[], int n);
    332 void pearsn(float x[], float y[], unsigned long n, float *r, float *prob,
    333     float *z);
    334 void period(float x[], float y[], int n, float ofac, float hifac,
    335     float px[], float py[], int np, int *nout, int *jmax, float *prob);
    336 void piksr2(int n, float arr[], float brr[]);
    337 void piksrt(int n, float arr[]);
    338 void pinvs(int ie1, int ie2, int je1, int jsf, int jc1, int k,
    339     float ***c, float **s);
    340 float plgndr(int l, int m, float x);
    341 float poidev(float xm, long *idum);
    342 void polcoe(float x[], float y[], int n, float cof[]);
    343 void polcof(float xa[], float ya[], int n, float cof[]);
    344 void poldiv(float u[], int n, float v[], int nv, float q[], float r[]);
    345 void polin2(float x1a[], float x2a[], float **ya, int m, int n,
    346     float x1, float x2, float *y, float *dy);
    347 void polint(float xa[], float ya[], int n, float x, float *y, float *dy);
    348 void powell(float p[], float **xi, int n, float ftol, int *iter, float *fret,
    349     float (*func)(float []));
    350 void predic(float data[], int ndata, float d[], int m, float future[], int nfut);
    351 float probks(float alam);
    352 void psdes(unsigned long *lword, unsigned long *irword);
    353 void pwt(float a[], unsigned long n, int isign);
    354 void pwtset(int n);
    355 float pythag(float a, float b);
    356 void pzextr(int iest, float xest, float yest[], float yz[], float dy[],
    357     int nv);
    358 float qgaus(float (*func)(float), float a, float b);
    359 void qrdcmp(float **a, int n, float *c, float *d, int *sing);
    360 float qromb(float (*func)(float), float a, float b);
    361 float qromo(float (*func)(float), float a, float b,
    362     float (*choose)(float (*)(float), float, float, int));
    363 void qroot(float p[], int n, float *b, float *c, float eps);
    364 void qrsolv(float **a, int n, float c[], float d[], float b[]);
    365 void qrupdt(float **r, float **qt, int n, float u[], float v[]);
    366 float qsimp(float (*func)(float), float a, float b);
    367 float qtrap(float (*func)(float), float a, float b);
    368 float quad3d(float (*func)(float, float, float), float x1, float x2);
    369 void quadct(float x, float y, float xx[], float yy[], unsigned long nn,
    370     float *fa, float *fb, float *fc, float *fd);
    371 void quadmx(float **a, int n);
    372 void quadvl(float x, float y, float *fa, float *fb, float *fc, float *fd);
    373 float ran0(long *idum);
    374 float ran1(long *idum);
    375 float ran2(long *idum);
    376 float ran3(long *idum);
    377 float ran4(long *idum);
    378 void rank(unsigned long n, unsigned long indx[], unsigned long irank[]);
    379 void ranpt(float pt[], float regn[], int n);
    380 void ratint(float xa[], float ya[], int n, float x, float *y, float *dy);
    381 void ratlsq(double (*fn)(double), double a, double b, int mm, int kk,
    382     double cof[], double *dev);
    383 double ratval(double x, double cof[], int mm, int kk);
    384 float rc(float x, float y);
    385 float rd(float x, float y, float z);
    386 void realft(float data[], unsigned long n, int isign);
    387 void rebin(float rc, int nd, float r[], float xin[], float xi[]);
    388 void red(int iz1, int iz2, int jz1, int jz2, int jm1, int jm2, int jmf,
    389     int ic1, int jc1, int jcf, int kc, float ***c, float **s);
    390 void relax(double **u, double **rhs, int n);
    391 void relax2(double **u, double **rhs, int n);
    392 void resid(double **res, double **u, double **rhs, int n);
    393 float revcst(float x[], float y[], int iorder[], int ncity, int n[]);
    394 void reverse(int iorder[], int ncity, int n[]);
    395 float rf(float x, float y, float z);
    396 float rj(float x, float y, float z, float p);
    397 void rk4(float y[], float dydx[], int n, float x, float h, float yout[],
    398     void (*derivs)(float, float [], float []));
    399 void rkck(float y[], float dydx[], int n, float x, float h,
    400     float yout[], float yerr[], void (*derivs)(float, float [], float []));
    401 void rkdumb(float vstart[], int nvar, float x1, float x2, int nstep,
    402     void (*derivs)(float, float [], float []));
    403 void rkqs(float y[], float dydx[], int n, float *x,
    404     float htry, float eps, float yscal[], float *hdid, float *hnext,
    405     void (*derivs)(float, float [], float []));
    406 void rlft3(float ***data, float **speq, unsigned long nn1,
    407     unsigned long nn2, unsigned long nn3, int isign);
    408 float rofunc(float b);
    409 void rotate(float **r, float **qt, int n, int i, float a, float b);
    410 void rsolv(float **a, int n, float d[], float b[]);
    411 void rstrct(double **uc, double **uf, int nc);
    412 float rtbis(float (*func)(float), float x1, float x2, float xacc);
    413 float rtflsp(float (*func)(float), float x1, float x2, float xacc);
    414 float rtnewt(void (*funcd)(float, float *, float *), float x1, float x2,
    415     float xacc);
    416 float rtsafe(void (*funcd)(float, float *, float *), float x1, float x2,
    417     float xacc);
    418 float rtsec(float (*func)(float), float x1, float x2, float xacc);
    419 void rzextr(int iest, float xest, float yest[], float yz[], float dy[], int nv);
    420 void savgol(float c[], int np, int nl, int nr, int ld, int m);
    421 void score(float xf, float y[], float f[]);
    422 void scrsho(float (*fx)(float));
    423 float select(unsigned long k, unsigned long n, float arr[]);
    424 float selip(unsigned long k, unsigned long n, float arr[]);
    425 void shell(unsigned long n, float a[]);
    426 void shoot(int n, float v[], float f[]);
    427 void shootf(int n, float v[], float f[]);
    428 void simp1(float **a, int mm, int ll[], int nll, int iabf, int *kp,
    429     float *bmax);
    430 void simp2(float **a, int m, int n, int *ip, int kp);
    431 void simp3(float **a, int i1, int k1, int ip, int kp);
    432 void simplx(float **a, int m, int n, int m1, int m2, int m3, int *icase,
    433     int izrov[], int iposv[]);
    434 void simpr(float y[], float dydx[], float dfdx[], float **dfdy,
    435     int n, float xs, float htot, int nstep, float yout[],
    436     void (*derivs)(float, float [], float []));
    437 void sinft(float y[], int n);
    438 void slvsm2(double **u, double **rhs);
    439 void slvsml(double **u, double **rhs);
    440 void sncndn(float uu, float emmc, float *sn, float *cn, float *dn);
    441 double snrm(unsigned long n, double sx[], int itol);
    442 void sobseq(int *n, float x[]);
    443 void solvde(int itmax, float conv, float slowc, float scalv[],
    444     int indexv[], int ne, int nb, int m, float **y, float ***c, float **s);
    445 void sor(double **a, double **b, double **c, double **d, double **e,
    446     double **f, double **u, int jmax, double rjac);
    447 void sort(unsigned long n, float arr[]);
    448 void sort2(unsigned long n, float arr[], float brr[]);
    449 void sort3(unsigned long n, float ra[], float rb[], float rc[]);
    450 void spctrm(FILE *fp, float p[], int m, int k, int ovrlap);
    451 void spear(float data1[], float data2[], unsigned long n, float *d, float *zd,
    452     float *probd, float *rs, float *probrs);
    453 void sphbes(int n, float x, float *sj, float *sy, float *sjp, float *syp);
    454 void splie2(float x1a[], float x2a[], float **ya, int m, int n, float **y2a);
    455 void splin2(float x1a[], float x2a[], float **ya, float **y2a, int m, int n,
    456     float x1, float x2, float *y);
    457 void spline(float x[], float y[], int n, float yp1, float ypn, float y2[]);
    458 void splint(float xa[], float ya[], float y2a[], int n, float x, float *y);
    459 void spread(float y, float yy[], unsigned long n, float x, int m);
    460 void sprsax(float sa[], unsigned long ija[], float x[], float b[],
    461     unsigned long n);
    462 void sprsin(float **a, int n, float thresh, unsigned long nmax, float sa[],
    463     unsigned long ija[]);
    464 void sprspm(float sa[], unsigned long ija[], float sb[], unsigned long ijb[],
    465     float sc[], unsigned long ijc[]);
    466 void sprstm(float sa[], unsigned long ija[], float sb[], unsigned long ijb[],
    467     float thresh, unsigned long nmax, float sc[], unsigned long ijc[]);
    468 void sprstp(float sa[], unsigned long ija[], float sb[], unsigned long ijb[]);
    469 void sprstx(float sa[], unsigned long ija[], float x[], float b[],
    470     unsigned long n);
    471 void stifbs(float y[], float dydx[], int nv, float *xx,
    472     float htry, float eps, float yscal[], float *hdid, float *hnext,
    473     void (*derivs)(float, float [], float []));
    474 void stiff(float y[], float dydx[], int n, float *x,
    475     float htry, float eps, float yscal[], float *hdid, float *hnext,
    476     void (*derivs)(float, float [], float []));
    477 void stoerm(float y[], float d2y[], int nv, float xs,
    478     float htot, int nstep, float yout[],
    479     void (*derivs)(float, float [], float []));
    480 void svbksb(float **u, float w[], float **v, int m, int n, float b[],
    481     float x[]);
    482 void svdcmp(float **a, int m, int n, float w[], float **v);
    483 void svdfit(float x[], float y[], float sig[], int ndata, float a[],
    484     int ma, float **u, float **v, float w[], float *chisq,
    485     void (*funcs)(float, float [], int));
    486 void svdvar(float **v, int ma, float w[], float **cvm);
    487 void toeplz(float r[], float x[], float y[], int n);
    488 void tptest(float data1[], float data2[], unsigned long n, float *t, float *prob);
    489 void tqli(float d[], float e[], int n, float **z);
    490 float trapzd(float (*func)(float), float a, float b, int n);
    491 void tred2(float **a, int n, float d[], float e[]);
    492 void tridag(float a[], float b[], float c[], float r[], float u[],
    493     unsigned long n);
    494 float trncst(float x[], float y[], int iorder[], int ncity, int n[]);
    495 void trnspt(int iorder[], int ncity, int n[]);
    496 void ttest(float data1[], unsigned long n1, float data2[], unsigned long n2,
    497     float *t, float *prob);
    498 void tutest(float data1[], unsigned long n1, float data2[], unsigned long n2,
    499     float *t, float *prob);
    500 void twofft(float data1[], float data2[], float fft1[], float fft2[],
    501     unsigned long n);
    502 void vander(double x[], double w[], double q[], int n);
    503 void vegas(float regn[], int ndim, float (*fxn)(float [], float), int init,
    504     unsigned long ncall, int itmx, int nprn, float *tgral, float *sd,
    505     float *chi2a);
    506 void voltra(int n, int m, float t0, float h, float *t, float **f,
    507     float (*g)(int, float), float (*ak)(int, int, float, float));
    508 void wt1(float a[], unsigned long n, int isign,
    509     void (*wtstep)(float [], unsigned long, int));
    510 void wtn(float a[], unsigned long nn[], int ndim, int isign,
    511     void (*wtstep)(float [], unsigned long, int));
    512 void wwghts(float wghts[], int n, float h,
    513     void (*kermom)(double [], double ,int));
    514 int zbrac(float (*func)(float), float *x1, float *x2);
    515 void zbrak(float (*fx)(float), float x1, float x2, int n, float xb1[],
    516     float xb2[], int *nb);
    517 float zbrent(float (*func)(float), float x1, float x2, float tol);
    518 void zrhqr(float a[], int m, float rtr[], float rti[]);
    519 float zriddr(float (*func)(float), float x1, float x2, float xacc);
    520 void zroots(fcomplex a[], int m, fcomplex roots[], int polish);
    521 
    522 #else /* ANSI */
    523 /* traditional - K&R */
    524 
    525 void addint();
    526 void airy();
    527 void amebsa();
    528 void amoeba();
    529 float amotry();
    530 float amotsa();
    531 void anneal();
    532 double anorm2();
    533 void arcmak();
    534 void arcode();
    535 void arcsum();
    536 void asolve();
    537 void atimes();
    538 void avevar();
    539 void balanc();
    540 void banbks();
    541 void bandec();
    542 void banmul();
    543 void bcucof();
    544 void bcuint();
    545 void beschb();
    546 float bessi();
    547 float bessi0();
    548 float bessi1();
    549 void bessik();
    550 float bessj();
    551 float bessj0();
    552 float bessj1();
    553 void bessjy();
    554 float bessk();
    555 float bessk0();
    556 float bessk1();
    557 float bessy();
    558 float bessy0();
    559 float bessy1();
    560 float beta();
    561 float betacf();
    562 float betai();
    563 float bico();
    564 void bksub();
    565 float bnldev();
    566 float brent();
    567 void broydn();
    568 void bsstep();
    569 void caldat();
    570 void chder();
    571 float chebev();
    572 void chebft();
    573 void chebpc();
    574 void chint();
    575 float chixy();
    576 void choldc();
    577 void cholsl();
    578 void chsone();
    579 void chstwo();
    580 void cisi();
    581 void cntab1();
    582 void cntab2();
    583 void convlv();
    584 void copy();
    585 void correl();
    586 void cosft();
    587 void cosft1();
    588 void cosft2();
    589 void covsrt();
    590 void crank();
    591 void cyclic();
    592 void daub4();
    593 float dawson();
    594 float dbrent();
    595 void ddpoly();
    596 int decchk();
    597 void derivs();
    598 float df1dim();
    599 void dfour1();
    600 void dfpmin();
    601 float dfridr();
    602 void dftcor();
    603 void dftint();
    604 void difeq();
    605 void dlinmin();
    606 double dpythag();
    607 void drealft();
    608 void dsprsax();
    609 void dsprstx();
    610 void dsvbksb();
    611 void dsvdcmp();
    612 void eclass();
    613 void eclazz();
    614 float ei();
    615 void eigsrt();
    616 float elle();
    617 float ellf();
    618 float ellpi();
    619 void elmhes();
    620 float erfcc();
    621 float erff();
    622 float erffc();
    623 void eulsum();
    624 float evlmem();
    625 float expdev();
    626 float expint();
    627 float f1();
    628 float f1dim();
    629 float f2();
    630 float f3();
    631 float factln();
    632 float factrl();
    633 void fasper();
    634 void fdjac();
    635 void fgauss();
    636 void fill0();
    637 void fit();
    638 void fitexy();
    639 void fixrts();
    640 void fleg();
    641 void flmoon();
    642 float fmin();
    643 void four1();
    644 void fourew();
    645 void fourfs();
    646 void fourn();
    647 void fpoly();
    648 void fred2();
    649 float fredin();
    650 void frenel();
    651 void frprmn();
    652 void ftest();
    653 float gamdev();
    654 float gammln();
    655 float gammp();
    656 float gammq();
    657 float gasdev();
    658 void gaucof();
    659 void gauher();
    660 void gaujac();
    661 void gaulag();
    662 void gauleg();
    663 void gaussj();
    664 void gcf();
    665 float golden();
    666 void gser();
    667 void hpsel();
    668 void hpsort();
    669 void hqr();
    670 void hufapp();
    671 void hufdec();
    672 void hufenc();
    673 void hufmak();
    674 void hunt();
    675 void hypdrv();
    676 fcomplex hypgeo();
    677 void hypser();
    678 unsigned short icrc();
    679 unsigned short icrc1();
    680 unsigned long igray();
    681 void iindexx();
    682 void indexx();
    683 void interp();
    684 int irbit1();
    685 int irbit2();
    686 void jacobi();
    687 void jacobn();
    688 long julday();
    689 void kendl1();
    690 void kendl2();
    691 void kermom();
    692 void ks2d1s();
    693 void ks2d2s();
    694 void ksone();
    695 void kstwo();
    696 void laguer();
    697 void lfit();
    698 void linbcg();
    699 void linmin();
    700 void lnsrch();
    701 void load();
    702 void load1();
    703 void load2();
    704 void locate();
    705 void lop();
    706 void lubksb();
    707 void ludcmp();
    708 void machar();
    709 void matadd();
    710 void matsub();
    711 void medfit();
    712 void memcof();
    713 int metrop();
    714 void mgfas();
    715 void mglin();
    716 float midexp();
    717 float midinf();
    718 float midpnt();
    719 float midsql();
    720 float midsqu();
    721 void miser();
    722 void mmid();
    723 void mnbrak();
    724 void mnewt();
    725 void moment();
    726 void mp2dfr();
    727 void mpadd();
    728 void mpdiv();
    729 void mpinv();
    730 void mplsh();
    731 void mpmov();
    732 void mpmul();
    733 void mpneg();
    734 void mppi();
    735 void mprove();
    736 void mpsad();
    737 void mpsdv();
    738 void mpsmu();
    739 void mpsqrt();
    740 void mpsub();
    741 void mrqcof();
    742 void mrqmin();
    743 void newt();
    744 void odeint();
    745 void orthog();
    746 void pade();
    747 void pccheb();
    748 void pcshft();
    749 void pearsn();
    750 void period();
    751 void piksr2();
    752 void piksrt();
    753 void pinvs();
    754 float plgndr();
    755 float poidev();
    756 void polcoe();
    757 void polcof();
    758 void poldiv();
    759 void polin2();
    760 void polint();
    761 void powell();
    762 void predic();
    763 float probks();
    764 void psdes();
    765 void pwt();
    766 void pwtset();
    767 float pythag();
    768 void pzextr();
    769 float qgaus();
    770 void qrdcmp();
    771 float qromb();
    772 float qromo();
    773 void qroot();
    774 void qrsolv();
    775 void qrupdt();
    776 float qsimp();
    777 float qtrap();
    778 float quad3d();
    779 void quadct();
    780 void quadmx();
    781 void quadvl();
    782 float ran0();
    783 float ran1();
    784 float ran2();
    785 float ran3();
    786 float ran4();
    787 void rank();
    788 void ranpt();
    789 void ratint();
    790 void ratlsq();
    791 double ratval();
    792 float rc();
    793 float rd();
    794 void realft();
    795 void rebin();
    796 void red();
    797 void relax();
    798 void relax2();
    799 void resid();
    800 float revcst();
    801 void reverse();
    802 float rf();
    803 float rj();
    804 void rk4();
    805 void rkck();
    806 void rkdumb();
    807 void rkqs();
    808 void rlft3();
    809 float rofunc();
    810 void rotate();
    811 void rsolv();
    812 void rstrct();
    813 float rtbis();
    814 float rtflsp();
    815 float rtnewt();
    816 float rtsafe();
    817 float rtsec();
    818 void rzextr();
    819 void savgol();
    820 void score();
    821 void scrsho();
    822 float select();
    823 float selip();
    824 void shell();
    825 void shoot();
    826 void shootf();
    827 void simp1();
    828 void simp2();
    829 void simp3();
    830 void simplx();
    831 void simpr();
    832 void sinft();
    833 void slvsm2();
    834 void slvsml();
    835 void sncndn();
    836 double snrm();
    837 void sobseq();
    838 void solvde();
    839 void sor();
    840 void sort();
    841 void sort2();
    842 void sort3();
    843 void spctrm();
    844 void spear();
    845 void sphbes();
    846 void splie2();
    847 void splin2();
    848 void spline();
    849 void splint();
    850 void spread();
    851 void sprsax();
    852 void sprsin();
    853 void sprspm();
    854 void sprstm();
    855 void sprstp();
    856 void sprstx();
    857 void stifbs();
    858 void stiff();
    859 void stoerm();
    860 void svbksb();
    861 void svdcmp();
    862 void svdfit();
    863 void svdvar();
    864 void toeplz();
    865 void tptest();
    866 void tqli();
    867 float trapzd();
    868 void tred2();
    869 void tridag();
    870 float trncst();
    871 void trnspt();
    872 void ttest();
    873 void tutest();
    874 void twofft();
    875 void vander();
    876 void vegas();
    877 void voltra();
    878 void wt1();
    879 void wtn();
    880 void wwghts();
    881 int zbrac();
    882 void zbrak();
    883 float zbrent();
    884 void zrhqr();
    885 float zriddr();
    886 void zroots();
    887 
    888 #endif /* ANSI */
    889 
    890 #endif /* _NR_H_ */
    nr.h
      1 #if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */
      2 
      3 #include <stdio.h>
      4 #include <stddef.h>
      5 #include <stdlib.h>
      6 #define NR_END 1
      7 #define FREE_ARG char*
      8 
      9 void nrerror(char error_text[])
     10 /* Numerical Recipes standard error handler */
     11 {
     12     fprintf(stderr,"Numerical Recipes run-time error...
    ");
     13     fprintf(stderr,"%s
    ",error_text);
     14     fprintf(stderr,"...now exiting to system...
    ");
     15     exit(1);
     16 }
     17 
     18 float *vector(long nl, long nh)
     19 /* allocate a float vector with subscript range v[nl..nh] */
     20 {
     21     float *v;
     22 
     23     v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
     24     if (!v) nrerror("allocation failure in vector()");
     25     return v-nl+NR_END;
     26 }
     27 
     28 int *ivector(long nl, long nh)
     29 /* allocate an int vector with subscript range v[nl..nh] */
     30 {
     31     int *v;
     32 
     33     v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int)));
     34     if (!v) nrerror("allocation failure in ivector()");
     35     return v-nl+NR_END;
     36 }
     37 
     38 unsigned char *cvector(long nl, long nh)
     39 /* allocate an unsigned char vector with subscript range v[nl..nh] */
     40 {
     41     unsigned char *v;
     42 
     43     v=(unsigned char *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(unsigned char)));
     44     if (!v) nrerror("allocation failure in cvector()");
     45     return v-nl+NR_END;
     46 }
     47 
     48 unsigned long *lvector(long nl, long nh)
     49 /* allocate an unsigned long vector with subscript range v[nl..nh] */
     50 {
     51     unsigned long *v;
     52 
     53     v=(unsigned long *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(long)));
     54     if (!v) nrerror("allocation failure in lvector()");
     55     return v-nl+NR_END;
     56 }
     57 
     58 double *dvector(long nl, long nh)
     59 /* allocate a double vector with subscript range v[nl..nh] */
     60 {
     61     double *v;
     62 
     63     v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double)));
     64     if (!v) nrerror("allocation failure in dvector()");
     65     return v-nl+NR_END;
     66 }
     67 
     68 float **matrix(long nrl, long nrh, long ncl, long nch)
     69 /* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
     70 {
     71     long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
     72     float **m;
     73 
     74     /* allocate pointers to rows */
     75     m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*)));
     76     if (!m) nrerror("allocation failure 1 in matrix()");
     77     m += NR_END;
     78     m -= nrl;
     79 
     80     /* allocate rows and set pointers to them */
     81     m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float)));
     82     if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
     83     m[nrl] += NR_END;
     84     m[nrl] -= ncl;
     85 
     86     for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
     87 
     88     /* return pointer to array of pointers to rows */
     89     return m;
     90 }
     91 
     92 double **dmatrix(long nrl, long nrh, long ncl, long nch)
     93 /* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */
     94 {
     95     long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
     96     double **m;
     97 
     98     /* allocate pointers to rows */
     99     m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
    100     if (!m) nrerror("allocation failure 1 in matrix()");
    101     m += NR_END;
    102     m -= nrl;
    103 
    104     /* allocate rows and set pointers to them */
    105     m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
    106     if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
    107     m[nrl] += NR_END;
    108     m[nrl] -= ncl;
    109 
    110     for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
    111 
    112     /* return pointer to array of pointers to rows */
    113     return m;
    114 }
    115 
    116 int **imatrix(long nrl, long nrh, long ncl, long nch)
    117 /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
    118 {
    119     long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
    120     int **m;
    121 
    122     /* allocate pointers to rows */
    123     m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*)));
    124     if (!m) nrerror("allocation failure 1 in matrix()");
    125     m += NR_END;
    126     m -= nrl;
    127 
    128 
    129     /* allocate rows and set pointers to them */
    130     m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int)));
    131     if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
    132     m[nrl] += NR_END;
    133     m[nrl] -= ncl;
    134 
    135     for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
    136 
    137     /* return pointer to array of pointers to rows */
    138     return m;
    139 }
    140 
    141 float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
    142     long newrl, long newcl)
    143 /* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */
    144 {
    145     long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl;
    146     float **m;
    147 
    148     /* allocate array of pointers to rows */
    149     m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
    150     if (!m) nrerror("allocation failure in submatrix()");
    151     m += NR_END;
    152     m -= newrl;
    153 
    154     /* set pointers to rows */
    155     for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol;
    156 
    157     /* return pointer to array of pointers to rows */
    158     return m;
    159 }
    160 
    161 float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch)
    162 /* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
    163 declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
    164 and ncol=nch-ncl+1. The routine should be called with the address
    165 &a[0][0] as the first argument. */
    166 {
    167     long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
    168     float **m;
    169 
    170     /* allocate pointers to rows */
    171     m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
    172     if (!m) nrerror("allocation failure in convert_matrix()");
    173     m += NR_END;
    174     m -= nrl;
    175 
    176     /* set pointers to rows */
    177     m[nrl]=a-ncl;
    178     for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol;
    179     /* return pointer to array of pointers to rows */
    180     return m;
    181 }
    182 
    183 float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh)
    184 /* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */
    185 {
    186     long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1;
    187     float ***t;
    188 
    189     /* allocate pointers to pointers to rows */
    190     t=(float ***) malloc((size_t)((nrow+NR_END)*sizeof(float**)));
    191     if (!t) nrerror("allocation failure 1 in f3tensor()");
    192     t += NR_END;
    193     t -= nrl;
    194 
    195     /* allocate pointers to rows and set pointers to them */
    196     t[nrl]=(float **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float*)));
    197     if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()");
    198     t[nrl] += NR_END;
    199     t[nrl] -= ncl;
    200 
    201     /* allocate rows and set pointers to them */
    202     t[nrl][ncl]=(float *) malloc((size_t)((nrow*ncol*ndep+NR_END)*sizeof(float)));
    203     if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()");
    204     t[nrl][ncl] += NR_END;
    205     t[nrl][ncl] -= ndl;
    206 
    207     for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep;
    208     for(i=nrl+1;i<=nrh;i++) {
    209         t[i]=t[i-1]+ncol;
    210         t[i][ncl]=t[i-1][ncl]+ncol*ndep;
    211         for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep;
    212     }
    213 
    214     /* return pointer to array of pointers to rows */
    215     return t;
    216 }
    217 
    218 void free_vector(float *v, long nl, long nh)
    219 /* free a float vector allocated with vector() */
    220 {
    221     free((FREE_ARG) (v+nl-NR_END));
    222 }
    223 
    224 void free_ivector(int *v, long nl, long nh)
    225 /* free an int vector allocated with ivector() */
    226 {
    227     free((FREE_ARG) (v+nl-NR_END));
    228 }
    229 
    230 void free_cvector(unsigned char *v, long nl, long nh)
    231 /* free an unsigned char vector allocated with cvector() */
    232 {
    233     free((FREE_ARG) (v+nl-NR_END));
    234 }
    235 
    236 void free_lvector(unsigned long *v, long nl, long nh)
    237 /* free an unsigned long vector allocated with lvector() */
    238 {
    239     free((FREE_ARG) (v+nl-NR_END));
    240 }
    241 
    242 void free_dvector(double *v, long nl, long nh)
    243 /* free a double vector allocated with dvector() */
    244 {
    245     free((FREE_ARG) (v+nl-NR_END));
    246 }
    247 
    248 void free_matrix(float **m, long nrl, long nrh, long ncl, long nch)
    249 /* free a float matrix allocated by matrix() */
    250 {
    251     free((FREE_ARG) (m[nrl]+ncl-NR_END));
    252     free((FREE_ARG) (m+nrl-NR_END));
    253 }
    254 
    255 void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch)
    256 /* free a double matrix allocated by dmatrix() */
    257 {
    258     free((FREE_ARG) (m[nrl]+ncl-NR_END));
    259     free((FREE_ARG) (m+nrl-NR_END));
    260 }
    261 
    262 void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch)
    263 /* free an int matrix allocated by imatrix() */
    264 {
    265     free((FREE_ARG) (m[nrl]+ncl-NR_END));
    266     free((FREE_ARG) (m+nrl-NR_END));
    267 }
    268 
    269 void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch)
    270 /* free a submatrix allocated by submatrix() */
    271 {
    272     free((FREE_ARG) (b+nrl-NR_END));
    273 }
    274 
    275 void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch)
    276 /* free a matrix allocated by convert_matrix() */
    277 {
    278     free((FREE_ARG) (b+nrl-NR_END));
    279 }
    280 
    281 void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch,
    282     long ndl, long ndh)
    283 /* free a float f3tensor allocated by f3tensor() */
    284 {
    285     free((FREE_ARG) (t[nrl][ncl]+ndl-NR_END));
    286     free((FREE_ARG) (t[nrl]+ncl-NR_END));
    287     free((FREE_ARG) (t+nrl-NR_END));
    288 }
    289 
    290 #else /* ANSI */
    291 /* traditional - K&R */
    292 
    293 #include <stdio.h>
    294 #define NR_END 1
    295 #define FREE_ARG char*
    296 
    297 void nrerror(error_text)
    298 char error_text[];
    299 /* Numerical Recipes standard error handler */
    300 {
    301     void exit();
    302 
    303     fprintf(stderr,"Numerical Recipes run-time error...
    ");
    304     fprintf(stderr,"%s
    ",error_text);
    305     fprintf(stderr,"...now exiting to system...
    ");
    306     exit(1);
    307 }
    308 
    309 float *vector(nl,nh)
    310 long nh,nl;
    311 /* allocate a float vector with subscript range v[nl..nh] */
    312 {
    313     float *v;
    314 
    315     v=(float *)malloc((unsigned int) ((nh-nl+1+NR_END)*sizeof(float)));
    316     if (!v) nrerror("allocation failure in vector()");
    317     return v-nl+NR_END;
    318 }
    319 
    320 int *ivector(nl,nh)
    321 long nh,nl;
    322 /* allocate an int vector with subscript range v[nl..nh] */
    323 {
    324     int *v;
    325 
    326     v=(int *)malloc((unsigned int) ((nh-nl+1+NR_END)*sizeof(int)));
    327     if (!v) nrerror("allocation failure in ivector()");
    328     return v-nl+NR_END;
    329 }
    330 
    331 unsigned char *cvector(nl,nh)
    332 long nh,nl;
    333 /* allocate an unsigned char vector with subscript range v[nl..nh] */
    334 {
    335     unsigned char *v;
    336 
    337     v=(unsigned char *)malloc((unsigned int) ((nh-nl+1+NR_END)*sizeof(unsigned char)));
    338     if (!v) nrerror("allocation failure in cvector()");
    339     return v-nl+NR_END;
    340 }
    341 
    342 unsigned long *lvector(nl,nh)
    343 long nh,nl;
    344 /* allocate an unsigned long vector with subscript range v[nl..nh] */
    345 {
    346     unsigned long *v;
    347 
    348     v=(unsigned long *)malloc((unsigned int) ((nh-nl+1+NR_END)*sizeof(long)));
    349     if (!v) nrerror("allocation failure in lvector()");
    350     return v-nl+NR_END;
    351 }
    352 
    353 double *dvector(nl,nh)
    354 long nh,nl;
    355 /* allocate a double vector with subscript range v[nl..nh] */
    356 {
    357     double *v;
    358 
    359     v=(double *)malloc((unsigned int) ((nh-nl+1+NR_END)*sizeof(double)));
    360     if (!v) nrerror("allocation failure in dvector()");
    361     return v-nl+NR_END;
    362 }
    363 
    364 float **matrix(nrl,nrh,ncl,nch)
    365 long nch,ncl,nrh,nrl;
    366 /* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
    367 {
    368     long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
    369     float **m;
    370 
    371     /* allocate pointers to rows */
    372     m=(float **) malloc((unsigned int)((nrow+NR_END)*sizeof(float*)));
    373     if (!m) nrerror("allocation failure 1 in matrix()");
    374     m += NR_END;
    375     m -= nrl;
    376 
    377     /* allocate rows and set pointers to them */
    378     m[nrl]=(float *) malloc((unsigned int)((nrow*ncol+NR_END)*sizeof(float)));
    379     if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
    380     m[nrl] += NR_END;
    381     m[nrl] -= ncl;
    382 
    383     for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
    384 
    385     /* return pointer to array of pointers to rows */
    386     return m;
    387 }
    388 
    389 double **dmatrix(nrl,nrh,ncl,nch)
    390 long nch,ncl,nrh,nrl;
    391 /* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */
    392 {
    393     long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
    394     double **m;
    395 
    396     /* allocate pointers to rows */
    397     m=(double **) malloc((unsigned int)((nrow+NR_END)*sizeof(double*)));
    398     if (!m) nrerror("allocation failure 1 in matrix()");
    399     m += NR_END;
    400     m -= nrl;
    401 
    402     /* allocate rows and set pointers to them */
    403     m[nrl]=(double *) malloc((unsigned int)((nrow*ncol+NR_END)*sizeof(double)));
    404     if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
    405     m[nrl] += NR_END;
    406     m[nrl] -= ncl;
    407 
    408     for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
    409 
    410     /* return pointer to array of pointers to rows */
    411     return m;
    412 }
    413 
    414 int **imatrix(nrl,nrh,ncl,nch)
    415 long nch,ncl,nrh,nrl;
    416 /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
    417 {
    418     long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
    419     int **m;
    420 
    421     /* allocate pointers to rows */
    422     m=(int **) malloc((unsigned int)((nrow+NR_END)*sizeof(int*)));
    423     if (!m) nrerror("allocation failure 1 in matrix()");
    424     m += NR_END;
    425     m -= nrl;
    426 
    427 
    428     /* allocate rows and set pointers to them */
    429     m[nrl]=(int *) malloc((unsigned int)((nrow*ncol+NR_END)*sizeof(int)));
    430     if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
    431     m[nrl] += NR_END;
    432     m[nrl] -= ncl;
    433 
    434     for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
    435 
    436     /* return pointer to array of pointers to rows */
    437     return m;
    438 }
    439 
    440 float **submatrix(a,oldrl,oldrh,oldcl,oldch,newrl,newcl)
    441 float **a;
    442 long newcl,newrl,oldch,oldcl,oldrh,oldrl;
    443 /* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */
    444 {
    445     long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl;
    446     float **m;
    447 
    448     /* allocate array of pointers to rows */
    449     m=(float **) malloc((unsigned int) ((nrow+NR_END)*sizeof(float*)));
    450     if (!m) nrerror("allocation failure in submatrix()");
    451     m += NR_END;
    452     m -= newrl;
    453 
    454     /* set pointers to rows */
    455     for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol;
    456 
    457     /* return pointer to array of pointers to rows */
    458     return m;
    459 }
    460 
    461 float **convert_matrix(a,nrl,nrh,ncl,nch)
    462 float *a;
    463 long nch,ncl,nrh,nrl;
    464 /* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
    465 declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
    466 and ncol=nch-ncl+1. The routine should be called with the address
    467 &a[0][0] as the first argument. */
    468 {
    469     long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
    470     float **m;
    471 
    472     /* allocate pointers to rows */
    473     m=(float **) malloc((unsigned int) ((nrow+NR_END)*sizeof(float*)));
    474     if (!m)    nrerror("allocation failure in convert_matrix()");
    475     m += NR_END;
    476     m -= nrl;
    477 
    478     /* set pointers to rows */
    479     m[nrl]=a-ncl;
    480     for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol;
    481     /* return pointer to array of pointers to rows */
    482     return m;
    483 }
    484 
    485 float ***f3tensor(nrl,nrh,ncl,nch,ndl,ndh)
    486 long nch,ncl,ndh,ndl,nrh,nrl;
    487 /* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */
    488 {
    489     long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1;
    490     float ***t;
    491 
    492     /* allocate pointers to pointers to rows */
    493     t=(float ***) malloc((unsigned int)((nrow+NR_END)*sizeof(float**)));
    494     if (!t) nrerror("allocation failure 1 in f3tensor()");
    495     t += NR_END;
    496     t -= nrl;
    497 
    498     /* allocate pointers to rows and set pointers to them */
    499     t[nrl]=(float **) malloc((unsigned int)((nrow*ncol+NR_END)*sizeof(float*)));
    500     if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()");
    501     t[nrl] += NR_END;
    502     t[nrl] -= ncl;
    503 
    504     /* allocate rows and set pointers to them */
    505     t[nrl][ncl]=(float *) malloc((unsigned int)((nrow*ncol*ndep+NR_END)*sizeof(float)));
    506     if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()");
    507     t[nrl][ncl] += NR_END;
    508     t[nrl][ncl] -= ndl;
    509 
    510     for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep;
    511     for(i=nrl+1;i<=nrh;i++) {
    512         t[i]=t[i-1]+ncol;
    513         t[i][ncl]=t[i-1][ncl]+ncol*ndep;
    514         for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep;
    515     }
    516 
    517     /* return pointer to array of pointers to rows */
    518     return t;
    519 }
    520 
    521 void free_vector(v,nl,nh)
    522 float *v;
    523 long nh,nl;
    524 /* free a float vector allocated with vector() */
    525 {
    526     free((FREE_ARG) (v+nl-NR_END));
    527 }
    528 
    529 void free_ivector(v,nl,nh)
    530 int *v;
    531 long nh,nl;
    532 /* free an int vector allocated with ivector() */
    533 {
    534     free((FREE_ARG) (v+nl-NR_END));
    535 }
    536 
    537 void free_cvector(v,nl,nh)
    538 long nh,nl;
    539 unsigned char *v;
    540 /* free an unsigned char vector allocated with cvector() */
    541 {
    542     free((FREE_ARG) (v+nl-NR_END));
    543 }
    544 
    545 void free_lvector(v,nl,nh)
    546 long nh,nl;
    547 unsigned long *v;
    548 /* free an unsigned long vector allocated with lvector() */
    549 {
    550     free((FREE_ARG) (v+nl-NR_END));
    551 }
    552 
    553 void free_dvector(v,nl,nh)
    554 double *v;
    555 long nh,nl;
    556 /* free a double vector allocated with dvector() */
    557 {
    558     free((FREE_ARG) (v+nl-NR_END));
    559 }
    560 
    561 void free_matrix(m,nrl,nrh,ncl,nch)
    562 float **m;
    563 long nch,ncl,nrh,nrl;
    564 /* free a float matrix allocated by matrix() */
    565 {
    566     free((FREE_ARG) (m[nrl]+ncl-NR_END));
    567     free((FREE_ARG) (m+nrl-NR_END));
    568 }
    569 
    570 void free_dmatrix(m,nrl,nrh,ncl,nch)
    571 double **m;
    572 long nch,ncl,nrh,nrl;
    573 /* free a double matrix allocated by dmatrix() */
    574 {
    575     free((FREE_ARG) (m[nrl]+ncl-NR_END));
    576     free((FREE_ARG) (m+nrl-NR_END));
    577 }
    578 
    579 void free_imatrix(m,nrl,nrh,ncl,nch)
    580 int **m;
    581 long nch,ncl,nrh,nrl;
    582 /* free an int matrix allocated by imatrix() */
    583 {
    584     free((FREE_ARG) (m[nrl]+ncl-NR_END));
    585     free((FREE_ARG) (m+nrl-NR_END));
    586 }
    587 
    588 void free_submatrix(b,nrl,nrh,ncl,nch)
    589 float **b;
    590 long nch,ncl,nrh,nrl;
    591 /* free a submatrix allocated by submatrix() */
    592 {
    593     free((FREE_ARG) (b+nrl-NR_END));
    594 }
    595 
    596 void free_convert_matrix(b,nrl,nrh,ncl,nch)
    597 float **b;
    598 long nch,ncl,nrh,nrl;
    599 /* free a matrix allocated by convert_matrix() */
    600 {
    601     free((FREE_ARG) (b+nrl-NR_END));
    602 }
    603 
    604 void free_f3tensor(t,nrl,nrh,ncl,nch,ndl,ndh)
    605 float ***t;
    606 long nch,ncl,ndh,ndl,nrh,nrl;
    607 /* free a float f3tensor allocated by f3tensor() */
    608 {
    609     free((FREE_ARG) (t[nrl][ncl]+ndl-NR_END));
    610     free((FREE_ARG) (t[nrl]+ncl-NR_END));
    611     free((FREE_ARG) (t+nrl-NR_END));
    612 }
    613 
    614 #endif /* ANSI */
    nrutil.c
     1 /* Driver for routine spline */
     2 
     3 #include <stdio.h>
     4 #include <math.h>
     5 #define NRANSI
     6 #include "nr.h"
     7 #include "nrutil.h"
     8 
     9 #define N 20
    10 #define PI 3.1415926
    11 
    12 int main(void)
    13 {
    14     int i;
    15     float yp1,ypn,*x,*y,*y2;
    16 
    17     x=vector(1,N);
    18     y=vector(1,N);
    19     y2=vector(1,N);
    20     printf("
    second-derivatives for sin(x) from 0 to pi
    ");
    21     /* Generate array for interpolation */
    22     for (i=1;i<=20;i++) {
    23         x[i]=i*PI/N;
    24         y[i]=sin(x[i]);
    25     }
    26     /* calculate 2nd derivative with spline */
    27     yp1=cos(x[1]);
    28     ypn=cos(x[N]);
    29     spline(x,y,N,yp1,ypn,y2);
    30     /* test result */
    31     printf("%23s %16s
    ","spline","actual");
    32     printf("%11s %14s %16s
    ","angle","2nd deriv","2nd deriv");
    33     for (i=1;i<=N;i++)
    34         printf("%10.2f %16.6f %16.6f
    ",x[i],y2[i],-sin(x[i]));
    35     free_vector(y2,1,N);
    36     free_vector(y,1,N);
    37     free_vector(x,1,N);
    38     return 0;
    39 }
    40 #undef NRANSI
    xspline.c
  • 相关阅读:
    数据科学面试应关注的6个要点
    Python3.9的7个特性
    一种超参数优化技术-Hyperopt
    梯度下降算法在机器学习中的工作原理
    MQ(消息队列)功能介绍
    D. The Number of Pairs 数学
    F. Triangular Paths 思维
    D. XOR-gun 思维和 + 前缀
    C. Basic Diplomacy 思维
    D. Playlist 思维
  • 原文地址:https://www.cnblogs.com/zhubinglong/p/8552415.html
Copyright © 2011-2022 走看看