LagrangePolynomialApproximation.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import defined from "./defined.js";
  2. /**
  3. * An {@link InterpolationAlgorithm} for performing Lagrange interpolation.
  4. *
  5. * @namespace LagrangePolynomialApproximation
  6. */
  7. const LagrangePolynomialApproximation = {
  8. type: "Lagrange",
  9. };
  10. /**
  11. * Given the desired degree, returns the number of data points required for interpolation.
  12. *
  13. * @param {Number} degree The desired degree of interpolation.
  14. * @returns {Number} The number of required data points needed for the desired degree of interpolation.
  15. */
  16. LagrangePolynomialApproximation.getRequiredDataPoints = function (degree) {
  17. return Math.max(degree + 1.0, 2);
  18. };
  19. /**
  20. * Interpolates values using Lagrange Polynomial Approximation.
  21. *
  22. * @param {Number} x The independent variable for which the dependent variables will be interpolated.
  23. * @param {Number[]} xTable The array of independent variables to use to interpolate. The values
  24. * in this array must be in increasing order and the same value must not occur twice in the array.
  25. * @param {Number[]} yTable The array of dependent variables to use to interpolate. For a set of three
  26. * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}.
  27. * @param {Number} yStride The number of dependent variable values in yTable corresponding to
  28. * each independent variable value in xTable.
  29. * @param {Number[]} [result] An existing array into which to store the result.
  30. * @returns {Number[]} The array of interpolated values, or the result parameter if one was provided.
  31. */
  32. LagrangePolynomialApproximation.interpolateOrderZero = function (
  33. x,
  34. xTable,
  35. yTable,
  36. yStride,
  37. result
  38. ) {
  39. if (!defined(result)) {
  40. result = new Array(yStride);
  41. }
  42. let i;
  43. let j;
  44. const length = xTable.length;
  45. for (i = 0; i < yStride; i++) {
  46. result[i] = 0;
  47. }
  48. for (i = 0; i < length; i++) {
  49. let coefficient = 1;
  50. for (j = 0; j < length; j++) {
  51. if (j !== i) {
  52. const diffX = xTable[i] - xTable[j];
  53. coefficient *= (x - xTable[j]) / diffX;
  54. }
  55. }
  56. for (j = 0; j < yStride; j++) {
  57. result[j] += coefficient * yTable[i * yStride + j];
  58. }
  59. }
  60. return result;
  61. };
  62. export default LagrangePolynomialApproximation;