2013-01-04 20 views
7

Sto cercando di implementare la funzione GROWTH di Microsoft Excel in JavaScript. Questa funzione calcola la crescita esponenziale prevista utilizzando i dati esistenti. Ciò che lo rende difficile è che deve funzionare con più set di valori known_x's. Non sono riuscito a trovare alcuna equazione di riferimento. Eventuali suggerimenti?Come implementare la funzione GROWTH in JavaScript

Grazie in anticipo per il vostro aiuto.

+4

Si potrebbe chiedere [math.stackexchange.com] (http://math.stackexchange.com) –

+0

Grazie per il suggerimento. Andrà bene! –

risposta

1

Ecco una reimplementazione in base my answer at math.SE ei simple linear regression formule dalla pagina di Wikipedia:

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. È possibile confrontare l'output con il foglio di lavoro demo sul Excel GROWTH documentation page.

Si noti che la stabilità numerica del ciclo di sommatoria nell'algoritmo potrebbe essere migliorata utilizzando tecniche come quelle descritte nella pagina di Wikipedia per calculating the variance, come Kahan summation. Tuttavia, per semplici esempi come questo, il ciclo sommativo naive è abbastanza buono.

+0

Sei rock! Grazie mille. Ho usato il tuo codice e ti ho dato credito su http://stoic.com/formula e nel codebase su http://stoic.com/formula/lib/formula.js –

Problemi correlati