【问题标题】:Converting a range of integers exponentially to another range将整数范围以指数方式转换为另一个范围
【发布时间】:2018-03-09 11:30:28
【问题描述】:

我正在尝试将一个数字范围转换为另一个范围(以指数方式)。我正在尝试在 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

结果呈指数增长。再说一次,我的数学在这里欠缺。上图示例在x = 100 时没有给出y = 100。所以我不知道如何确定考虑改变输入的指数公式。

简而言之:我想选择不同强度的指数增长,同时使用不同的变量作为输入,但当x = max_inputx = min_input 时总是有y = max_resulty = min_result

一个例子:

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

我希望这个问题足够清楚。提前感谢您的帮助!

【问题讨论】:

    标签: python math


    【解决方案1】:

    让我们从编写在这种情况下使用的指数函数的最一般形式开始:

    其中a, b, c, d, e 都是常量。使用指数规则:

    • d可以与a分离和组合:

    • c 可以与基础b 合并:

    所以我们将 5 个参数减少到 3 个。现在将这些参数拟合到端点;打电话给他们[x1, y1][x2, y2]

    因此中间的坐标由下式给出:

    r 是跨越[0, 1] 的标准化参数。因此,我们将参数集压缩为 B(加上终点坐标)。


    使用B = [2, 3, 4, 5]、端点[1, 2][3, 10] 进行测试:

    【讨论】:

    • 这个反应非常好。非常感谢,我要弄清楚如何将公式转换为代码。
    • 但是您使用的变量 a、b、c、d 和 e 代表什么?
    • @kohloth 参数用于这些曲线的一般形式
    【解决方案2】:

    对于您的示例,您基本上是想为b 解决b^100 = 1000

    您可以使用日志来做到这一点:

    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)

    我不确定你想如何从别处开始做范围,但无论你决定如何做,你应该能够使用对数来找到你的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2016-02-29
      • 2017-04-28
      相关资源
      最近更新 更多