将线性刻度转换为对数刻度

55
我有一个线性刻度尺,范围从0.1到10,变化增量为0.1:
  |----------[]----------|
0.1         5.0         10
然而,输出需要是:
  |----------[]----------|
0.1         1.0         10 (对数刻度)
我正在尝试找出将5(例如)转换为1.0所需的公式。因此,如果刻度盘在1.0和10之间移动一半(线性刻度上的真实值为7.5),则结果对数值是多少?我已经思考了几个小时,但是我已经好几年没有接触这种数学了,所以我真的很迷茫。我理解log10X=10y的基本概念,但仅限于此。
5.0的伪值将变为10(或10的幂),而10的伪值将为10的10次方。那么如何计算7.5的伪值和其结果的对数值?
如果需要其他信息,请告诉我。
感谢提供任何帮助;这难住了我。
2个回答

65

符号说明

与数学和编程惯例相同,“log”函数被视为以e为底的对数函数。“exp”函数是指数函数。请记住,这些函数是互为反函数:

exp:ℝ → ℝ+

log:ℝ+ → ℝ

解决方案

这里只需解一个简单的方程:

y = a exp bx

通过x=0.1,y=0.1和x=10,y=10两点来解出ab

注意,y1/y2的比值由以下公式给出:

y1/y2 = (a exp bx1) / (a exp bx2) = exp b(x1-x2)

这将帮助您解出b

b = log (y1/y2) / (x1-x2)

其余部分很容易。

b = log (10 / 0.1) / (10 - 0.1) = 20/99 log 10 ≈ 0.46516870565536284 a = y1 / exp bx1 ≈ 0.09545484566618341

更多关于符号的说明

在您的职业生涯中,您会发现有些人使用对数函数使用自然底数e、底数为10、甚至是底数为2的约定。这并不意味着任何人是对还是错。这只是一种符号约定,每个人都可以自由选择他们喜欢的符号约定。

在数学和计算机编程中,惯例是使用自然对数,使用自然对数简化了符号,这就是我选择它的原因。这与Google提供的计算器和TI-84等计算器使用的约定不同,但是,计算器是为工程师准备的,而工程师使用的符号与数学家和程序员不同。
以下编程语言在标准库中包含自然对数函数。 事实上,我想不出有哪一种编程语言中的 log() 不是以常数 e 为底的对数。我相信这样的编程语言是存在的。

然而,只有一个数字被用来推导。那就是线性刻度上的值。0.1到10是脚本所看到的物理值。它需要将相应的值转换为其对数对应物。例如:5将被转换为1。如果您需要查看示例,我可以将其链接给您。 - TurdPile
没错。用户错误地说5.0应该完全等于1,因为5不是10和.1的确切中间。技术上来说,5.05才是确切的中间值(10.1/2)。但无论如何,如果我认为不会有误差,那就太愚蠢了。 - TurdPile
所以让我理解一下:在我的特定情况下,b是一个静态值。X和Y是线性比例尺的最小/最大值,我解出a以给出正确的对数等效值? - TurdPile
你在 b 的方程式上打错字了吗?它等于0.202循环。 - TurdPile
你能用你的例子解决5.05吗?如果我看到一个例子做完,我会更快理解。 - TurdPile
显示剩余20条评论

14

我知道这个回答晚了六年,但它可能会对其他人有所帮助。

给定一个值从x0到x1的线性刻度和一个值从y0到y1的对数刻度,x和y之间(无论是正向或反向)的映射由方程1中显示的关系给出:

 x - x0    log(y) - log(y0)
------- = -----------------      (1)
x1 - x0   log(y1) - log(y0)

其中,

x0 < x1
{ x | x0 <= x <= x1 }

y0 < y1
{ y | y0 <= y <= y1 }
y1/y0 != 1   ; i.e., log(y1) - log(y0) != 0
y0, y1, y != 0

例子1

线性x轴上的值范围从10到12,对数y轴上的值范围从300到3000。给定y=1000,求x是多少?

重新排列方程1以解出'x',得到:

                 log(y) - log(y0)
x = (x1 - x0) * ----------------- + x0
                log(y1) - log(y0)

                log(1000) - log(300)
  = (12 - 10) * -------------------- + 10
                log(3000) - log(300)

  ≈ 11

根据您提供的数据,线性x轴上的数值范围从0.1到10,对数y轴上的数值范围也是从0.1到10,底数为10。如果x=7.5,那么y是多少?

通过重排方程1来解出'y'的结果,得到:

          x - x0
log(y) = ------- * (log(y1) - log(y0)) + log(y0)
         x1 - x0

        /  x - x0                                \
y = 10^|  ------- * (log(y1) - log(y0)) + log(y0) |
        \ x1 - x0                                /

        / 7.5 - 0.1                                  \
  = 10^|  --------- * (log(10) - log(0.1)) + log(0.1) |
        \  10 - 0.1                                  /

        / 7.5 - 0.1                    \
  = 10^|  --------- * (1 - (-1)) + (-1) |
        \  10 - 0.1                    /

  ≈ 3.13

:: 编辑 (2020年10月11日) ::

值得一提的是,数字基数“n”可以是任何实数正数。上面的示例使用了以10为底的对数,但对数的底数可以是2、13、e、pi等。这里有一个我创建的电子表格,可以计算任何实数正数基数的对数运算。 “解决方案”单元格已经着黄色和有粗边框标志。在这些图中,我随机选择了以n=13为底数的对数运算——即z = log13(y)。

Spreadsheet values
图1. 电子表格数值。

Spreadsheet formulas
图2. 电子表格公式。

Mapping of X and Y values
图3. X和Y值的映射。


在示例2中,您使用了错误的幂基数。我认为应该是“e”。 - Lynx
@Lynx,请按照示例2中所示的计算方法进行尝试。该方法适用于任何实数正数基数,如n = 10、2、e等。另请参阅我在2020年10月11日添加到答案中的信息。 - Jim Fischer
你是对的,我只是假设在你的计算中使用了loge(x)函数,因此幂的基数也应该是“e”。我正确吗? - Lynx
@Lynx:记住的重要事情是:选择任何方便的对数基数“n”,并在计算中始终使用该基数。对于某些正实数'n':log_n(y)=z且n^z=y。(注:log_n(y)不意味着ln(y)。)当欧拉常数'e'被选为对数基数(n:=e)时,就是在使用所谓的“自然”对数:log_e(y)=ln(y)=x且exp(x)=e^x=y。在我的例子中,如果我使用了ln(y)=z,那么您正确,我必须使用exp(z)=e^z=y来从z值中恢复y值。 - Jim Fischer
这是一个很好的答案。有一个问题:你如何确定选择哪个基数? - jash101
@jash101,对数底数可以是任何正实数“n”。在单元格B6和D13中计算的结果值对于所有对数基数n都是相同的(11.0和3.13)。例如,如果我选择对数基数n = 10,则单元格B6和D13中的计算值仍将为11.0和3.13。同样适用于n = π或n = e。唯一的限制是在整个计算过程中使用相同的对数底数n。 - Jim Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接