| 198 | } |
| 199 | |
| 200 | int nsl_diff_second_deriv_second_order(const double* x, double* y, const size_t n) { |
| 201 | if (n < 4) |
| 202 | return -1; |
| 203 | |
| 204 | double dy[4] = {0}, xdata[4], ydata[4]; |
| 205 | size_t i, j; |
| 206 | for (i = 0; i < n; i++) { |
| 207 | if (i == 0) { |
| 208 | /* 4-point forward */ |
| 209 | for (j = 0; j < 4; j++) |
| 210 | xdata[j] = x[j], ydata[j] = y[j]; |
| 211 | dy[0] = nsl_sf_poly_interp_lagrange_3_deriv2(x[i], xdata, ydata); |
| 212 | } else if (i == n - 1) { |
| 213 | /* 4-point backward */ |
| 214 | for (j = 0; j < 4; j++) |
| 215 | xdata[j] = x[i - 3 + j], ydata[j] = y[i - 3 + j]; |
| 216 | y[i] = nsl_sf_poly_interp_lagrange_3_deriv2(x[i], xdata, ydata); |
| 217 | y[i - 1] = dy[1]; |
| 218 | y[i - 2] = dy[2]; |
| 219 | } else { |
| 220 | /* 3-point center */ |
| 221 | for (j = 0; j < 3; j++) |
| 222 | xdata[j] = x[i - 1 + j], ydata[j] = y[i - 1 + j]; |
| 223 | dy[0] = nsl_sf_poly_interp_lagrange_2_deriv2(xdata, ydata); |
| 224 | } |
| 225 | |
| 226 | if (i > 2) |
| 227 | y[i - 3] = dy[3]; |
| 228 | for (j = 3; j > 0; j--) |
| 229 | if (i >= j - 1) |
| 230 | dy[j] = dy[j - 1]; |
| 231 | } |
| 232 | |
| 233 | return 0; |
| 234 | } |
| 235 | |
| 236 | int nsl_diff_second_deriv_third_order(const double* x, double* y, const size_t n) { |
| 237 | if (n < 5) |
no test coverage detected