3

ベルカーブに似たものを生成する数学関数を探しています (考えてください)。私はここで私の深さから非常に外れています。ガウス関数が必要だと思いますが、目的に合わせて正しく適用する方法がわかりません。

関数を使用して、一連のオブジェクトをアニメーション化します。

ここに画像の説明を入力

このアニメーションの加速と減速の外観をシミュレートするために、中間点まで各オブジェクトを前のオブジェクトに近づけてオフセットし、その後オフセットを元の値に戻します。

ここに画像の説明を入力

実装したら、関数が x 軸の開始点と終了点、および収容する必要があるオブジェクトの数を受け入れるようにします。次に、各オブジェクトの x 原点となる一連の値を返す必要があります。

例えば:

開始: 0 終了: 100 オブジェクト: 20

フラット分布: 0、5、10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95

必要な結果: 0、10、19、27、34、40、44、45、46、47、48、49、50、51、55、60、66、73、81、90

曲線のプロファイルをある程度制御することもできます。たとえば、上記の推定値はかなり「フラット」なベルです (項目 7 ~ 14 のオフセットは同じです)。

4

3 に答える 3

3

次の 3 次多項式を考えてみましょう。

f(x,a) = 4ax^3 - 6ax^2 + 2ax + x

一定に保持され、間隔 `[0:1]' から選択されたドメインx in [0:1]で評価されます。a

これにより、ゼロから始まり 1 で終わるプロットが生成されます。の場合a==0、直線が得られます。の場合a==1、深いカーブが得られます。中間のaどこかで、中間の何かが得られます。

の適切な値を選択したらa、0 から 1 の間で任意の数のポイントを評価するだけです。次に、必要な範囲に合わせて値をスケーリングします。


このスプレッドシートのスクリーンショットは、2 つの例を示しています。列 A と F は の値を保持しa、列 B と G は の値を保持しますx(フラット分布からの正確な値を使用したい場合は、 のすべての使用法をxに変更できますx/100)。列 C と H は の結果を保持しf(x,a)ます。列 D と I は を保持しf(x,a)*100ます。

スプレッドシートのスクリーンショット

于 2012-10-26T17:39:35.193 に答える
2

以下は、通常の偏差を生成するための Java 実装です。

/** generation of a Gaussian deviates (variants) by the ratio of uniform method */
final public static double generateNormalDeviate( final double mean, final double std_deviation ){
    double u, v, x, y, q;
    do {
        u = random.nextDouble();
        v = 1.7156 * ( random.nextDouble() - 0.5 );
        x = u - 0.449871;
        y = (v < 0 ? v * -1 : v) + 0.386595;
        q = x*x + y * (0.19600 * y - 0.25472 * x);
    } while( q > 0.27597 &&
            (q > 0.27846 || v*v > -4d * Math.log(u) * u*u));
    return mean + std_deviation * v / u;
}

詳細および C バージョンについては、プレスによる数値レシピを参照してください。

于 2012-10-26T17:28:26.577 に答える
0

IIRC [-1..1]からのN個の独立したランダムの合計は、中心が0のガウス曲線に適切に近似します。分散が何であるかは覚えていません。

編集:質問を理解していませんでした。この関数、正確には「逆誤差関数」を実装するものが必要なようです。関数自体は積分であり、初等関数では評価できないため、その近似をコードに実装することをお勧めします。関数がベルカーブポイントに正しい近似を提供するようになったら、ベースとして0-1の数値(ベルカーブの平坦度を定義します)をわかりやすく取得し、Bという名前を付け、Nの数値を(-1+ B)と(1-B)、次にその関数の出力をベルカーブの位置として取得し、それらを正規化して、左端が最初に、右端が最後になるようにします。

于 2012-10-26T17:02:33.333 に答える