Source: Core/LagrangePolynomialApproximation.js

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