Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将递增秩映射到递减但非负的点_Php_Function_Math_Business Logic - Fatal编程技术网

Php 将递增秩映射到递减但非负的点

Php 将递增秩映射到递减但非负的点,php,function,math,business-logic,Php,Function,Math,Business Logic,我需要创建一个业务逻辑或php函数来计算以下内容:给定一些输入$rank(这是alexa排名),我需要计算一些$points,这样$points对于排名靠前的网站来说会很高,并且会随着$rank值的增加而降低 我想象这样的情况: function($rank) { $points = x*$rank; return $points; } 我如何获得$积分 如果排名为1,则返回的分数为最大值(例如10000) 如果排名为2,则返回的$points将为9500或附近 如果排名为4

我需要创建一个业务逻辑或php函数来计算以下内容:给定一些输入
$rank
(这是alexa排名),我需要计算一些
$points
,这样
$points
对于排名靠前的网站来说会很高,并且会随着
$rank
值的增加而降低

我想象这样的情况:

function($rank)
{
    $points = x*$rank;
    return $points;
}
我如何获得
$积分

  • 如果排名为1,则返回的分数为最大值(例如10000)
  • 如果排名为2,则返回的
    $points
    将为9500或附近
  • 如果排名为4,则返回的
    $points
    将为6000或附近
  • 如果秩为200,则返回的$points将为2或函数将返回的任何值
规则:如果
$rank
小于,则
$points
应大于。
$points
的最大值为10000,表示
$rank=1


现在随着
$rank
的增加,
$points
的值应该相应减少。

有许多公式可以满足您的要求

嵌套幂 一种可能性:

$points = 10000 * pow(0.993575964272119, pow($rank, 3.16332422407427) - 1)
这将为您提供以下信息:

因此,您确定的三个值(1、2和4)都是满意的,但是200的结果表明这可能不是您想要的。曲线如下所示:

function($rank)
{
    $points = x*$rank;
    return $points;
}

顺便说一句,我使用python和mpmath找到了这一点,通过修正公式的形式并用数字确定数字:

导入mpmath >>>打印(mpmath.findroot)(λa,b:10000*a**(2**b-1)-9500, …λa,b:10000*a**(4**b-1)-6000), ... (0.995, 2.7))) [0.993575964272119] [ 3.16332422407427] 如果您决定使用不同形式的函数,则可以采用这种方法

多项式的Exp 具有所需属性的可能不同形式为:

$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)))
尽管这会导致曲线弯曲

要将这些备选方案与上述方案进行比较:

    function getPoints($rank)
{
    $returnValue =  -0.005 * $rank * $rank - 0.035 * $rank + 100.040;
    if ($returnValue < 0) $returnValue = 0;
    return $returnValue;
} 
函数获取点($rank)
{
$returnValue=-0.005*$rank*$rank-0.035*$rank+100.040;
如果($returnValue<0)$returnValue=0;
return$returnValue;
} 
这是我的想法

函数没有为大值分叉: 它至少应该给大等级的人一些小的价值。。。 比如,如果排名是2000000,那么分数将是2。
Thnx btw

您要求
$points
为正还是非负?“你认为它是完整的吗?”维布斯在我的帖子中添加了另一个选项。请务必记住最后一次。