2010-03-09 91 views
1

所以我有一個計數器。它應該計算當前的東西數量。爲了計算這一點,我知道開始日期和開始金額,以及每秒增加計數器的金額。十分簡單。棘手的部分是增長不是非常線性的。每天增量的數量都會增加一個數量。我需要通過算法重新創建 - 基本上根據起始值,隨時間遞增的數量以及增量隨時間增加的數量來計算當前日期的確切值。非線性櫃檯

我的目標語言是JavaScript,但僞代碼也沒關係。

基於AB的解決方案:

var now = new Date(); 

var startDate1 = new Date("January 1 2010"); 
var days1 = (now - startDate1)/1000/60/60/24; 
var startNumber1 = 9344747520; 
var startIncrement1 = 463; 
var dailyIncrementAdjustment1 = .506; 
var currentIncrement = startIncrement1 + (dailyIncrementAdjustment1 * days1); 

startNumber1 = startNumber1 + (days1/2) * (2 * startIncrement1 + (days1 - 1) * dailyIncrementAdjustment1); 

確實看起來合理的你們?

+6

我敢打賭,你認爲所有這些微積分類都是沒用的... – 2010-03-09 16:38:30

+2

@Ignacio:從什麼時候開始需要微積分來識別算術級數? – AVB 2010-03-09 17:20:37

回答

2

這是一個二次函數。如果t是經過的時間,那麼它在 + BT + C通常,你可以通過替代結果第一3秒弄清楚a,b,c

或者:使用arithmetic progression總和的公式,其中a1是初始增量,d是您引用的「設定量」。只要不要忘記添加你的「開始金額」,以公式給你。

如果x 是初始量,d是初始增量,以及e是 「設定量」 增加incerement,它涉及到 X +(T/2)*(2D +(t-1)* e)

+0

算術級數解決方案僅適用於謹慎增加嗎?我的措辭我的問題的方式暗示這確實是我一直在尋找,但如果增加全天都在不斷髮生,而不是在每一天謹慎的一步,那麼東西告訴我,我需要使用不同的公式。一位同事提出了某種形式的積分,但我的數學背景不足以對該解決方案的潛在功效作出任何初步判斷。 感謝您的協助, Patrick – uncultured 2010-03-09 17:37:34

+0

@uncultured:你幾乎回答了你自己的問題。當你從一個離散的設置移動到連續的時候,總和被積分替代,差分被導數所代替。其餘的很大程度上取決於你案件的具體情況。 – AVB 2010-03-09 18:23:51

+0

再次感謝。我認爲算術級數解決方案將足夠滿足我的需求。這些數字是營銷,而不是科學或任務關鍵,所以創建一個完美的模擬與現實是矯枉過正。 – uncultured 2010-03-09 18:56:17

0
use strict; use warnings; 

my $start = 0; 
my $stop = 100; 
my $current = $start; 

for my $day (1 .. 100) { 
    $current += ($day/10); 
    last unless $current < $stop; 
    printf "Day: %d\tLeft %.2f\n", $day, (1 - $current/$stop); 
} 

輸出:

Day: 1 Left 1.00 
Day: 2 Left 1.00 
Day: 3 Left 0.99 
Day: 4 Left 0.99 
Day: 5 Left 0.98 
... 
Day: 42 Left 0.10 
Day: 43 Left 0.05 
Day: 44 Left 0.01
1

如果我正確理解你的問題,你有一個初始值x_0,每d_0秒初始增量和e每天的增量調整。也就是說,在一個每秒增量d_0天,兩個每秒增量d_0 + e天等

然後,我們注意到,在時間t每秒的增量是

d(t) = d_0 + floor(t/S) * e 

哪裏S是每天和t秒數目是因爲t = t_0後已經過的秒數。然後

x = x_0 + sum_{k < floor(t/S)} S * d(k) + S * (t/S - floor(t/S)) * d(t) 

是你正在尋找的公式。在這裏,您可以簡化這

x = x_0 + S * floor(t/S) d_0 + S * e * (floor(t/S) - 1) * floor(t/S)/2.