2013-01-04 18 views
7

Ich versuche, Microsoft Excel GROWTH Funktion in JavaScript zu implementieren. Diese Funktion berechnet das vorhergesagte exponentielle Wachstum unter Verwendung vorhandener Daten. Was es schwierig macht, ist, dass es mit mehreren Mengen von known_x's Werten arbeiten muss. Ich konnte keine Referenzgleichung finden. Irgendwelche Vorschläge?So implementieren Sie GROWTH-Funktion in JavaScript

Vielen Dank im Voraus für Ihre Hilfe.

+4

Sie könnten fragen [math.stackexchange.com] (http://math.stackexchange.com) –

+0

Danke für den Vorschlag. Wird besorgt! –

Antwort

1

Hier ist eine Neuimplementierung basierend auf my answer at math.SE und die simple linear regression Formeln aus der Wikipedia-Seite:

function growth (known_y, known_x, new_x, use_const) { 
    // default values for optional parameters: 
    if (typeof(known_x) == 'undefined') { 
     known_x = []; 
     for (var i = 1; i <= known_y.length; i++) known_x.push(i); 
    } 
    if (typeof(new_x) == 'undefined') { 
     new_x = []; 
     for (var i = 1; i <= known_y.length; i++) new_x.push(i); 
    } 
    if (typeof(use_const) == 'undefined') use_const = true; 

    // calculate sums over the data: 
    var n = known_y.length; 
    var avg_x = 0; var avg_y = 0; var avg_xy = 0; var avg_xx = 0; 
    for (var i = 0; i < n; i++) { 
     var x = known_x[i]; var y = Math.log(known_y[i]); 
     avg_x += x; avg_y += y; avg_xy += x*y; avg_xx += x*x; 
    } 
    avg_x /= n; avg_y /= n; avg_xy /= n; avg_xx /= n; 

    // compute linear regression coefficients: 
    if (use_const) { 
     var beta = (avg_xy - avg_x*avg_y)/(avg_xx - avg_x*avg_x); 
     var alpha = avg_y - beta*avg_x; 
    } else { 
     var beta = avg_xy/avg_xx; 
     var alpha = 0; 
    } 
    // console.log("alpha = " + alpha + ", beta = " + beta); 

    // compute and return result array: 
    var new_y = []; 
    for (var i = 0; i < new_x.length; i++) { 
     new_y.push(Math.exp(alpha + beta * new_x[i])); 
    } 
    return new_y; 
} 

Here's a demo on ideone.com. Sie können die Ausgabe mit der Demo-Arbeitsblatt auf dem Excel GROWTH documentation page vergleichen.

Beachten Sie, dass die numerische Stabilität der Summierungsschleife im Algorithmus verbessert werden konnte, indem Techniken wie die auf der Wikipedia-Seite für calculating the variance, wie Kahan summation beschriebenen verwendet werden. Für einfache Beispiele wie diese ist die naive Summierungsschleife jedoch ziemlich gut genug.

+0

Sie rocken! Danke vielmals. Ich habe Ihren Code verwendet und Ihnen auf http://stoic.com/formula und in der Codebasis unter http://stoic.com/formula/lib/formula.js Guthaben gegeben –

Verwandte Themen