16 #ifndef QMCPLUSPLUS_SPLINESOLVERS_H 17 #define QMCPLUSPLUS_SPLINESOLVERS_H 36 T bc_start1 = ((yp0 < 9.9000000000000002e+29) ? (2 * x[0] - 2 * x[1]) : (1));
37 T bc_start2 = ((yp0 < 9.9000000000000002e+29) ? (x[0] - x[1]) : (0));
38 T bc_end1 = ((ypn < 9.9000000000000002e+29) ? (x[
n - 1] - x[
n - 2]) : (0));
39 T bc_end2 = ((ypn < 9.9000000000000002e+29) ? (2 * x[
n - 1] - 2 * x[
n - 2]) : (1));
41 ((yp0 < 9.9000000000000002e+29) ? (6 * yp0 + 6 * y[0] / (-x[0] + x[1]) - 6 * y[1] / (-x[0] + x[1])) : (0));
42 T rhs_end = ((ypn < 9.9000000000000002e+29)
43 ? (6 * ypn - 6 * y[
n - 1] / (x[
n - 1] - x[
n - 2]) + 6 * y[
n - 2] / (x[
n - 1] - x[
n - 2]))
45 y2[0] = bc_start2 / bc_start1;
46 u[0] = rhs_start / bc_start1;
47 for (
auto i = 1; i <
n - 1; i += 1)
54 T z5 = z2 * y2[i - 1];
56 u[i] = (z1 * z2 * z2 * u[i - 1] - 6 * z1 * (z6 + y[i - 1]) + 6 * z2 * (z6 + y[i + 1])) / (z1 * z2 * (z3 - z4 + z5));
57 y2[i] = (-x[i + 1] + x[i]) / (-z3 + z4 - z5);
59 y2[
n - 1] = (-bc_end1 * u[
n - 2] + rhs_end) / (-bc_end1 * y2[
n - 2] + bc_end2);
60 for (
auto i =
n - 2; i >= 0; i += -1)
62 y2[i] = u[i] - y2[i + 1] * y2[i];
77 template<
typename Tg,
typename T>
84 T Q, R, Q2, Q3, R2, QR, P, P2, PQ, PR, PQQR, B1, V, TT, S, U, P3;
91 D[0] = E[0] = D[1] = 0.0;
93 D[1] = 6.0 * Q * Q2 / (QR * QR);
94 for (
int i = 1; i < M; i++)
98 R = X[i + 2] - X[i + 1];
106 D[i + 1] = E[i] = F[i - 1] = 0.0;
113 D[i + 1] = 6.0 * Q3 / (QR * QR);
115 (15.0 * PR * PR + (P + R) * Q * (20.0 * PR + 7.0 * Q2) + Q2 * (8.0 * (P2 + R2) + 21.0 * PR + 2.0 * Q2)) /
117 D[i - 1] += 6.0 * Q3 / (PQ * PQ);
118 E[i] = Q2 * (P * QR + 3.0 * PQ * (QR + 2.0 * R)) / (PQQR * QR);
119 E[i - 1] += Q2 * (R * PQ + 3.0 * QR * (PQ + 2.0 * P)) / (PQQR * PQ);
120 F[i - 1] = Q3 / PQQR;
124 D[
N - 3] += 6.0 * R * R2 / (QR * QR);
125 for (
int i = 1; i <
N; i++)
127 if (
std::abs(X[i] - X[i - 1]) < eps)
134 B[i] = (Y[i] - Y[i - 1]) / (X[i] - X[i - 1]);
137 for (
int i = 2; i <
N; i++)
139 if (
std::abs(X[i] - X[i - 2]) < eps)
146 C[i] = (
B[i] -
B[i - 1]) / (X[i] - X[i - 2]);
150 P =
C[0] = E[
N - 3] = F[0] = F[
N - 4] = F[
N - 3] = 0.0;
153 for (
int i = 2; i < M; i++)
155 Q = D[i - 1] * E[i - 1];
156 D[i] = 1.0 / (D[i] - P * F[i - 2] - Q * E[i - 1]);
157 E[i] -= Q * F[i - 1];
158 C[i] =
C[i + 2] -
C[i + 1] - P *
C[i - 2] - Q *
C[i - 1];
159 P = D[i - 1] * F[i - 1];
163 for (
int i =
N - 3; i > 0; i--)
164 C[i] = (
C[i] - E[i] *
C[i + 1] - F[i] *
C[i + 2]) * D[i];
183 for (
int i = 1; i < M; i++)
189 R = X[i + 2] - X[i + 1];
197 TT = (
C[i + 1] -
C[i]) / QR;
203 D[i] = E[i] = F[i] = 0.0;
211 D[i] = 10.0 * (
C[i] - Q * S);
212 C[i] = D[i] * (P - Q) + (
B[i + 1] -
B[i] + (U - E[i]) * P3 - (V + E[i]) * Q3) / PQ;
213 B[i] = (P * (
B[i + 1] - V * Q3) + Q * (
B[i] - U * P3)) / PQ - P * Q * (D[i] + E[i] * (Q - P));
217 S = F[0] * P * P * P;
218 E[0] = D[0] = E[
N - 1] = D[
N - 1] = 0.0;
219 C[0] =
C[1] - 10.0 * S;
220 B[0] = B1 - (
C[0] + S) * P;
221 Q = X[
N - 1] - X[
N - 2];
222 TT = F[
N - 2] * Q * Q * Q;
223 C[
N - 1] =
C[
N - 2] + 10.0 * TT;
224 B[
N - 1] =
B[
N - 1] + (
C[
N - 1] - TT) * Q;
void CubicSplineSolve(T const *x, T const *y, int n, T yp0, T ypn, T *y2)
Solve for second derivatives for cubic splines.
MakeReturn< UnaryNode< FnFabs, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t abs(const Vector< T1, C1 > &l)
void QuinticSplineSolve(int N, const Tg *X, T *Y, T *B, T *C, T *D, T *E, T *F)
template function: note that the range of data is [0,n) instead of [1,n] solve the linear system for ...
double B(double x, int k, int i, const std::vector< double > &t)