非线性计数器

时间:2010-03-09 16:36:52

标签: algorithm math counter nonlinear-functions

所以我有一个柜台。它应该计算当前的东西量。为了计算这一点,我知道开始日期,开始金额以及每秒增加计数器的数量。十分简单。棘手的部分是增长不是很线性。每天,增量增加一定量。我需要在算法上重新创建 - 基本上根据起始值,随时间增加的量以及增量随时间增加的量来计算当前日期的确切值。

我的目标语言是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);

这对你们来说看起来合情合理吗?

3 个答案:

答案 0 :(得分:2)

这是二次函数。如果t是时间过去,那么通常在 2 + bt + c,你可以通过将结果替换为前3秒来找出a,b,c。 / p>

或者:使用arithmetic progression总和的公式,其中a1是初始增量,d是您所指的“设定金额”。只是不要忘记将“起始量”添加到公式给你的内容。

如果x 0 是初始量,d是初始增量,e是增加启动量的“设定量”,它来到 x 0 +(t / 2)*(2d +(t-1)* e)

答案 1 :(得分: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.

答案 2 :(得分: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