我试图在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
}
我知道我简化了函数的输入,只是试图给出一个粗略的想法。
感谢您的时间和考虑!
答案 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 并构造一个简单的循环是一件简单的事情。