将线性刻度映射到对数刻度,两个刻度的最小/最大值均可变

时间:2019-01-10 14:30:39

标签: math scale logarithm

让我们说我有一个线性标度[100-1000],我想将它以对数形式映射到[10-200]标度。

CREATE TABLE TREE  (
  node1_id      UUID REFERENCES  nodes (object_id) NOT NULL,
  node2_id      UUID REFERENCES  nodes(object_id) NOT NULL,
  CONSTRAINT node2_owned_constraint UNIQUE (node2_id),
  CONSTRAINT invalid_tree_constraint CHECK (node1_id!= node2_id)
)

我需要一个公式,如果给出两个刻度的最小值/最大值,它将取线性刻度内的任何数字并返回等效的对数刻度。

我尝试使用this问题中建议的公式,但是当使用作者提供的数字作为测试时,我得到的结果是0.97,而不是1.02,这显然是正确的。

2 个答案:

答案 0 :(得分:0)

对数标度由方程表示

Y = a + b * log(X)

获取一些方便的对数底数(十进制或自然数)

为两个边界点制作方程式(我使用log10):

a + b * log10(100) = a + b * 2 = 10
a + b * log10(1000) = a + b * 3 = 200
b = 190
a = 10 - 380 = -370

所以公式是

Y = -370 + 190 * log10(X)
for X=450 Y=134

答案 1 :(得分:0)

流星,我相信所引用答案中的公式是正确的,但它适用于案例x=5是错误的。 1.02显然不是5的有效映射,因为5[0.1; 10]范围(中间是5.05)和{ {1}}稍高于对数范围1.02的中间(中间为[0.1; 10])。这可能是由于@DietrichEpp的舍入错误

我还认为他使用的公式更容易出现舍入误差。特别是我认为,从

开始
1.0

将产生一个更好的公式。在这种情况下,y = a' * exp(b*(x-x1)) 很明显是a'

y1的计算方式仍与

b

主要区别在于该公式b = log (y2/y1) / (x2-x1) (其中a' = a*exp(b*x1)是@DietrichEpp答案中的a)。如果a很大,那么可以减少很多舍入错误。

对于使用x1(2.71828 ...)作为对数和指数底数的特殊情况,我得到eb = 0,00332859141506