我正在尝试将一系列数字转换为另一个范围(以指数方式)。我试图在python中这样做。我没有数学背景(实际上也没有计算机科学的正规教育),所以我会尽力以清晰的方式解释我的问题。
假设我有以下范围[A,B]:
[-10 , 25]
[-35 , -1]
[0 , 100]
我想将它们标准化为以下范围[C,D]:
[0 , 3]
[1 , 5]
[0 , 100]
我当然可以通过这个来规范这些数字:
normalized = (x-min(x))/(max(x)-min(x))
这会给我一个0到1之间的(线性)归一化响应。
如果我想获得指数结果,我会通过函数提供标准化结果:
现在我的问题:
我想创建一个函数,我可以在极端情况下输入两个范围([A,B]和[C,D]):
A = C
B = D
结果呈指数增长。再说一遍,我的数学缺乏。上面的图片示例在y = 100
时未提供x = 100
。所以我不知道如何在考虑改变输入的情况下确定指数公式。
简而言之:我希望在使用不同变量作为输入时选择不同的指数增长强度,但在y = max_result
时x = max_input
和y = min_result
时x = min_input
总是Input:
# Range of input values
AB = [0,100]
# Range of output values
CD = [0,1000]
# Math function for exponential
formula_input = # Some formula made with range [0,100] on both X and Y
x1 = 10
x2 = 20
x3 = 50
x4 = 90
Output:
formula = 1.072^x
y1 = 2.004
y2 = 4.017
y3 = 32.34
y4 = 521.832
。
一个例子:
{{1}}
我希望这个问题足够明确。在此先感谢您的帮助!
答案 0 :(得分:2)
让我们首先编写一个指数函数的通用形式,以便在这种情况下使用:
a, b, c, d, e
都是常量。使用指数规则:
所以我们将5个参数减少到3个。现在将这些参数调整到终点;称他们为[x1, y1]
和[x2, y2]
:
因此,中间的坐标由下式给出:
r
是跨越[0, 1]
的规范化参数。因此,我们将参数集简化为B
(加上终点坐标)。
使用B = [2, 3, 4, 5]
,端点[1, 2]
和[3, 10]
进行测试:
答案 1 :(得分:1)
对于您的示例,您基本上想要为b^100 = 1000
解决b
。
您可以使用日志执行此操作:
ln(b^100) = ln(1000)
100 ln(b) = ln(1000)
ln(b) = ln(1000) / 100
b = exp(ln(1000) * (1/100))
b = 1000^(1/100)
大约是1.07152。
对此进行概括,如果您有[0, A]
到[0, B]
,那么b = B^(1/A)
。
我不确定你是如何想要从其他地方开始的范围,但是无论你决定这样做,你都应该能够使用对数来找到你的解决方案。