生成线性间隔生长速率的向量,知道开始,结束和总复合增长,与numpy或类似

时间:2018-01-05 17:19:54

标签: python arrays numpy math vector

我正在寻找生物学应用的离散生长率模型。我知道每小时的起始增长率(200%)和每小时的结束增长率(2%)。增长率应每小时线性下降。我也知道总增长应该是200倍。我正在尝试计算所需的小时数并生成一个大小为小时数的矢量数组,其中包含增长率(每小时一个值)...类似于[200%,180%,160%.. .4%,2%]。但我需要总复合增长率等于200倍。

我玩过np.linspace和np.geomspace,但是我不够聪明,知道在这种情况下如何让复合增长匹配。

1 个答案:

答案 0 :(得分:1)

以下是您的问题的代码。假设从第一个小时开始到第一个小时结束,增长率为200%,这意味着它从一个值变为其值的3倍。然后从第二个小时的开始到结束的增长降低到较低的速率,依此类推。从最后一小时的开始到结束的增长率是2%,并且速率线性下降 - 即。费率是一个递减的算术级数。

此代码查找最终金额的最小积分小时数至少为初始金额的200倍。我不是一个笨拙的专家,所以我使用常规的Python循环计算整体增长,而不是使用numpy。

import numpy as np

start_growth_rate = 2.00  # 200% as a decimal
stop_growth_rate = 0.02  # 2% as a decimal
target_total_growth = 200  # 200 times larger than the starting value

calced_total_growth = 0
num_hours = 2
while calced_total_growth < target_total_growth:
    rates_array = np.linspace(start=start_growth_rate, stop=stop_growth_rate,
                              num=num_hours)
    calced_total_growth = 1
    for this_growth_rate in rates_array:
        calced_total_growth *= 1 + this_growth_rate
    num_hours += 1

print('Actual total growth rate = {} times over {} hours.'.format(
        calced_total_growth, num_hours - 1))
print('Growths = {}'.format(rates_array))

打印输出

Actual total growth rate = 324.01866418570273 times over 9 hours.
Growths = [ 2.      1.7525  1.505   1.2575  1.01    0.7625  0.515   0.2675  0.02  ]

最终结果超过324,远远超过你的目标200.如果你把小时减少到只有8,你就得到了

Actual total growth rate = 168.09849392178677 times over 8 hours.
Growths = [ 2.          1.71714286  1.43428571  1.15142857  0.86857143  0.58571429
  0.30285714  0.02      ]

低于你的目标200但比再使用一个小时更近。

使用9小时费率,在倒数第二个小时内实际超过200的目标。它的确切时间取决于你如何模拟从那个小时开始到结束的增长模式 - 一小时内的增长与我的假设和我的代码无关。

另一组假设也是可能的 - 您提供的增长率是即时的,200x的目标不会在整数小时内发生。这里的解决方案更具数学性,但这是一个大纲。

如果我们让T为达到初始值的200倍的人口所需的时间。然后,在时间T中从2到0.02线性下降y时增长率t的公式为

y'/y = 2 - (1.98 / T) * t

这是一个可分离的微分方程,初始条件为y(0)= 1。解决那个有解决方案

y = exp(2 * t - (0.99 / T) * t**2)

在Python语法中。由于我们想在时间T结束目标200,我们得到

T = log(200) / 1.01 = 5.245858778760432

其中,对数是自然对数,最后一个值是近似值。所以人口函数的最终解决方案是

y = exp(2 * t - (0.9999 / log(200)) * t**2)

但是你在印刷阵列中想要的是增长率,由

给出
y'/y = 2 - (1.9998 / log(200)) * t

大致显示在数组

[2 - (1.9998 / log(200)) * t for t in range(6)]

评估为

[2.0,
 1.622559416197654,
 1.2451188323953077,
 0.8676782485929615,
 0.4902376647906155,
 0.11279708098826946]

最后一个值不是0.02,因为增长会持续一点小时5.(请参阅上面的时间T了解实际结束时间。)

相关问题