2021年6月の趣味コーディング
先月趣味で書いたプログラムの、まとめ!
今月はふと「有限要素法を実装してみたい」と思い立ち、Processingで実装していました。結果的になんとか作れたものの、大変だった...
ちなみに以降の記事は、自分なりに有限要素法のプログラムを作った記録になります。有限要素法そのものの解説ではないのであしからず。
有限要素法とは
で、この有限要素法なんですが、これは与えられた境界条件のもとで微分方程式を解く方法の一つです。
先に完成形をお見せすると、こんな感じで熱伝導方程式が解けたりします。
誤解からの出発
そもそも今回有限要素法を実装してみたいと思った理由は、「有限要素法って凄そうだけれどよく分からないな」と思っていたから。実装していくうちに意味が分かってくるはずと期待してコーディングしてみました。
有限要素法の基本的なアイデアは、「微分方程式の解を、いくつかの基底関数の重ね合わせとして表現する。その重ね合わせの係数が求められれば、方程式を解いたことになる」というもの。
しかしこの「基底関数」、微分方程式の解を表現するために使う予定なのに、微分不可能な部分があるのでは... と思い、
こんなツイートをしていたんですが、結局これは間違いでした。
しかし後から振り返ってみるとそれほど見当違いな疑問ではなく、まさにこの「局所的に微分不可能な基底関数の重ね合わせとして、微分方程式の解を表現できる」というのが有限要素法の肝... なのだと思います。多分。
(有限要素法のテキストでよく「弱形式」とか「弱解」とか出てくるのはこの性質の説明のため。微分できない箇所が混じっているので厳密な解ではないのだ)
1次元の有限要素法プログラム
で、まずは簡単な問題から解くのが良いだろうと1次元の熱伝導方程式を解く有限要素法プログラムを作成。
実装の際には下記のQiita記事をとても参考にさせてもらいました。
2次元への拡張、の準備
1次元系のプログラムができたので次は2次元だ!と思い立ったのですが、2次元の方程式に対応するには、解きたい領域を「格子」に分割して表現できていなければなりません。
単純な正方形の格子だと面白くない... というか、わざわざ有限要素法を使わずに差分法でも解けてしまうので、ドロネー分割で格子を用意することに。
この時点でかなり苦労しましたがなんとか完成!
あと面白かったので本題をそれて少し遊んでいました。
2次元の有限要素法プログラム
ドロネー分割で一通り遊んで満足したので、いよいよ二次元の有限要素法を実装することに。
実装中の苦労はもろもろカットして、とにかく完成!
感想
ということで二次元の有限要素法のプログラム(熱伝導方程式用)を実装することができました。
あとは三次元への拡張とか、もっと複雑な方程式を解けるようにするとか、行列演算のアルゴリズムを改善する(今は愚直に掃き出し法で逆行列を求めている)とか色々拡張は考えられるのでしょうけれど、自分なりに満足したのでとりあえすこれで完成。
こういうプログラムを作ってみようと思い立ち、色々調べて完成させられたのはとても楽しい体験でした。
さて次は何を作ろう...
おまけ
あと先月は、Mac OSをBig Surに更新して以来、ProcessingでP2D、P3Dを動かせなかった問題の解決法を発見しました。
上のツイートでは喜びのあまり"mscOS"なる謎OSに言及していますが、とにかく嬉しい。
というわけで久々にProcessing上でGLSLを呼び出してつぶやきProcessingしたりしました。
以上、先月の趣味コーディングでした!
この記事が気に入ったらサポートをしてみませんか?