求渐进循环中的迭代次数的数学公式?

问题描述 投票:1回答:2

我有一个循环,随着迭代次数的增加,增长速度也在下降。我需要计算它将经历的迭代次数(我在问题的底部解释了为什么我需要这个)。前6个步骤是

0.50, 1.50, 1.83, 2.11, 2.34, 2.55, ...

X-axis: iterations, Y-axis: countX轴:迭代,Y轴:计数。

计数从0.5开始,以递减的速度增长,直到达到20。循环归纳起来就是这样。

var SCALE = 0.5; // Starting value, also affects increment
var MAX = 20;    // Maximum value
var i = 0;       // Just for counting

for (var count = SCALE; count < MAX; count += SCALE / count) {
    console.log(count, i);
    i++;
}

你可以看到这个图随着时间的推移,增长速度越来越慢,因为... count += SCALE / count所以随着数量的增加,分母也会增加。

我以为它是按照指数 pow(MAX, 1 / SCALE) 线,但也不尽然。

MAX = 5 :  23 iterations      Math.pow(5, 2) = 25
MAX = 10 : 97 iterations      Math.pow(10, 2) = 100
MAX = 15 : 222 iterations     Math.pow(15, 2) = 225
MAX = 20 : 397 iterations     Math.pow(20, 2) = 400

另外,当这种方法分崩离析时 SCALE 不是0.5。

疑问

我可以用什么方程,把这两个 SCALEMAX 以获得迭代次数?

为什么我需要这个?

我想把示例代码转换成 文末 到GLSL着色器代码中。问题是,显卡只能执行整数到常数的for-loop,所以我需要知道在开始循环之前,循环需要迭代多少次。

我需要类似这样的东西。for(int i = 0; i < MAX_COUNT; i++) 但首先我需要知道 MAX_COUNT 将是。

javascript math glsl logarithm asymptote
2个回答
1
投票

所以我有2个解决方案,首先是数学。

正如评论中所提到的 你所拥有的是谐波数列,它没有一个简单的封闭形式。因此,从分析上得到循环的上界将是一个挑战。

然而这并不意味着你不能解决这个问题。

解决的办法。

选项一是,正如评论中所建议的那样,在CPU上运行你的代码,直到你找到最大的迭代次数,然后把这个数字作为循环的上界发送出去(例如,作为一个统一的)。

另一种可能更好的解决方案是,将最大迭代次数设置为一个巨大的数字,然后,在循环的主体内。break 如果你已经超过了你的阈值(这在现代GLSL的4个以上版本中是可能的)。


0
投票

正如评论中的一些人所建议的那样,这种模式并不遵循对数图、谐波图或任何可识别的模式。为了解决这个问题,我不得不采用 "蛮力 "的方法,即只运行一次循环,然后用迭代次数作为结果。没有优雅的数学公式。

function calculateSampleCount() {
    const SCALE = 0.5; // Starting value, also affects increment
    const MAX = 20;    // Maximum value
    let i = 0;
    for (let r = SCALE; r < MAX; r += SCALE / r) {
        i++;
    }
    return i;
}
© www.soinside.com 2019 - 2024. All rights reserved.