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に近づくにつれて、出力数を大きくする必要があります。

これに関して私が抱えている2番目の問題は、規模の1つです。せいぜい10倍の数になります。別の数値、たとえばscaleを導入する必要があると思います。ここで、gcaは、出力数値に+/-適用されるスケールの比率を表しますが、方法がわかりません。

誰か助けてもらえますか?これを修正するか、より良い方法で!ありがとう

4

1 に答える 1

0

あなたの問題を正しく理解しているかどうかはよくわかりませんが、おそらくこれでうまくいくでしょうか?

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

gcこの式は、-1 に近づくにつれて特異になり、nOUT双曲線的に無限に向かって発散します。これは、0 < gc < 1ケースの自然な「反対」です。

数値を 10 倍に制限したい場合はgc、0.9 を掛けて再スケーリングできます。これにより、項が 0.1 に制限(1 + gc)されます。これは、10 の乗算に相当します。たとえば、次のようになります。

gc *= (1 - 1 / 10.0)

Math.Maxまた、0 < gc < 1ケースでの使用は冗長であることに注意してください。


このスケーリングがどのように動作するかを理解するために、制限値 10でfornOUTに対して作成したプロットを次に示します。gcinVal = 5

GC に対する nOUT のプロット

ただし、数値をどれだけ大きくできるかにこの制限を課すと、スケーリングが非対称になり、「適切」でなくなることに注意してください。制限係数が 10 より小さい場合、カスプが に表示されgc = 0ます。たとえば、制限係数が 1.5 の場合:

ここに画像の説明を入力


別のアプローチは、上で提案したように係数自体を再スケーリングするのではなく、単純にスケーリング係数を 0.9 に制限することですこれにより、カスプが除去され、gc = 0その制限係数 (この場合は 10) に達すると、カスプが平らになります。次のようにこれを達成できます:

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

2 つの方法を比較したグラフを次に示します (青い線は最初の方法、赤い線は 2 番目の方法です)。

ここに画像の説明を入力

于 2013-01-18T19:23:44.900 に答える