
前回の数値シミュレーションの続き
空間の変化をモデル化する方法
粒子モデル
粒子モデルを用いて人の動きをシミュレーションしたい場合、それぞれの個体について時間発展方程式で動きを表現するのだが、変量に対して拘束条件が加わることが重要。
変量というのは、各個体がどの方向にどれだけ移動するのか。
拘束条件は各個体が移動した結果変なとこ行ってないか(建物の外とか)
格子モデル
何かが拡散していく様子を表現する際に用いる。
対象領域の配列を1コマずつ保存し、1コマ前の状態を参照して情報を更新していく。
具体的には隣接する格子と自分の値に差があれば、差分の合計に拡散係数をかけたものを次の値とする。
ネットワークモデル
その名の通り、SNSなどのネットワークが成長していく様子を表現するときに使う。
数理最適化の時に使ったnetworkxを使ってできる。(ランダムにノードを足して、情報を加えていく)
微分方程式を差分化する際の誤差
前回扱ったねずみ算で漸化式的にグラフ作成を行うと(オイラー法)
dtが大きいと誤差が強くなる。(現実世界ではdtは限りなく0なので)
本来のねずみ算は、
dn/dt = an
dn = an*dt
両辺nで割って
dn/n =a*dt
両辺を積分すると
log(n) = at+C
n(t) = Aeat
となる。これを微分方程式を解析的に解くということ。
が、実際のシミュレーションでは解析的に解くとか困難極まりないので「近似解」を考える。
その中でも厳密解に近づける方法としてルンゲ・クッタ法というのがあるらしい。
これは、
ある時点tにおいて、Δn = dn/dtとすると
k1:n(dt) = n(0)+Δn
t=t + 1/2*dtの時を考えると、Δn = 1/2 * dn/dt増えているはずなので
k2:n(dt)=k1 + 1/2 * dn/dt
これをもとにt=t + dtまでの残りの1/2*dtを進めた値k3
最初からk3の速度になると仮定して計算した値k4
これらを1,2,2,1で重みづけして計算する。というものらしい
なんとなく分かったけどようわからん。教えてchatGPT。
以下はルンゲ・クッタ法の概念図です:
ルンゲ・クッタ法は、初期値問題を解くための数値的手法です。この方法は、関数、ステップサイズ、ステップ数、および初期値を入力として受け取り、近似解を出力します。
この方法の主なステップは次のとおりです:
- K1: 初期点で関数を評価します。
- K2: K1を使用して中間点で関数を評価します。
- K3: K2を使用して中間点で関数を評価します。
- K4: K3を使用して終点で関数を評価します。
これらのステップは、各ステップで関数の値を評価し、その結果を使用して次のステップの関数の値を予測します。これにより、関数の近似解が得られます。
あんまりよくわかんなかったのでわかんねえよって打ったらもう少し細かく教えてくれたw
ルンゲ・クッタ法は、微分方程式の数値解法の一つで、特に初期値問題に対する解を求めるのによく用いられます。この方法は、4次のルンゲ・クッタ法が最も一般的に使用されます。
4次のルンゲ・クッタ法では、次のステップを行います:
- K1ステップ:まず、初期点で関数を評価します。これは、微分方程式の右側の関数を現在の点で評価することを意味します。
- K2ステップ:次に、K1を使用して中間点で関数を評価します。これは、微分方程式の右側の関数を、現在の点とK1/2の平均で評価することを意味します。
- K3ステップ:その次に、K2を使用して中間点で関数を評価します。これは、微分方程式の右側の関数を、現在の点とK2/2の平均で評価することを意味します。
- K4ステップ:最後に、K3を使用して終点で関数を評価します。これは、微分方程式の右側の関数を、現在の点とK3の平均で評価することを意味します。
これらのステップを経て、次の近似値を計算します:
y_{n+1} = y_n + (1/6)*(K1 + 2*K2 + 2*K3 + K4)*hここで、
y_nは現在の近似値、hはステップサイズを表します。この方法の利点は、高い精度を持ちつつ計算量が比較的少ない点にあります。そのため、多くの科学的、工学的な問題で広く用いられています
まぁ、当たり前だけど本に書いてあるくらいのことを本に書いてるくらいの分かりやすさで教えてくれるなぁ。それ以上もそれ以下もない感じ。(聞き方が悪いのもある)

コメント