あなたの要件を満たすかもしれない多くの公式があります。
ネストされたパワー
1 つの可能性:
$points = 10000 * pow(0.993575964272119, pow($rank, 3.16332422407427) - 1)
これにより、次の結果が得られます。
f(1) = 10000
f(2) = 9500
f(4) = 6000
f(9) = 12.065
f(10) = 0.84341
f(200) = 0
したがって、修正した 3 つの値 (1、2、および 4) はすべて満たされていますが、200 の結果は、これがまさに探しているものではない可能性があることを示しています。曲線は次のようになります。
ちなみに、これは python と mpmath を使用して、数式の形式を修正し、桁数の多い数字を数値で決定することで見つけました。
>>> import mpmath
>>> print(mpmath.findroot((lambda a,b: 10000*a**(2**b - 1) - 9500,
... lambda a,b: 10000*a**(4**b - 1) - 6000),
... (0.995, 2.7)))
[0.993575964272119]
[ 3.16332422407427]
関数の別の形式を決定する場合は、このアプローチが適応される可能性があります。
多項式の式
必要なプロパティを持つ可能な別のフォームは次のようになります。
$points = exp(9.14265175282929 + $rank*(0.127179575914116 - $rank*0.0594909567672230))
これは、上記のものほど速くは減少しません。
f( 1) = 10000
f( 2) = 9500
f( 4) = 6000
f( 13) = 2.1002
f( 14) = 0.47852
f(200) = 0
これは、この連立方程式を解くことによって得られました。
a + b + c = log(10000)
a + 2b + 4c = log( 9500)
a + 4b + 16c = log( 6000)
多項式の係数a~c を取得します。一致する別の次数を追加することもできますf(200)=2
が、その場合、最後の係数が正になります。つまり、ランクが非常に大きい場合、ランクが上がるにつれてポイントが増加し始めます。
それも一致させたい場合はf(200)=2
、次を使用して一致させることができます
$points = exp(max(8.86291000469285 - $rank*0.0408488141206645,
9.14265175282929 + $rank*(0.127179575914116 - $rank*0.0594909567672230)))
ただし、これにより曲線が曲がります。
これらの代替案を上記と比較するには: