明示的なオイラー法は反応拡散問題には遅すぎる


10

私は次のC ++コードでチューリングの反応拡散システムを解決しています。これは遅すぎます。128x128ピクセルのテクスチャの場合、許容可能な反復数は200です。これにより、2.5秒の遅延が発生します。興味深い画像を取得するには400回の反復が必要ですが、5秒の待機時間は多すぎます。また、テクスチャのサイズは実際には512x512である必要がありますが、これにより、待機時間が非常に長くなります。デバイスはiPad、iPodです。

これを速くするチャンスはありますか?オイラー法はゆっくりと収束します(ウィキペディア)–より速い方法があれば、反復回数を減らすことができますか?

編集: Thomas Klimpelが指摘したように、行:「if(m_An [i] [j] <0.0){...}」、「if(m_Bn [i] [j] <0.0){...}」は収束を遅らせています。削除後、75回の反復後に意味のある画像が表示されます。以下のコードの行をコメントアウトしました。

void TuringSystem::solve( int iterations, double CA, double CB ) {
    m_iterations = iterations;
    m_CA = CA;
    m_CB = CB;

    solveProcess();
}

void set_torus( int & x_plus1, int & x_minus1, int x, int size ) {
    // Wrap "edges"
    x_plus1 = x+1;
    x_minus1 = x-1;
    if( x == size - 1 ) { x_plus1 = 0; }
    if( x == 0 ) { x_minus1 = size - 1; }
}

void TuringSystem::solveProcess() {
    int n, i, j, i_add1, i_sub1, j_add1, j_sub1;
    double DiA, ReA, DiB, ReB;

    // uses Euler's method to solve the diff eqns
    for( n=0; n < m_iterations; ++n ) {
        for( i=0; i < m_height; ++i ) {
            set_torus(i_add1, i_sub1, i, m_height);

            for( j=0; j < m_width; ++j ) {
                set_torus(j_add1, j_sub1, j, m_width);

                // Component A
                DiA = m_CA * ( m_Ao[i_add1][j] - 2.0 * m_Ao[i][j] + m_Ao[i_sub1][j]   +   m_Ao[i][j_add1] - 2.0 * m_Ao[i][j] + m_Ao[i][j_sub1] );
                ReA = m_Ao[i][j] * m_Bo[i][j] - m_Ao[i][j] - 12.0;
                m_An[i][j] = m_Ao[i][j] + 0.01 * (ReA + DiA);
                // if( m_An[i][j] < 0.0 ) { m_An[i][j] = 0.0; }

                // Component B
                DiB = m_CB * ( m_Bo[i_add1][j] - 2.0 * m_Bo[i][j] + m_Bo[i_sub1][j]   +   m_Bo[i][j_add1] - 2.0 * m_Bo[i][j] + m_Bo[i][j_sub1] );
                ReB = 16.0 - m_Ao[i][j] * m_Bo[i][j];
                m_Bn[i][j] = m_Bo[i][j] + 0.01 * (ReB + DiB);
                // if( m_Bn[i][j] < 0.0 ) { m_Bn[i][j]=0.0; }
            }
        }

        // Swap Ao for An, Bo for Bn
        swapBuffers();
    }
}

また、ここここの両方非常によく似た質問をしたように見えるので、質問をクロスポストしないことが望ましいと述べておきます
Godric Seer 2012

あなたはすでに見てきたグレッグ・タークの仕事万が一、この上に?
JM

@JM:まだです。私は彼のコードを実行してみました。PseudoColor、つまり8ビットの色深度を備えたXサーバーが必要です。OSXではこれを提供できないと思います。いろいろなVNCサーバーを試しましたが、うまくいきませんでした。
AllCoder

タークのアプローチを当面の問題に適応させることができるはずだと思う。最近のコンピュータグラフィックスでは、反応拡散パターンがかなり使用されているようです。
JM

1
私は間違っているかもしれませんが、m_An [i] [j] = 0.0;の部分。このシステムには、実際には右辺が連続する微分方程式ではモデル化できない要素が追加される場合があります。これにより、より高速なソルバーを思い付くのが少し難しくなります。
トーマスクリンペル

回答:


9

グリッドを調整すると拡散が硬くなるため、安定性によって制限されているようです。スティッフなシステムに適した方法は、少なくとも部分的に暗黙的です。多少の労力はかかりますが、シンプルなマルチグリッドアルゴリズムを実装して(またはライブラリを使用して)10未満の「作業単位」(基本的にはタイムステップの1つ)のコストでこのシステムを解くことができます。グリッドを調整しても、反復回数は増えません。


ここで拡散だけが硬い場合、彼はダグラスガンのようなADIメソッドを使用でき、すべてが問題ありません。しかし、私自身の経験では、反応部分は、非線形性が非常に高いことに加えて、剛性に関してはるかに悪いことがよくあります。
トーマスクリンペル

1
残念ながら、ADIのメモリの場所はひどいものです。また、拡散がそうであるかどうかに関係なく、反応は暗黙的に処理できることに注意してください。グリッド細分割では、拡散が最終的に支配的になりますが、定数がわからなければ、しきい値がどこにあるのかわかりません。
ジェドブラウン

これ(Pythonで)の後方オイラーを実装するコードの例は次のとおり
David Ketcheson

@DavidKetcheson:陰解法を使用するには方程式を解く必要がありますか?これが、コードにlinalg.spsolve()がある理由ですか?
AllCoder 2012

1
@AllCoderはい、解決が必要ですが、明示的なメソッドが安定するために必要なすべてのタイムステップよりもはるかに速く解決できます。
ジェドブラウン

2

実用的な観点から:A5プロセッサはそれほど強力ではないため、数回のハードウェア反復を待つことができます。または、iPod / iPadがインターネットに接続される場合は、リモートまたはクラウドで問題を解決します。


A5の小さなパワーに驚きました。Pages、Safari、その他の大規模なアプリケーションはどのようにうまく機能しますか?私は..形態形成が十分に単純になることを考え、ランダム、抽象的な画像を生成する必要がある
AllCoder

さて、A5はWebおよびビデオ(Pages、Safariなど)用に最適化されたエネルギー効率の良いプロセッサーです。対照的に、ほとんどの数値ワークロードは、大量の浮動小数点演算とデータ移動を実行します。これらの機能は、低電力モバイルプロセッサの焦点では​​ありません。
fcruz

0

オイラーは他の方法と比較してゆっくりと収束しますが、それはあなたが興味を持っていることではないと思います。「興味深い」画像を探しているだけの場合は、タイムステップのサイズを大きくし、反復回数を減らします。Jedが指摘しているように、問題は、明示的なオイラー法には、グリッドサイズに関連して大きなタイムステップでの安定性の問題があることです。グリッドが小さいほど(つまり、画像の解像度が高いほど)、それを考慮するためのタイムステップは小さくなければなりません。

たとえば、明示的ではなく暗黙的なオイラーを使用すると、収束の次数を得ることはできませんが、解は無条件の安定性を持ち、はるかに大きな時間ステップが可能になります。暗黙的なメソッドの実装はより複雑で、時間ステップあたりの計算量も多くなりますが、合計ステップ数を少なくすることで、それ以上のメリットが得られるはずです。


この問題は安定性によって制限されるため、時間ステップサイズを単純に大きくしても機能しません。
ジェドブラウン

0.01をたとえば0.015に変更すると、すべての点で "化学濃度がゼロに近い濃度"になります。つまり、灰色の四角になります。これが私のコードの起源です:drdobbs.com/article/print
articleId=

はい、それはジェッドが述べた安定性の問題の結果でしょう。彼の回答で述べているように、安定性のパフォーマンスが優れているという暗黙の方法を使用すると、この問題が解決されます。回答を更新して、無関係な情報を削除します。
Godric Seer 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.