首页 > 解决方案 > 以各种比率使价值翻倍的功能

问题描述

我正在尝试制作一个折线图,例如美国各州和国家随时间推移的《纽约时报》冠状病毒死亡人数:每日追踪。

纽约时报在图表中有一些巧妙的线条显示了翻倍率,每天、每 2 天、每 3 天、每周等等。我想知道如何编写一个函数,该函数返回代表这些行的值数组,起始值为 10,maxX 值为 36(截至今天的总天数)。

这就是我现在所处的位置,恐怕它无法正确计算值,但它可能解释了我想要实现的目标。

我怎样才能以正确的方式做到这一点?我的数学太生疏了。

var maxX = 36;
var start = 10;

function double(factor) {
  var f = start;
  var arr = [f];
  for (var i = 1; i < maxX; i++) {
    f = f + (f / factor)
    arr.push(f)
  }
  return arr
}

var lines = [1, 2, 3, 7, 30].map(f => {
  return {
    days: f,
    arr: double(f)
  }
})
console.log(lines)

标签: javascript

解决方案


在给定倍率的情况下,您首先需要弄清楚将每个每日价值乘以什么。例如,对于每 2 天的翻倍率,您希望每天的计数乘以 1.412(2 的平方根);1 天后为 1.412 倍,2 天后为 2 倍,4 天后为 4 倍,以此类推。

对于通解,求解方程为:

orig * (dayFactor ** daysToDouble) = 2 * orig

其中orig是原始感染数(此处为 10),并且dayFactor是您要求解的值,因为这是每天应该乘以的感染数。

orig * (dayFactor ** daysToDouble) = 2 * orig
(dayFactor ** daysToDouble) = 2
dayFactor = 2 ** (1 / daysToDouble)

在函数中,确定dayFactor给定的加倍率,然后将计数乘以每天:

var maxX = 36;
var start = 10;

function double (daysToDouble) {
  const dayFactor = 2 ** (1 / daysToDouble);
  let currentInfected = start;
  const arr = [currentInfected];
  for (var i = 1; i < maxX; i++){
    currentInfected *= dayFactor;
    arr.push(currentInfected);
  }
  return arr;
}

var lines = [1,2,3,7,30].map(f => {
  return {days: f, arr: double(f)}
});

console.log(lines[2]); // double every 3rd day


推荐阅读