2010-03-09 66 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.