比例/灵敏度无界限输出数量

时间:2013-01-18 19:16:32

标签: c# algorithm

我有一个“东西”(细节不重要),输出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倍。我想我需要引入另一个数字,比如scale,其中gca表示应用的比例+/-到输出数字,但我不知道如何。

任何人都可以帮忙吗?无论是修复这个还是以更好的方式! 感谢

1 个答案:

答案 0 :(得分:0)

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

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

gc接近-1时,此表达式变为单数,nOUT以双曲线向无穷大方向发散。这是0 < gc < 1案件的自然“反面”。

如果您想将数字限制为大10倍,您可以通过乘以0.9重新调整gc;这会将(1 + gc)项限制为0.1,这相当于乘以10.例如:

gc *= (1 - 1 / 10.0)

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


为了让您了解此缩放的行为方式,下面是nOUT针对gc的{​​{1}}制作的情节,限制值为10:

Plot of nOUT agains gc

然而,你应该注意到,对这个数字的大小施加这个限制会使得缩放不对称而不那么“好”。对于小于10的限制因子,您会看到inVal = 5处的尖点;例如,限制因子为1.5:

enter image description here


另一种方法是简单地比例因子限制在0.9,而不是如上所述重新调整因子本身。这消除了gc = 0处的尖点,而是在达到限制因子(在这种情况下为10)时将其展平。你可以这样做:

gc = 0

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

enter image description here