减少数量超过X天数的分布

时间:2014-02-18 23:30:40

标签: php formula discrete-mathematics

我试图在X天内以递减的方式绘制已知数量的交货分布。我需要帮助我可以在php中实现的公式。

常数为10,000个单位,起始值为平均分布的300%(对于不良条款而言遗憾)。

例如:

10,000个单位将在10天内分发。第一天的交付量比普通平均值高出300%,因此为3,000。这个数字将在接下来的9天内下降,直到所有交付完毕。

我可以通过excel通过计算每个交付的多个系数以减少它来捏造上述示例(这个例子是.71)。

我将在php中实现这一点。这些日子的范围可以从3天到365天不等。

理想情况下,解决方案可以让我在以下方面做点什么:

$units = array();
$startValue = (10000 / $daysToDeliver) * 3;
for ($x= 0, $x < $daysToDeliver, $x++) {
   //add the next deliver quantity onto the array
   $units[] = awesomefunction($lastDeliverAmount, $daysLeftToDeliver);  // guessing here
}

我知道我简化了函数的输入,只是试图给出一个粗略的想法。

感谢您的时间和考虑!

2 个答案:

答案 0 :(得分:2)

正如Manny Ramirez所提到的,这就像一个指数衰减函数;除了它不是连续的,而是离散的。你基本上想要产生:

seq(3a/n*(1-r)^(i-1)) for i from 1 to n

在你的情况下

a = 10000
n = 10
r = necessary value such that sum(seq(...)) == a == 10000

挑战在于找到r。我用了a = ∑3a/n*(1-r)^(i-1) for i from 1 to n。做一些代数操作,我简化了这个:

3(1-r)^n+r*n-3=0

但是,老实说,没有计算机代数系统,没有简单的方法可以解决这个问题。坦率地说,就像我喜欢PHP一样,它很糟糕。 Python中可能有一个模块可以为您完成此操作。那说......

一旦你使用其中一种方法(或其他方法)来找到r,那么你需要构建数组:

function getUnits ($total, $days, $rate) {
  $start = $total * 3 / $days;
  $units = array();
  for ($i = 1; $i <= $days; $i++) {
    $units[] = $start * pow((1 - $rate), $i - 1);
  }
  return $units;
}

//try with the numbers we have here
$units = getUnits(10000, 10, 0.290271556501);
print_r($units);
echo array_sum($units);

这给出了

>> Array ( [0] => 3000 [1] => 2129.185330497 [2] => 1511.1433905345 [3] => 1072.5014464679 [4] => 761.18478225207 [5] => 540.23449072289 [6] => 383.41978422523 [7] => 272.1239266649 [8] => 193.13409091071 [9] => 137.07275772865 )
>> 10000.000000004

答案 1 :(得分:1)

您正在处理增长和衰退问题。衰减由这个公式给出:y = a(1-r)^ x。 a 是初始金额, y 是每天发货量, x 是天数,在您的情况下是10天1,因为你强迫第一天的金额为a / x * 3。然后计算速率 r 并构造一个简单的循环是一件简单的事情。