修改对数曲线上的值

Modifying a value on a logarithmic curve

我有一个值是 0-100 的浮点百分比值,x,另一个值是 0-1 的浮点值,y。随着 y 越来越接近于零,它应该在对数曲线上减少 x 的值。

例如,说 x = 28.0fy = 0.8f。由于 0.8f1.0f 相差不远,因此它应该只将 x 的值减少一点点,比如说将其降低到 x = 25.0f 或类似的值。随着 y 越来越接近于零,它应该越来越大幅度地减少 x 的值。我能想到的唯一方法是使用对数曲线。我知道我想要它做什么,但我终其一生都无法弄清楚如何在 C++ 中实现它。这个算法在 C++ 中会是什么样子?

听起来你想要这个:

new_x = x * ln((e - 1) * y + 1)

我假设您有自然对数函数 ln 和常量 e。数乘以xy的对数函数,y=0时为0,y=1时为1。

这是该函数背后的逻辑(这基本上是一个数学问题,而不是编程问题)。您需要看起来像 ln 函数的东西,首先急剧上升然后趋于平稳。但是你想让它从 (0, 0) 开始,然后通过 (1, 1),而 ln 从 (1, 0) 开始,然后通过 (e, 1)。这表明在执行 ln 之前,您需要执行一个简单的线性移位,将 0 转换为 1,将 1 转换为 e:((e - 1) * y + 1.

我们可以尝试以下假设:我们需要一个函数 f(y) 使得 f(0)=0 和 f(1)=1 遵循一些对数曲线,可能类似于 f(y) =Alog(B+Cy),其中A、B、C常数待定。

f(0)=0, 所以 B=1

f(1)=1, 所以 A=1/log(1+C)

所以现在,只需要找到一个C值,使f(0.8)大致等于25/28。一些实验表明 C=4 相当接近。如果你愿意,你可以找到更近的地方。

所以一种可能性是:f(y) = log(1.0 + 4.0*y) / log(5.0)