2010-03-09 19 views
1

J'ai donc un compteur. Il est censé calculer le montant actuel de quelque chose. Pour calculer cela, je connais la date de début et le montant de départ, ainsi que le montant à incrémenter le compteur chaque seconde. Peasy facile. La partie délicate est que la croissance n'est pas tout à fait linéaire. Chaque jour, le montant de l'augmentation augmente d'un montant fixe. J'ai besoin de recréer cet algorithme - fondamentalement comprendre la valeur exacte à la date actuelle en fonction de la valeur de départ, le montant incrémenté au fil du temps, et le montant de l'augmentation a augmenté au fil du temps.Compteur non linéaire

Ma langue cible est Javascript, mais est pseudocode bien aussi.

Sur la base de la solution 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); 

Est-ce que vous regardez les gars raisonnable?

+6

Et je parie que vous pensiez que toutes ces classes de calcul seraient inutiles ... –

+2

@Ignacio: depuis quand avez-vous besoin de calcul pour reconnaître une progression arithmétique? – AVB

Répondre

2

C'est une fonction quadratique. Si t est le temps écoulé, il est habituel à + bt + c, et vous pouvez comprendre a,b,c en remplaçant les résultats pour les 3 premières secondes. Ou: utilisez la formule pour la somme arithmetic progression, où a1 est l'incrément initial, et d est le "montant défini" auquel vous faites référence. N'oubliez pas d'ajouter votre "montant de départ" à ce que la formule vous donne.

Si x est le montant initial, d est l'augmentation initiale et e est le "montant fixé" pour augmenter la incerement, il s'agit de x + (t/2) * (2d + (t-1) * e)

+0

Est-ce que la solution de progression arithmétique ne fonctionne que pour des augmentations discrètes? La façon dont j'ai formulé ma question implique que c'est effectivement ce que je cherchais, mais si l'augmentation se produit continuellement tout au long de la journée, et pas discrètement chaque jour, alors quelque chose me dit que je devrais utiliser une formule différente .Un collègue a suggéré une intégrale quelconque, mais mon bagage mathématique est insuffisant pour porter un jugement initial sur l'efficacité potentielle de cette solution. Nous vous remercions de votre aide, Patrick – uncultured

+0

@uncultured: Vous avez à peu près répondu à votre propre question. Lorsque vous passez d'un paramètre discret à un paramètre continu, les sommes sont remplacées par des intégrales et les différences par des dérivées. Le reste dépend beaucoup des particularités de votre cas. – AVB

+0

Merci encore. Je pense que la solution de progression arithmétique sera plus que suffisante pour mes besoins. Ces chiffres sont marketing, pas scientifique ou mission critique, créant ainsi un analogue parfait à la réalité est exagéré. – uncultured

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); 
} 

Sortie:

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

Si je comprends bien votre question, vous avez une valeur initiale x_0, un incrément initial par seconde de d_0 et un ajustement d'augmentation de e par jour. Autrement dit, le premier jour l'incrément par seconde est d_0, le deuxième jour de l'incrément par seconde est d_0 + e, etc.

, nous notons ensuite que l'incrément par seconde au moment t est

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

S est le nombre de secondes par jour et t est le nombre de secondes écoulées depuis t = t_0. Puis

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

est la formule que vous recherchez. De là, vous pouvez simplifier cela à

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