提问人:TiagoLr 提问时间:11/12/2023 最后编辑:TiagoLr 更新时间:11/12/2023 访问量:29
如何将对数范围内的值按比例增加 100 分之一?
How to increase a value in a logarithmic range by 100th proportionally?
问:
我正在研究对数滑块/旋钮,但我无法按比例增加其值。
从线性的角度来看,它很容易,给定一个将值增加 100 步的范围:[a,b]
increment = (b - a) / 100
value += increment
我的困难在于对数范围旋钮,我希望旋钮像线性一样转动,在乞求处小跳跃,在更大的台阶和刻度的末端,到目前为止,我得到了这个工作:
increment = (b - a) / 100
value += log(increment)
使用这个公式,旋钮在范围开始时转动它应该的样子,但是它显然不完整,并且在范围结束时变得非常缓慢。
谢谢
答:
1赞
Tim Roberts
11/12/2023
#1
您需要乘以增量,而不是加法。这是一个几何级数,而不是算术级数。
把它想象成钢琴上的琴键。每个音符是前一个音符的频率乘以 2 的 12 次方根——这样,频率就会加倍第 12 个音符。
因此,此代码在 100 个步骤中从 1 到 100:
import math
z = math.pow(100,.01)
k = 1
for i in range(100):
print(i,k)
k *= z
以下是结果。从 1 移动到 1 需要 2 个步骤,但如果您要在高端设置合理大小的步骤,这就是您必须做的。
0 1
1 1.0471285480508996
2 1.096478196143185
3 1.1481536214968828
4 1.2022644346174132
5 1.2589254117941675
6 1.3182567385564075
7 1.3803842646028852
8 1.445439770745928
9 1.5135612484362089
10 1.5848931924611143
11 1.6595869074375615
12 1.7378008287493765
13 1.8197008586099845
14 1.9054607179632486
15 1.9952623149688813
16 2.0892961308540414
17 2.1877616239495548
18 2.2908676527677754
19 2.398832919019493
20 2.511886431509583
21 2.630267991895385
22 2.75422870333817
23 2.8840315031266095
24 3.01995172040202
25 3.1622776601683835
26 3.3113112148259156
27 3.4673685045253215
28 3.630780547701019
29 3.801893963205618
30 3.9810717055349794
31 4.168693834703362
32 4.365158322401668
33 4.57088189614876
34 4.786300923226394
35 5.011872336272734
36 5.248074602497739
37 5.495408738576259
38 5.754399373371584
39 6.025595860743593
40 6.309573444801949
41 6.606934480075978
42 6.918309709189384
43 7.244359600749922
44 7.585775750291861
45 7.94328234724284
46 8.317637711026737
47 8.709635899560835
48 9.120108393559129
49 9.549925860214392
50 10.000000000000036
51 10.471285480509033
52 10.96478196143189
53 11.481536214968871
54 12.022644346174175
55 12.58925411794172
56 13.182567385564123
57 13.803842646028905
58 14.454397707459336
59 15.135612484362147
60 15.848931924611204
61 16.59586907437568
62 17.378008287493834
63 18.19700858609992
64 19.054607179632562
65 19.952623149688893
66 20.8929613085405
67 21.877616239495637
68 22.908676527677848
69 23.988329190195028
70 25.118864315095934
71 26.30267991895396
72 27.542287033381815
73 28.84031503126622
74 30.19951720402033
75 31.622776601683974
76 33.1131121482593
77 34.673685045253364
78 36.30780547701035
79 38.018939632056345
80 39.81071705534996
81 41.68693834703379
82 43.65158322401686
83 45.70881896148778
84 47.863009232264126
85 50.118723362727536
86 52.480746024977584
87 54.9540873857628
88 57.54399373371606
89 60.25595860743616
90 63.09573444801973
91 66.06934480076004
92 69.18309709189411
93 72.4435960074995
94 75.85775750291889
95 79.4328234724287
96 83.17637711026768
97 87.09635899560868
98 91.20108393559163
99 95.49925860214428
评论
0赞
TiagoLr
11/12/2023
谢谢!不确定我是否完全理解指数值,我正在使用 pow(100, 0.01) 并且效果很好,现在绰绰有余,该理论也是有道理的,问候。
0赞
Tim Roberts
11/12/2023
好吧,这个想法是,如果你取 N^(1/K) 次幂,并将其乘以 K 次,你最终得到 N。因此,您可以控制它所花费的步数 (K),并且可以控制从开始到结束 (N) 的跨度大小。
评论
log((b-a)/log(100))