4

私は簡単なプログラムを持っています。その中心には、おそらくガス濃度を表す2次元のフロートの配列があります。私は、雲のように外側に広がるガスをモデル化して、最終的にはグリッド全体で同じ濃度のガス。

たとえば、特定の状態の進行は次のようになります。(簡単にするためにintを使用)

開始状態

00000
00000
00900
00000
00000

アルゴリズムの1パス後の状態

00000
01110
01110
01110
00000

もう1つのpasは、すべて値0.36(9/25)を含む5x5グリッドを与える必要があります。
私はそれを紙で試しましたが、どのように試しても、これを行うためのアルゴリズムに頭を悩ませることはできません。

だから私の質問は、このアルゴリズムをコーディングしようとするとどうしたらいいのかということです。畳み込みを適用し、各グリッドセルを順番に取得して隣接するグリッドセルに配布するなど、いくつかのことを試しましたが、最終的には当初よりもガスが少なくなるなど、望ましくない影響があります。または、ガスの動きのすべてが、中心から外側に広がるのではなく、一方向になります。私は本当に頭を悩ませることができず、助けていただければ幸いです。

4

7 に答える 7

6

対流を無視する場合は拡散の問題であり、そうでない場合は流体力学/物質移動の問題です。ゼロから解く場合は、オイラー (固定コントロール ボリューム) 視点の質量保存と運動量保存の方程式から始めます。

これは一時的な問題であるため、状態を時刻 t(n) から t(n+1) に進めるには積分を実行する必要があります。グリッドを表示しますが、時間内にどのように解いているかについては何も表示しません。どのような統合スキームを試しましたか? 明示的?暗黙?クランク・ニコルソン?わからない場合は、問題に正しく取り組んでいません。

このテーマに関して私が本当に気に入った 1 冊の本は、SW パタンカーの「Numerical Heat Transfer and Fluid Flow」です。今は少し時代遅れですが、治療は好きでした。29年経った今でもいいのですが、このテーマについて読んでいたので、もっと良いテキストがあるかもしれません. 初めて見る人でも入りやすいと思います。

于 2009-01-25T22:37:47.963 に答える
5

あなたが与える例では、2番目のステージのコアは1です。通常、拡散には濃度勾配が必要なため、ほとんどの拡散関連の手法では、次の反復で中央の 1 が変更されません (また、最初の反復の後にその状態になることもありませんが、一度確認すると少し見やすくなります)。等しい値のブロックを取得しました)。しかし、あなたの投稿に対するコメント投稿者が言うように、それがネットの動きの原因になる可能性は低いです。ガスの削減はエッジ効果である可能性がありますが、丸め誤差の問題になる可能性もあります.CPUを丸め半分に設定し、ガスを合計して時々修正を適用してください.

于 2009-01-25T22:37:14.437 に答える
2

ノイマン境界条件(エッジでの断熱)を使用して、熱方程式の有限差分ソルバーを実装しようとしているようです。この種のことについてはたくさんの文献があります。有限差分法に関するウィキペディアのページでは、単純ですが安定した方法について説明していますが、ディリクレ境界条件(エッジでの一定の密度)を対象としています。境界条件の処理を変更することはそれほど難しいことではありません。

于 2009-01-25T22:45:55.513 に答える
1

必要なのは、Photoshop などのプログラムでよく使用されるスムージング アルゴリズムのようなものか、この単純なFlame Effectのような古い学校のデモ エフェクトのようです。

どのアルゴリズムを使用しても、おそらく配列をダブル バッファリングするのに役立ちます。

典型的なスムージング効果は次のようになります。

begin loop forever
    For every x and y
    {
        b2[x,y]  = (b1[x,y] + (b1[x+1,y]+b1[x-1,y]+b1[x,y+1]+b1[x,y-1])/8) / 2
    }
    swap b1 and b2
end loop forever
于 2009-01-26T00:25:58.150 に答える
1

Tom Forsyth の Game Programming Gems 記事を参照してください。要件を満たしているように見えますが、そうでない場合は、少なくともいくつかのアイデアが得られるはずです.

于 2009-01-26T01:46:21.153 に答える
1

簡単にするために、1Dでのソリューションを次に示します。

初期設定では、原点 () で濃度 9、その他すべての正および負の座標で濃度 0 が設定されています。

初期状態: 0 0 0 0 (9) 0 0 0 0

次の反復値を見つけるためのアルゴリズムは、原点から開始し、隣接する近傍で電流濃度を平均することです。元の値は境界ケースであり、平均は元の値とその 2 つの隣接値を同時に考慮して行われます。つまり、3 つの値の平均です。他のすべての値は、2 つの値の間で効果的に平均化されます。

反復後 1: 0 0 0 3 (3) 3 0 0 0

反復後 2: 0 0 1.5 1.5 (3) 1.5 1.5 0 0

反復後 3: 0 .75 .75 2 (2) 2 .75 .75 0

反復後 4: .375 .375 1.375 1.375 (2) 1.375 1.375 .375 .375

これらの反復をループで行います。n 回の反復ごとに状態を出力します。時定数を導入して、1 秒のクロック オン ザ ウォール タイムを表す反復回数を制御できます。これは、整数座標が表す長さ単位の関数でもあります。特定のハードウェア システムに対して、この値を経験的に調整できます。プログラムが「すべての隣接値がこの許容範囲内にある」または「反復間でこの許容範囲を超えて値が変化していない」と判断した場合、制御する定常状態の許容値を導入して、アルゴリズムが定常状態の解に到達することもできます。

于 2009-01-26T19:55:19.617 に答える
0

開始濃度が与えられた各反復の濃度は、次の式で取得できます。

concentration = startingConcentration/(2*iter + 1)**2

iter は時間の繰り返しです。だからあなたの例のために。

startingConcentration = 9
iter = 0
concentration = 9/(2*0 + 1)**2 = 9

iter = 1
concentration = 9/(2*1 + 1)**2 = 1

iter = 2
concentration = 9/(2*2 + 1)**2 = 9/25 = .35

各「時間ステップ」の後に配列の値を設定できます

于 2009-01-26T03:00:02.067 に答える