38 static double *vector(
int n) {
41 b = (
double *) malloc(
sizeof(
double) *
n);
61 void spline(
double x[],
double y[],
int n,
double y2[]) {
66 std::vector<double> u(n - 1);
71 for(i = 1; i <= n - 2; i++) {
72 sig = (x[i] - x[i-1]) / (x[i+1] - x[i-1]);
73 p = sig * y2[i-1] + 2.0;
74 y2[i] = (sig - 1.0) / p;
75 u[i] = (y[i+1] - y[i]) / (x[i+1] - x[i]) - (y[i] - y[i-1]) / (x[i] - x[i-1]);
76 u[i] = (6.0 * u[i] / (x[i+1] - x[i-1]) - sig * u[i-1]) / p;
83 y2[n-1] = (un - qn * u[n-2]) / (qn * y2[n-2] + 1.0);
84 for(k = n - 2; k >= 0; k--)
85 y2[k] = y2[k] * y2[k+1] + u[k];
95 void splint(
double xa[],
double ya[],
double y2a[],
int n,
double x,
double *y) {
113 while(khi - klo > 1) {
114 k = (khi + klo) >> 1;
115 if(xa[k] > xb) khi = k;
118 h = xa[khi] - xa[klo];
124 a = (xa[khi] - xb) / h;
125 b = (xb - xa[klo]) / h;
126 *y = a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) / 6.0;
137 void lsplint(
double xa[],
double ya[],
double y2a[],
int n,
double x,
double *y) {
139 double xb, h, b, a, yy;
155 while(khi - klo > 1) {
156 k = (khi + klo) >> 1;
157 if(xa[k] > xb) khi = k;
160 h = xa[khi] - xa[klo];
166 a = (xa[khi] - xb) / h;
167 b = (xb - xa[klo]) / h;
169 yy = a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) / 6.0;
170 if(ya[khi] > ya[klo]) {
171 if(yy > ya[khi]) yy = ya[khi];
172 else if(yy < ya[klo]) yy = ya[klo];
174 if(yy > ya[klo]) yy = ya[klo];
175 else if(yy < ya[khi]) yy = ya[khi];
void writeBetError(std::string err)
void splint(double xa[], double ya[], double y2a[], int n, double x, double *y)
void spline(double x[], double y[], int n, double y2[])
void lsplint(double xa[], double ya[], double y2a[], int n, double x, double *y)