javascript 使用特定范围的指数衰减

mqxuamgl  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(55)

我尝试使用指数衰减,但对我来说,问题是如何使用具有最大值和最小值的特定范围:

const data = []
const x = 6
const max = 20
// const min = 5
for (let index = 1; index <= x; index++) {
    data.push(max / Math.pow(2, index))
}

字符串
这导致

10
5
2.5
1.25
0.625
0.3125


但是我需要从20到5的指数递减。我怎么设置min

i1icjdpr

i1icjdpr1#

我知道这可能不是你正在寻找的,但不会是一个简单的if语句吗?

const data = []
const x = 6
const max = 20
const min = 5
for (let index = 1; index <= x; index++) {
  if(max / Math.pow(2, index)>=min){
    data.push(max / Math.pow(2, index))
  }
}

字符串
我意识到这对CPU和堆栈的使用都有很多限制,因为它需要一个循环运行很多次。而且我觉得这更像是一个数学类型的问题,而不是编码问题。如果我想出一个合理的解决方案,我会修改它到这个答案。(我的意思是一个使用数学的问题)
编辑:我已经在研究这个问题的数学答案,并找到了一种可能的方法。
编辑:
使用衰减公式,应该通过将max /转换为min+(max-min)*来添加min,如下所示:

const data = []
const x = 6
const max = 20
const min = 5
for (let index = 1; index <= x; index++) {
  if(max / Math.pow(2, index)>=min){
    let decayed = min + (max - min) * Math.pow(0.5, index);
    data.push(decayed);
  }
}


所以这里Math.pow(0.5,index)是衰减常数b,它乘以最大值和最小值之差。这将给你给予

[12.5, 8.75, 6.875, 5.9375, 5.46875, 5.234375]


作为结果。
编辑:我对此进行了更深入的研究,如果您将x设置为一个较大的数字,它将给予大量的数字,并最终接近min:x1c 0d1x
编辑:OQ发布了另一个类似的问题:
如果我需要相反的方式,我必须改变什么:快速增加值和缓慢增加值?类似于wolframalpha.com/input?i=x%5E0.5,也有最小值和最大值
使用我上面介绍的模型,我稍微改变了操作,现在使用自然对数来拟合所描述的曲线。


(ln函数的图形)

const data = [];
const x = 6;
const max = 20;
const min = 5;

for (let index = 1; index <= x; index++) {
  let increased = min + (max - min) * (1 - Math.exp(-index));
  data.push(increased);
}


于是,我又做了一次测试:


正如你所看到的,这些值和预期的差不多。
(如果我的格式或语法有点不对,我很抱歉,我正在使用手机)
编辑:
OQ想要另一个系统,产生嗯不是那么陡峭的曲线。这可以通过具有ln的系数来完成,但是必须对最小值和最大值进行调整以适应。因此,我选择了一个负指数函数,其效果大致相同:

const data = [];
const x = 6;
const max = 20;
const min = 5;
const a = 0.2; // Adjust this constant

for (let index = 1; index <= x; index++) {
  let increased = min + (max - min) * (1 - Math.exp(-a * index));
  data.push(increased);
}


调整变量a将改变曲线的形状;使用0.05这样的值来稍微接近
(如果我的格式或语法有点不对,我很抱歉,我正在使用手机)

相关问题