2013-01-04 14 views
7

Próbuję zaimplementować funkcję Microsoft Excel o nazwie GROWTH w języku JavaScript. Ta funkcja oblicza prognozowany wzrost wykładniczy za pomocą istniejących danych. Podatnością jest to, że musi działać z wieloma zestawami wartości known_x's. Nie mogłem znaleźć żadnego równania odniesienia. Jakieś sugestie?Jak zaimplementować funkcję GROWTH w JavaScript

Z góry dziękuję za pomoc.

+4

Możesz zapytać [math.stackexchange.com] (http://math.stackexchange.com) –

+0

Dzięki za sugestię. Zrobię to! –

Odpowiedz

1

Oto reimplementacja podstawie my answer at math.SE a simple linear regression formuły od strony 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. Możesz porównać wyjście z arkusza demo na Excel GROWTH documentation page.

Należy zauważyć, że stabilność numeryczną pętli podsumowań w algorytmie można poprawić za pomocą technik opisanych na stronie Wikipedia pod adresem calculating the variance, takich jak Kahan summation. Jednak w przypadku prostych przykładów takich jak ta, naiwna pętla sumowania jest wystarczająco dobra.

+0

Skałasz! Dzięki za tonę. Użyłem twojego kodu i dałem ci kredyt na http://stoic.com/formula oraz w codebase na http://stoic.com/formula/lib/formula.js –

Powiązane problemy