0

我有一个“东西”(细节不重要)输出一个介于 0 和 + 无穷大之间的数字。该数字是对某些输入因素的度量,其中高数字不好,低数字好。

我需要为此添加一个敏感度设置 - 因此调用者可以指定一个基本上可以缩放输出的数字。

理想情况下,我希望该比例介于 -1 和 1 之间。0 代表正常。随着刻度向 1 增加,灵敏度增加,输出数量减少。随着标度向 -1 减小,灵敏度降低,输出数量增加

到目前为止,我有这个:

static decimal GC(decimal inVal, decimal gc)
{
decimal nOUT = inVal;
if( gc > 0 )
{
    nOUT = Math.Max( inVal * (1 - gc), 0 );
}
else if( gc < 0 )
{
    if( gc == 1 ) gc = 0.9M;
    decimal d = Math.Abs(gc);
    nOUT = inVal * ( (1 / d) );
}
return nOUT;
}

GC 是我的比例函数并且gc是输入因素。

这适用于 1,输出为

IN = 3.0, OUT = 3.0, gc = 0
IN = 3.0, OUT = 2.7, gc = 0.1
IN = 3.0, OUT = 2.4, gc = 0.2
IN = 3.0, OUT = 2.1, gc = 0.3
IN = 3.0, OUT = 1.8, gc = 0.4
IN = 3.0, OUT = 1.5, gc = 0.5
IN = 3.0, OUT = 1.2, gc = 0.6
IN = 3.0, OUT = 0.9, gc = 0.7
IN = 3.0, OUT = 0.6, gc = 0.8
IN = 3.0, OUT = 0.3, gc = 0.9
IN = 3.0, OUT = 0.0, gc = 1.0

但不适合在没有输出的情况下朝向 -1

IN = 3.0, OUT = 3.0, gca = 0
IN = 3.0, OUT = 30.0, gca = -0.1
IN = 3.0, OUT = 15.0, gca = -0.2
IN = 3.0, OUT = 10.0, gca = -0.3
IN = 3.0, OUT = 7.5, gca = -0.4
IN = 3.0, OUT = 6.0, gca = -0.5
IN = 3.0, OUT = 5.0, gca = -0.6
IN = 3.0, OUT = 4.3, gca = -0.7
IN = 3.0, OUT = 3.8, gca = -0.8
IN = 3.0, OUT = 3.3, gca = -0.9
IN = 3.0, OUT = 3.0, gca = -1.0

随着 gca 接近 -1,我需要输出数字变大。

我遇到的第二个问题是规模问题。最多,这个数字会大 10 倍。我想我需要引入另一个数字,比如比例,其中 gca 表示应用 +/- 到输出数字的比例比例,但我不知道如何。

任何人都可以帮忙吗?要么解决这个问题,要么用更好的方法!谢谢

4

1 回答 1

0

我不太确定我是否正确理解了您的问题,但也许这会起作用?

else if( gc < 0 )
{
    nOUT = inVal / (1 + gc);
}

gc这个表达式在接近 -1时变得奇异,并以nOUT双曲线方式向无穷大发散。这是0 < gc < 1本案的天然“对立面”。

如果您想将数字限制为大 10 倍,您只需gc乘以 0.9 即可重新缩放;这会将(1 + gc)项限制为 0.1,对应于乘以 10。例如:

gc *= (1 - 1 / 10.0)

另请注意,您Math.Max0 < gc < 1案例中的使用是多余的。


为了让您了解这种缩放的行为方式,这是我nOUT针对gcfor制作的图inVal = 5,限制值为 10:

nOUT 与 gc 的图

但是,您应该注意,对数字的大小施加此限制会使缩放不对称且不太“好”。对于小于 10 的限制因子,您会在gc = 0; 例如,限制因子为 1.5:

在此处输入图像描述


另一种方法是简单地将缩放因子限制在 0.9,而不是像我上面建议的那样重新缩放因子本身。这消除了尖端,gc = 0而是在达到该限制因素(在本例中为 10)时将其变平。你可以这样实现:

gc = Math.Max(gc, -(1 - 1 / 10.0))

这是一个比较两种方法的图表(蓝线是第一种方法;红线是第二种方法):

在此处输入图像描述

于 2013-01-18T19:23:44.900 回答