![見出し画像](https://assets.st-note.com/production/uploads/images/92976913/rectangle_large_type_2_72fbd84e85d01526de8e37ae9b6aeeb0.png?width=1200)
脳筋!微分方程式!
この記事はデジクリAdvent Calendar 2022の13日目の記事となっております。
デジクリについてはこちらのサイトをご覧ください。
<< 12日目はイカ爆弾さんの「天才クール美少女とヒロイン属性について」
注意
この記事は大学で習う「解ける微分方程式」は扱いません。試験勉強のために開かれた方はすぐにブラウザバックしてください。
挨拶
こんにちは。デジクリ 17th PG/Movie班の𝒾𝓃です。サークル内での出し物でふざけ倒しているのでそろそろまともなものを出したいです。しかし欲望が抑えられないので、これからもふざけ続けます。
微分方程式とは
ある変数$${x}$$と、経過時間$${t}$$を仮定したとき、「$${dt}$$経つときの$${x}$$の変化の振る舞いの方程式」と言えます。文章ではよくわかりませんね。こうです。
$$
\frac {dx}{dt} = f(x,t)
$$
で、これを$${x=}$$の形にすることを通常、「解く」と言います。
あたまの わるい おはなし
解ける微分方程式とは
筆者である私が解く方をほとんど解説できないので、先程解説を見てきました。これを大筋は外れないようにまとめると、
「解ける微分方程式」とは、斉次微分方程式もしくは非斉次微分方程式という形にどうにかして落とし込める微分方程式のことである。
となります。(当然のように斉次微分方程式という言葉を使いましたが、なんか$${x^2-y^2 = (x+y)(x-y)}$$とかと同じように式にそういう形があるんだと思っていればここではセーフです。)
解けない微分方程式ってどうするの?
さぁ!やってまいりました!一般的な微分方程式の時間です!考えることがほぼ無い!学校のようにどうやって式変形しようとか要らない!純粋!非常に!
やることはシンプル!なるべく短い時間間隔でたくさん計算する!以上!
そう。式にできないなら残された道はこれしか無いのです。手計算の時代なら私ももう少し考えるでしょうが、今は目の前にコンピュータ。あなたが今記事を読んでいるそれもコンピュータ。コンピュータはいっぱい計算することなら誰にも負けない。こいつをこき使ってやりましょう。
例題 : 魚とサメのいる湖
ある湖に魚10匹とサメ7匹がいます。$${t=10}$$になったとき、それぞれの個体数はどうなるでしょう?
こういった問題があります。今は与えている数が少なすぎて解けないのでここでは考えなくてOKです。
難しい言い方をすると「捕食・日捕食の個体数シミュレーション」、や「ロトカ・ヴォルテラ方程式」です。
そしてそれぞれの変化の傾きは次のように表します。
$$
\frac{d}{dt}fish = a\cdot fish-b\cdot shark\cdot fish \\
= (a-b\cdot shark)\cdot fish \\
\frac{d}{dt}shark = -c\cdot shark+d\cdot fish\cdot shark \\
= (-c+d\cdot fish)\cdot shark
$$
さて、これは解けません。t=10にするには、本当にたくさん計算する以外に道はありません。そこでコンピューター。
たくさん けいさんする
上の式を関数にするだけで完成します。
#include<stdio.h>
#define a 8
#define b 3
#define c 18
#define d 4
double next_fish(double f,double s,double dt){
return f + dt * (a - b*s) * f;
}
double next_shark(double f,double s,double dt){
return s + dt * (-c + d*f) * s;
}
int main(int argc,char *argv[]){
double t = 0;
double fish = 10;
double shark = 7;
double dt = 0.00001;
printf("%lf,%lf,%lf\n",t,fish,shark);
// 0.00001秒ごとの変化を計算
for(t = 0 ; t < 10 ; t+=dt){
fish = next_fish(fish,shark,dt);
shark = next_shark(fish,shark,dt);
printf("%lf,%lf,%lf\n",t,fish,shark); //記録を出力
}
return 0;
}
結果はこのようになります.
0.000000,10.000000,7.000000
0.000000,9.998700,7.001540
0.000010,9.997400,7.003079
0.000020,9.996099,7.004619
0.000030,9.994798,7.006158
...
これを図解すると、こうなります。
![](https://assets.st-note.com/img/1670628674333-lVuYbIZafI.png?width=1200)
この話でよく言われるものとして、次のような図もあります。見てみましょう。
![](https://assets.st-note.com/img/1670628744038-P1wd1rYYVn.png?width=1200)
各個体数をx,yとしてプロットすると円を描きます。これが何を意味するかは私はよく分かっていません。お近くの先生に聞きましょう。あと分かっている方はコメントくださると広角を天井に突き刺しながら喜びます。
まとめ
微分方程式はこんなにシンプルなんです。「解く」行為が難しいだけなんです。ただ、解けると「ある時間$${t}$$における$${x}$$の値」を瞬時に求められます。これが凄い。
消費時間の話
例えば例のプログラムはdtを$${10^{-5}}$$で計算し、1.1秒ほどかかりました。dtを$${10^{-6}}$$で計算すると、10.5秒かかります。精度を追い求めると消費時間がめちゃくちゃ伸びるんですね。解いて$${x=f(t)}$$の形にすると代入だけで良くなって大変効率的です。
ネタバラシ
私が言いたかったことは実は微分方程式でもなんでもなく、現代コンピューターはまだまだボロいので、人間が式を考える努力は必要だという話なんです。ご覧下さり、ありがとうございました。