让我们说我有一个线性标度[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,这显然是正确的。
答案 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 ...)作为对数和指数底数的特殊情况,我得到e
和b = 0,00332859141506