Skip to content
Snippets Groups Projects
Select Git revision
  • 2b5f62c42265e82e49372920a55bd7007943b803
  • master default protected
  • leo
  • dex
  • pendulum
  • apfelstruder
  • littlerascal
7 results

smallmath.js

Blame
  • smallmath.js 1.69 KiB
    // least squares from https://medium.com/@sahirnambiar/linear-least-squares-a-javascript-implementation-and-a-definitional-question-e3fba55a6d4b
    // mod to return object of m, b, values.x, values.y,
    var smallmath = {
      lsq: function(values_x, values_y) {
        var x_sum = 0;
        var y_sum = 0;
        var xy_sum = 0;
        var xx_sum = 0;
        var count = 0;
    
        /*
         * The above is just for quick access, makes the program faster
         */
        var x = 0;
        var y = 0;
        var values_length = values_x.length;
    
        if (values_length != values_y.length) {
          throw new Error('The parameters values_x and values_y need to have same size!');
        }
    
        /*
         * Above and below cover edge cases
         */
        if (values_length === 0) {
          return [
            [],
            []
          ];
        }
    
        /*
         * Calculate the sum for each of the parts necessary.
         */
        for (let i = 0; i < values_length; i++) {
          x = values_x[i];
          y = values_y[i];
          x_sum += x;
          y_sum += y;
          xx_sum += x * x;
          xy_sum += x * y;
          count++;
        }
    
        /*
         * Calculate m and b for the line equation:
         * y = x * m + b
         */
        var m = (count * xy_sum - x_sum * y_sum) / (count * xx_sum - x_sum * x_sum);
        var b = (y_sum / count) - (m * x_sum) / count;
    
        /*
         * We then return the x and y data points according to our fit
         */
        var result_values_x = [];
        var result_values_y = [];
    
        for (let i = 0; i < values_length; i++) {
          x = values_x[i];
          y = x * m + b;
          result_values_x.push(x);
          result_values_y.push(y);
        }
    
        return {
          m: m,
          b: b,
          values: {
            x: result_values_x,
            y: result_values_y
          }
        }
      }
    }
    
    export default smallmath