数学算法问题

时间:2010-05-28 16:34:38

标签: algorithm math

我不确定这是否可以在没有某些决定因素的情况下完成......但是想知道是否有人知道如何做到这一点。

我想为数字创建一个移动比例。

假设我的数字是26000.我希望这个算法的结果是6500;或原始数字的25%。但如果我有5000号,我希望结果是2500;或原始数字的50%。

百分比不必精确,这只是一个例子。

我只想要像正弦波一样。随着输入数量的增加,输出数量占输入的百分比较低。

这有意义吗?

6 个答案:

答案 0 :(得分:3)

在Excel中绘制一些点并使用行上的“显示公式”选项。

答案 1 :(得分:2)

f(x) = x / log x

之类的东西
x         | f(x)
=======================
26000     | 5889 (22.6 %)
5000      | 1351 (27.2 %)
100000    | 20000 (20 %)
1000000   | 166666 (16.6 %)

只是一个简单的例子。您可以通过使用对数的基数来调整它,通过在分子(x)或分母(log x)上添加乘法常数,使用平方根,平方(或取根) log xx等。

以下是f(x) = 2*log(x)^2*sqrt(x)给出的内容:

x         | f(x)
=======================
26000     | 6285 (24 %)
5000      | 1934 (38 %)
500       | 325 (65 %)
100       | 80 (80 %)
1000000   | 72000 (7.2 %)
100000    | 15811 (15 %)

答案 2 :(得分:1)

合适的对数刻度可能有所帮助。

答案 3 :(得分:1)

除了您已经提到的两个转换之外,如果指定第三个转换,也可以准确定义您想要的功能。如果你有一些特定的目标,它很可能符合一个众所周知的数学定义,至少有一张海报可以为你识别。听起来好像你在谈论对数函数。但是,您必须更具体地说明定义有用算法的要求。

答案 4 :(得分:1)

我建议您使用幂律系列函数,c * x ^ a == c * pow(x,a)其中a是幂。如果你想要答案的一小部分,你会选择a=1,它只是一个常数部分。但是您希望百分比慢慢减少,因此您可以选择a<1。例如,我们可以选择a = 0.9和c = 0.2并获得

   1   0.2
  10     1.59
 100     12.6
1000     100.2

因此它的范围从1000%时的20%到10%。您可以选择较小的a以使分数减少得更快。 (并且您可以根据您的范围扩展所有内容。)

特别是,如果c * 5000 ^ a = 2500且c * 26000 ^ a = 6500,则通过除以得到(5.1)^ a = 2.6,我们可以将其解析为a = log(2.6)/ log(5.1 )= 0.58648 ....然后我们插回去获得c * 147.69 = 2500所以c = 16.927 ......

现在进展如此

 1000   973
 3000  1853
 5000  2500
10000  3754
15000  4762
26000  6574
50000  9648
90000 13618

答案 5 :(得分:0)

这有点类似于用于模拟音频的简单压缩方案。请参阅Companding的维基百科条目。