📄 convnr.c
字号:
/*********************************************************** * Some routines modified from Numerical Recipes in C, * including error report, array or matrix declaration * and releasing, integrations. * * Some frequently used routines are also included here. ****//* * #include <stdlib.h> #include <stdio.h> #include <math.h> */#include "conv.h"/*********************************************************** * Report error message to stderr, then exit the program * with signal 1. ****/voidnrerror(char error_text[]){ fprintf(stderr, "%s.\n", error_text); fprintf(stderr, "...now exiting to system...\n"); exit(1);}/*********************************************************** * Allocate an array with index from nl to nh inclusive. * * Original matrix and vector from Numerical Recipes in C * don't initialize the elements to zero. This will * be accomplished by the following functions. ****/double *AllocVector(short nl, short nh){ double *v; short i; v = (double *) malloc((unsigned) (nh - nl + 1) * sizeof(double)); if (!v) nrerror("allocation failure in vector()"); for (i = nl; i <= nh; i++) v[i] = 0.0; /* init. */ return v - nl;}/*********************************************************** * Allocate a matrix with row index from nrl to nrh * inclusive, and column index from ncl to nch * inclusive. ****/double **AllocMatrix(short nrl, short nrh, short ncl, short nch){ short i, j; double **m; m = (double **) malloc((unsigned) (nrh - nrl + 1) * sizeof(double *)); if (!m) nrerror("allocation failure 1 in matrix()"); m -= nrl; for (i = nrl; i <= nrh; i++) { m[i] = (double *) malloc((unsigned) (nch - ncl + 1) * sizeof(double)); if (!m[i]) nrerror("allocation failure 2 in matrix()"); m[i] -= ncl; } for (i = nrl; i <= nrh; i++) for (j = ncl; j <= nch; j++) m[i][j] = 0.0; return m;}/*********************************************************** * Release the memory. ****/voidFreeVector(double *v, short nl, short nh){ free((char *) (v + nl));}/*********************************************************** * Release the memory. ****/voidFreeMatrix(double **m, short nrl, short nrh, short ncl, short nch){ short i; for (i = nrh; i >= nrl; i--) free((char *) (m[i] + ncl)); free((char *) (m + nrl));}/*********************************************************** * Trapzoidal integration. ****/#define FUNC(x) ((*func)(x))floattrapzd( float (*func) (float), float a, float b, int n){ float x, tnm, sum, del; static float s; static int it; int j; if (n == 1) { it = 1; s = 0.5 * (b - a) * (FUNC(a) + FUNC(b)); } else { tnm = it; del = (b - a) / tnm; x = a + 0.5 * del; for (sum = 0.0, j = 1; j <= it; j++, x += del) sum += FUNC(x); it *= 2; s = 0.5 * (s + (b - a) * sum / tnm); } return (s);}#undef FUNC/*********************************************************** * Allow user to change EPS. * Modifed to do at least three trapzd() in case data is * noisy. 9/26/1994 Lihong Wang. ****/#define JMAX 30floatqtrap( float (*func) (float), float a, float b, float EPS){ int j; float s, s_old = 0; for (j = 1; j <= JMAX; j++) { s = trapzd(func, a, b, j); if (j <= 3 || fabs(s - s_old) > EPS * fabs(s_old)) s_old = s; else break; } return (s);}#undef JMAX/*********************************************************** * Modified Bessel function exp(-x) I0(x), for x >=0. * We modified from the original bessi0(). Instead of * I0(x) itself, it returns I0(x) exp(-x). ****/doubleBessI0(double x){ double ax, ans; double y; if ((ax = fabs(x)) < 3.75) { y = x / 3.75; y *= y; ans = exp(-ax) * (1.0 + y * (3.5156229 + y * (3.0899424 + y * (1.2067492 + y * (0.2659732 + y * (0.360768e-1 + y * 0.45813e-2)))))); } else { y = 3.75 / ax; ans = (1 / sqrt(ax)) * (0.39894228 + y * (0.1328592e-1 + y * (0.225319e-2 + y * (-0.157565e-2 + y * (0.916281e-2 + y * (-0.2057706e-1 + y * (0.2635537e-1 + y * (-0.1647633e-1 + y * 0.392377e-2)))))))); } return ans;}/**************************************************************** ****/shortGetShort(short Lo, short Hi){ char in_str[STRLEN]; short x; gets(in_str); sscanf(in_str, "%hd", &x); while (x < Lo || x > Hi) { printf("...Wrong paramter. Input again: "); gets(in_str); sscanf(in_str, "%hd", &x); } return (x);}/**************************************************************** ****/floatGetFloat(float Lo, float Hi){ char in_str[STRLEN]; float x; gets(in_str); sscanf(in_str, "%f", &x); while (x < Lo || x > Hi) { printf("...Wrong paramter. Input again: "); gets(in_str); sscanf(in_str, "%f", &x); } return (x);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -