C# 刻度/灵敏度无边界输出编号

C# 刻度/灵敏度无边界输出编号,c#,algorithm,C#,Algorithm,我有一个“东西”(细节不重要),它输出一个介于0和+无穷大之间的数字。数字是某些输入因素的度量,其中高数字是坏的,低数字是好的 我需要添加一个敏感度设置,以便调用者可以指定一个基本上可以缩放输出的数字 理想情况下,我希望该比例介于-1和1之间。0表示正常。当刻度朝1增加时,灵敏度增加,输出数减少。当刻度朝-1方向减小时,灵敏度降低,输出数增加 到目前为止,我有: static decimal GC(decimal inVal, decimal gc) { decimal nOUT = inVal

我有一个“东西”(细节不重要),它输出一个介于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;
}
但不适用于不输出为-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
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表示应用+/-到输出数字的比例,但我不知道如何

有人能帮忙吗?要么解决这个问题,要么用更好的方法!
谢谢

我不太确定我是否正确理解了您的问题,但这可能行得通吗

else if( gc < 0 )
{
    nOUT = inVal / (1 + gc);
}
还要注意,在
0
案例中使用
Math.Max
是多余的


为了让您了解这种缩放的行为,这里有一个由
nOUT
gc
绘制的图,用于
inVal=5
,限值为10:

但是,您应该注意,对数字的大小施加这个限制会使缩放不对称,并且不太“好”。对于小于10的限制因子,您将在
gc=0处看到一个尖峰;例如,限制因子为1.5时:


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

gc = Math.Max(gc, -(1 - 1 / 10.0))
这是一张比较这两种方法的图表(蓝线是第一种方法,红线是第二种方法):


注意
如果(gc==1)gc=0.9M从未执行过,因为那里有
gc<0
。非常感谢您的回答。您是如何制作这些图表的?使用Matlab或类似的东西?不客气。我用Mathematica制作图形:世界上最好的符号数学软件包!
gc = Math.Max(gc, -(1 - 1 / 10.0))