diff geotemco/lib/simile/timeplot/scripts/math.js @ 0:b12c99b7c3f0

commit for previous development
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Mon, 19 Jan 2015 17:13:49 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/geotemco/lib/simile/timeplot/scripts/math.js	Mon Jan 19 17:13:49 2015 +0100
@@ -0,0 +1,193 @@
+/**
+ * Math Utility functions
+ * 
+ * @fileOverview Math Utility functions
+ * @name Math
+ */
+
+Timeplot.Math = { 
+
+    /**
+     * Evaluates the range (min and max values) of the given array
+     */
+    range: function(f) {
+        var F = f.length;
+        var min = Number.MAX_VALUE;
+        var max = Number.MIN_VALUE;
+
+        for (var t = 0; t < F; t++) {
+            var value = f[t];
+            if (value < min) {
+                min = value;
+            }
+            if (value > max) {
+                max = value;
+            }    
+        }
+
+        return {
+            min: min,
+            max: max
+        }
+    },
+
+    /**
+     * Evaluates the windows average of a given array based on the
+     * given window size
+     */
+    movingAverage: function(f, size) {
+        var F = f.length;
+        var g = new Array(F);
+        for (var n = 0; n < F; n++) {
+            var value = 0;
+            for (var m = n - size; m < n + size; m++) {
+                if (m < 0) {
+                    var v = f[0];
+                } else if (m >= F) {
+                    var v = g[n-1];
+                } else {
+                    var v = f[m];
+                }
+                value += v;
+            }
+            g[n] = value / (2 * size);
+        }
+        return g;
+    },
+
+    /**
+     * Returns an array with the integral of the given array
+     */
+    integral: function(f) {
+        var F = f.length;
+
+        var g = new Array(F);
+        var sum = 0;
+
+        for (var t = 0; t < F; t++) {
+           sum += f[t];
+           g[t] = sum;  
+        }
+
+        return g;
+    },
+
+    /**
+     * Normalizes an array so that its complete integral is 1.
+     * This is useful to obtain arrays that preserve the overall
+     * integral of a convolution. 
+     */
+    normalize: function(f) {
+        var F = f.length;
+        var sum = 0.0;
+
+        for (var t = 0; t < F; t++) {
+            sum += f[t];
+        }
+
+        for (var t = 0; t < F; t++) {
+            f[t] /= sum;
+        }
+
+        return f;
+    },
+
+    /**
+     * Calculates the convolution between two arrays
+     */
+    convolution: function(f,g) {
+        var F = f.length;
+        var G = g.length;
+
+        var c = new Array(F);
+
+        for (var m = 0; m < F; m++) {
+            var r = 0;
+            var end = (m + G < F) ? m + G : F;
+            for (var n = m; n < end; n++) {
+                var a = f[n - G];
+                var b = g[n - m];
+                r += a * b;
+            }
+            c[m] = r;
+        }
+
+        return c;
+    },
+
+    // ------ Array generators ------------------------------------------------- 
+    // Functions that generate arrays based on mathematical functions
+    // Normally these are used to produce operators by convolving them with the input array
+    // The returned arrays have the property of having 
+
+    /**
+     * Generate the heavyside step function of given size
+     */
+    heavyside: function(size) {
+        var f =  new Array(size);
+        var value = 1 / size;
+        for (var t = 0; t < size; t++) {
+            f[t] = value;
+        }
+        return f;
+    },
+
+    /**
+     * Generate the gaussian function so that at the given 'size' it has value 'threshold'
+     * and make sure its integral is one.
+     */
+    gaussian: function(size, threshold) {
+        with (Math) {
+            var radius = size / 2;
+            var variance = radius * radius / log(threshold); 
+            var g = new Array(size);
+            for (var t = 0; t < size; t++) {
+                var l = t - radius;
+                g[t] = exp(-variance * l * l);
+            }
+        }
+
+        return this.normalize(g);
+    },
+
+    // ---- Utility Methods --------------------------------------------------
+
+    /**
+     * Return x with n significant figures 
+     */
+    round: function(x,n) {
+        with (Math) {
+            if (abs(x) > 1) {
+                var l = floor(log(x)/log(10));
+                var d = round(exp((l-n+1)*log(10)));
+                var y = round(round(x / d) * d);
+                return y;
+            } else {
+                log("FIXME(SM): still to implement for 0 < abs(x) < 1");
+                return x;
+            }
+        }
+    },
+    
+    /**
+     * Return the hyperbolic tangent of x
+     */
+    tanh: function(x) {
+        if (x > 5) {
+            return 1;
+        } else if (x < 5) {
+            return -1;
+        } else {
+            var expx2 = Math.exp(2 * x);
+            return (expx2 - 1) / (expx2 + 1);
+        }
+    },
+    
+    /** 
+     * Returns true if |a.x - b.x| < value && | a.y - b.y | < value
+     */
+    isClose: function(a,b,value) {
+        return (a && b && Math.abs(a.x - b.x) < value && Math.abs(a.y - b.y) < value);
+    }
+
+}
\ No newline at end of file