| 62 | } |
| 63 | |
| 64 | int nsl_diff_first_deriv_second_order(const double* x, double* y, const size_t n) { |
| 65 | if (n < 3) |
| 66 | return -1; |
| 67 | |
| 68 | double dy = 0, oldy = 0, oldy2 = 0, xdata[3], ydata[3]; |
| 69 | size_t i, j; |
| 70 | for (i = 0; i < n; i++) { |
| 71 | if (i == 0) { |
| 72 | /* 3-point forward */ |
| 73 | for (j = 0; j < 3; j++) |
| 74 | xdata[j] = x[j], ydata[j] = y[j]; |
| 75 | dy = nsl_sf_poly_interp_lagrange_2_deriv(x[0], xdata, ydata); |
| 76 | } else if (i < n - 1) { |
| 77 | /* 3-point center */ |
| 78 | for (j = 0; j < 3; j++) |
| 79 | xdata[j] = x[i - 1 + j], ydata[j] = y[i - 1 + j]; |
| 80 | dy = nsl_sf_poly_interp_lagrange_2_deriv(x[i], xdata, ydata); |
| 81 | } else if (i == n - 1) { |
| 82 | /* 3-point backward */ |
| 83 | y[i] = nsl_sf_poly_interp_lagrange_2_deriv(x[i], xdata, ydata); |
| 84 | y[i - 1] = oldy; |
| 85 | } |
| 86 | |
| 87 | if (i > 1) |
| 88 | y[i - 2] = oldy2; |
| 89 | if (i > 0 && i < n - 1) |
| 90 | oldy2 = oldy; |
| 91 | |
| 92 | oldy = dy; |
| 93 | } |
| 94 | |
| 95 | return 0; |
| 96 | } |
| 97 | |
| 98 | int nsl_diff_first_deriv_fourth_order(const double* x, double* y, const size_t n) { |
| 99 | if (n < 5) |
no test coverage detected