読者です 読者をやめる 読者になる 読者になる

あさのひとりごと

3日坊主にならないように、全力を尽くします。 記事は個人のひとりごとです。所属する組織の意見を代表するほど、仕事熱心じゃないです。

機械(工学の)学習に必要な大学数学をやり直してみた話

ちまたでは、機械学習がブームのようです。
が、、まったく時代についていけていません。

まぁ時代についていく必要はまったくないのですが、、、
いや、なぜここまで食指が働かないのか、自分でもよく分からないです。

機械学習は、数学が大事と言われています。

そこで、機械(工学の)学習に必要な数学をやり直してみてはどうだろう。
という、まさかの左斜め下方向からのアプローチで、すこしタイムスリップしてみました。

※注意: 流行りの機械学習の話は一切出てきません

1.機械工学とは

機械工学(Mechanical Engineering)とは、機械の設計/製作/運用の全てを対象とする工学の分野です。

次の4つの力学(通称:よんりき)を基礎として、あらゆる産業の基幹を支える重工業をはじめ、航空機/鉄道/自動車/船舶/ロボット/ロケット/人工衛星などありとあらゆる分野に応用されている工学分野です。

  1. 機械力学
  2. 熱力学
  3. 流体力学
  4. 材料力学

機械工学が取り扱う学問は、広範囲にわたるので、このうち熱力学と流体力学を取り上げます。

■熱力学とは

熱力学とは、熱や物質の輸送現象やそれに伴う力学的な仕事を解明する学問です。熱力学には次の基本法則があります。

  1. 第0法則(熱平衡)
  2. 第1法則(エネルギー保存則)
  3. 第2法則(エントロピー増大則)
  4. 第3法則(ネルンストの定理)

エネルギーを消費することなく継続的に仕事をする永久機関は存在しない!というエネルギー保存則は、とても有名なので知っている人も多いと思います。第一種永久機関と呼ばれる「外部から何も受け取ることなく、仕事を外部に取り出すことができる機関」があります。
しかし、ある機関が仕事をするためには外部から熱を受け取るか、外部から仕事をなされるかが必要なので、第一種永久機関は何もエネルギー源の無いところからエネルギーを発生させているので、保存則に反している、と言えます。

あと、熱力学ではエントロピーと呼ばれる、運動状態の混沌性や不規則性の程度を表す重要な状態量があります。これは一般では系の乱雑さを表す量と言われていて、自然界では常にエントロピーが小→大に方向に進むというのが、エントロピー増大則です。つまり、閉じた系では、必ず秩序から無秩序へ向かう!というわけです。エントロピーの概念は熱力学を理解するうえで非常に重要で、乱雑さ?とは?となりがちですが、私は、方向性のある現象は、一方向には進むものの、逆方向には戻らないものとざっくり理解していました。熱力学におけるエントロピーは、この不可逆性の度合いを、数値にしたものです。

流体力学とは

流体力学とは、水や空気などの流体(Fluid)が流れる現象を、力学的に解析する学問です。流体に対してさまざまな力が作用することで流れ場がつくられます。流体にかかる力は、圧力/重力/慣性力/せん断応力などがあります。これらの力の収支を取ると状態方程式が導出されます。質量の収支式は連続の式、運動量の収支式はナビエ・ストークスの運動方程式と呼ばれています。

流体には、層流と乱流があり、一般的にはレイノルズ数Reという流体の慣性力と粘性力の比を表す無次元数がありますこの、Reがある一定の数値より大きくなると層流から乱流に遷移します。蛇口から出る水の量が少ないときは、規則正しい流れができますがこれが層流です。水量をだんだん増やすと、あるところで不規則な流れに変わります。これが乱流(Turbulence)です。

乱流は、流速/圧力/温度などの物理量が時間的にだけでなく、空間的にも不規則に変動します。そして、大小さまざまなスケールの渦運動が発生します。渦運動には、流体でありながら剛体と同じように、速度wが渦中心からの半径 rに比例して変化する強制渦領域(Forced vortex)と、速度wが渦中心からの半径rに反比例して変化する自由渦領域(Free vortex)があります。流れ場に渦が多数存在すると、フローパターンはものすごく複雑になります。よって、乱流はいまだ解明できてないことが数多くあります。

だから、おもしろい。というわけでCFDの登場です。


2.数値流体力学(CFD)とは

流体力学や熱力学で導出される偏微分方程式の多くは、厳密解を求めることができない*1といわれています。そこで、境界条件(Boundary Condition)と初期条件(Initial Condition)を決め、支配方程式の近似解を求めるため、コンピュータ上でシミュレーションして、実際の工業の分野に応用させていきます。熱エネルギーの移動も含める場合は、数値熱流体力学!らしいです。

数値流体力学は、流体力学の支配方程式の理解に加えて、方程式をコンピュータで解析できるようにする離散化という処理やプログラミング言語の知識が必要になってきます。
あと、仮定した理論や計算結果の正当性を検証するため、実験を行い結果を評価したりもします。

CFDは、航空や自動車などの空力制御などは華やかシーンでも、重工業やプラントなどでの管内流れ(非定常流や粘性流体)の解析など地味なエネルギー分野でも多く使われています。

3.数値流体力学(CFD)のために必要な基礎知識

網羅的に思い出せないのですが、思いついた順に。

■ 力学

流体力学の基本は、やはり力学です。まず、力学を学ぶうえで、質量/長さ/時間などのSI単位や流速/運動量/エネルギーなどの物理量のちゃんとした理解が必要です。高校までの数学や物理は、教科書に公式があって、それを丸暗記してパターン化すれは、テストでよい点をとることはできます。でも、力学の概念的なところを自分の頭で考えることが難しい&苦手な人は、CFDは大変かもなーと思います。力は目に見えないので、妄想力というかそういうのが、たぶん必要です。

■ 数学

CFDでは、ベクトルや、内積外積、面積分や体積分などの数学の知識が必要になります。そして、なにより偏微分方程式が大事です!!数学的な概念や哲学を理解できればBestですが、工学の世界では、ある事象を数式で表現して、それを解くためのテクニックが必要です。

■ 有限差分法(FDM)/有限要素法(FEM)

有限差分法は、微分方程式を解くため、微分を有限差分近似で置き換えて得られる差分方程式で近似する数値解法で、FDMと呼ばれてます。

有限要素法は、解析的に解くことが難しい微分方程式の近似解を数値的に得る方法の一つです。方程式が定義された領域を要素に分割し、補間関数をつかって近似していきます。ナビエ・ストークスの運動方程式など離散化して行列式に分解するときによく使われます。有限要素法には、メッシュ/節点/要素といった考え方が出てきます。

数値計算

数値計算は、離散化した式を連立方程式を解くことです。ニュートン法ガウスの消去法、最小二乗法、テーラー展開あたりの数学を理解しておく必要があります。あとは、ひたすら膨大な計算をするわけなので、コンピュータにおまかせするためのプログラミング言語も必要です。CFDの場合は、昔はFortranが多く使われてましたが、今はどうなんでしょう。ライブラリや可視化ツールなんかも良いのがあるのかもしれません。どこかで時間を作ってちょっとまじめに調べたいな。

そして、浮動小数点演算をやるので、誤差の概念や、解の収束や発散などの基本的な考え方も必要です。あと、膨大な演算をコンピュータにやらせるので、マシンリソースを有効に使うためのハードウエアやネットワークの知識が必要です。境界条件や初期条件をいい感じで置いてあげないと、解が収束しないので、、、昔はコンピューターリソースが今のように豊富でなかったので、このインフラ的な知識はけっこう大事でした。今は、クラウドがあるのでそういうのは気にしなくていいので、良い時代になったなぁと思います。

というわけで、これらをぼんやりを思い出したところで、簡単な数学の計算ドリルを解いてみますー。

計算ドリル: 熱伝導の基礎方程式



まずは、熱力学の基礎である熱伝導方程式を導出していきます。
熱伝導率を kとし、高さ y、奥行き zのコントロールボリューム内の x軸方向のヒートフローを考えます。

微小時間 \Delta tの間に、 xの位置にあるコントロールボリュームに流入する熱量は

$$
g\left( x\right) \Delta t = -k\dfrac {\partial T} {\partial x}\Delta t
$$

で算出すれば、それより\Delta x離れたコントロールボリューム外に流出する熱量は

$$
g\left( x +\Delta x\right) \Delta t = \left( -k\dfrac {\partial T} {\partial x}+\dfrac {\partial } {\partial x}\left( -k\dfrac {\partial T} {0x}\right) \Delta x + O\left( \Delta x^{2}\right) \right) \Delta t
$$

となります。

単位時間・単位質量あたりS_{h}の発熱があれば、微小時間\Delta tにコントロールボリュームないで内部発熱する熱量は、密度を\rhoとすると

$$
\left( \rho \Delta x\right) S_{k}\Delta t
$$

となります。この内部発熱量はコントロールボリューム内の温度上昇\Delta Tとして蓄積される熱量と流出する熱伝導量と一致するはずなので、比熱をcとして式にすると

$$
\begin{align}
\left( \rho \Delta x\right) S_{k}\Delta t &= \left( p\Delta x\right) c\Delta T +(q\left( x+\Delta x\right) \Delta t -q\left( x\right) \Delta t) \\
&=\left( \rho \Delta x\right) c(\dfrac {\partial T} {\partial t}\Delta t + o\left( \Delta t^{2}\right) )+\left( \dfrac {\partial } {\partial x}(-k\dfrac {\partial T} {\partial x}\right) \Delta x+O\left( \Delta x^{2})\right) \Delta t
\end{align}
$$

となります。

ここで、\Delta t\rightarrow 0\Delta x\rightarrow 0とすると、次の式となります。

$$
\rho c\dfrac {\partial T} {\partial t}=\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right) +\rho S_{h}
$$

これは、x方向のみなので、コントロールボリュームを(x,y,z)の3次元として、同様の式を解いていくと、

$$
\rho c\dfrac {\partial T} {\partial t}=\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right)+\dfrac {\partial } {\partial y}\left( k\dfrac {\partial T} {\partial y}\right) +\dfrac {\partial } {\partial z}\left( k\dfrac {\partial T} {\partial z}\right)+\rho S_{h}
$$

となります。
というわけで、これが3次元空間における熱伝導の式ができたー!

流体は管内を流れることが多いので、デカルト(x,y,z)ではなく円筒座標系(x,r)で同じように式を解いていくと

$$
\rho c\dfrac {\partial T} {\partial t}= \dfrac {1} {\gamma } \dfrac {\partial } {\partial r}\left( rk\dfrac {\partial T} {\partial r}\right)+\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right) +\rho S_{h}
$$

となります。

数式が長く、ごちゃごちゃしているので、一般形として次のように表します。

$$
\rho c\dfrac {\partial T} {\partial t}=\nabla \cdot \left( k\nabla T\right) +\rho S_{n} \tag{1}
$$

すっきり!

計算ドリル:ナビエ・ストークス運動方程式



次は運動量!ある流体の微小なコントロールボリュームに作用する力を考えます。
密度を\rho、流体の質量分率を\phiとすると、コントロールボリュームの面より単位時間あたりに流入する質量は

$$
\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {ax}\right) \left( \dfrac {\Delta V} {\Delta x}\right)
$$

となります。ここで、\Delta x離れた面から流出する質量を考えたとき、テイラー展開の第2項までをとり、高次項を無視すると、

$$
\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) \left( \dfrac {\Delta V} {\Delta x}\right) +\Delta x\dfrac {\partial } {\partial x}\left( \rho \phi u-pf_{\phi }\dfrac {\partial \phi } {\partial x}\right) \left( \dfrac {\Delta V} {\Delta x}\right)
$$

したがって、単位時間にx方向へ流出する質量は

$$
\dfrac {\partial } {\partial x}\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial \phi } {\partial x}\right) {\Delta V}
$$

となります。

これは、x方向のみなので、コントロールボリュームをデカルト(x,y,z)の3次元として、同様の式を解いていくと、

$$
\Biggl( \dfrac {\partial } {\partial x}\left( \rho \phi u-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) +\dfrac {\partial } {\partial y}\left( \rho \phi v-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial y}\right)+\dfrac {\partial } {\partial z}\left( \rho \phi w-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial z}\right)\Biggl)\Delta V
$$

となります。単位時間・単位質量あたりの質量をS_{\phi }とすると、\Delta V\rightarrow 0\Delta t\rightarrow 0とすると、次の式となります。

$$
\rho S\phi =\dfrac {\partial \rho \phi } {\partial t}+\dfrac {\partial } {\partial x}\left( \rho \phi _{u}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) +\dfrac {\partial } {\partial y}\left( \rho \phi _{v}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial y}\right) +\dfrac {\partial } {\partial z}\left( \rho \phi _{w}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial z}\right)
$$

数式が長く、ごちゃごちゃします。そこで、一般形で次のように表します。

$$
\rho S\phi =\dfrac {\partial S\phi } {\partial t}+\nabla \cdot (p\phi u-\rho \Gamma _{\phi }\nabla \phi ) \tag{2}
$$

ここで、質量分率\phi=1、生成率S\phi=0とすると、いわゆる連続の式となります。

$$
\dfrac {\partial \rho } {\partial t}+\nabla \cdot \left( \rho u\right) =0 \tag{3}
$$

デカルト (x,y,z)で書くと

$$
\dfrac {\partial \rho } {\partial t}+ \dfrac {\partial \left( \rho u\right) } {\partial x} + \dfrac {\partial \left( \rho v\right) } {\partial y} + \dfrac {\partial \left( \rho w\right) } {\partial z} =0
$$

で、円筒座標系 (x,r)で書くと

$$
\dfrac {\partial \rho } {\partial t}+ \dfrac {\partial \left( \rho u\right) } {\partial x} + \dfrac {1} {r}\dfrac {\partial \left( r\rho v\right) } {\partial r} =0
$$

やったー!

式(2)と式(3)から、次の式が得られます。

$$
\rho \left( \dfrac {\partial \phi } {\partial x}+\left( u\cdot \nabla \right) \phi \right) =\nabla \cdot \left( \rho \Gamma \phi \nabla \phi \right) +\rho S_{\phi } \tag{4}
$$

ここで、 \phiは速度成分、 \Gamma \phiは動粘性係数 \nuで、密度が変化しないとみなせる非圧縮性流体を考え、かつ体積力が働かないものとすれば、単位質量あたりの x方向の運動量の生成率に対応する S_{\phi }

$$
S_{\phi }=-\dfrac {1} {\rho }\dfrac {\partial p} {\partial x} \tag{5}
$$

です。式(5)を式(4)に代入して、運動量をもとめると

$$
\rho \left( \dfrac {\partial u} {\partial t}+u\dfrac {\partial u} {\partial x}+v\dfrac {\partial u} {\partial y}+w\dfrac {\partial u} {\partial z}\right) =-\dfrac {\partial p} {\partial x}+\mu \left( \dfrac {\partial ^{2}u} {\partial x^{2}}+\dfrac {\partial ^{2}u} {\partial y^{2}}+\dfrac {\partial ^{2}u} {\partial z^{2}} \right)
$$

$$
\rho \left( \dfrac {\partial v} {\partial t}+u\dfrac {\partial v} {\partial x}+v\dfrac {\partial v} {\partial y}+w\dfrac {\partial v} {\partial z}\right) =-\dfrac {\partial p} {\partial y}+\mu \left( \dfrac {\partial ^{2}v} {\partial x^{2}}+\dfrac {\partial ^{2}v} {\partial y^{2}}+\dfrac {\partial ^{2}v} {\partial z^{2}} \right)
$$

$$
\rho \left( \dfrac {\partial w} {\partial t}+u\dfrac {\partial w} {\partial x}+v\dfrac {\partial w} {\partial y}+w\dfrac {\partial w} {\partial z}\right) =-\dfrac {\partial p} {\partial z}+\mu \left( \dfrac {\partial ^{2}w} {\partial x^{2}}+\dfrac {\partial ^{2}w} {\partial y^{2}}+\dfrac {\partial ^{2}w} {\partial z^{2}} \right)
$$

です。
これは!!!流体でもっとも重要な支配方程式である、ナビエ・ストークスの運動方程式ではないですかーーー!

数式が長く、ごちゃごちゃしているので、ナビエ・ストークスの運動方程式をベクトル表示で書くと次の式になります。

$$
\rho \biggl(\dfrac {\partial u} {\partial t}+\left( u\cdot \nabla \right) u\biggl) =-\nabla p-\mu \nabla ^{2}u
$$

上記のようにナビエ・ストークスの運動方程式非線形偏微分方程式で、これらを連立させて解くのは難しいです。そこで、初期条件・境界条件をきめ、式(3)の連続の式とともに、速度および圧力を決めて解いていこうよ!というのが、マジ流体力学です。

ちなみに、ナビエ・ストークスの運動方程式の左辺第2項の \left( u\cdot \nabla \right) uは、対流項とよばれていますが、絵文字っぽくてかわいいです。

4.まとめ

ずいぶん、昔のことなのできれいさっぱり忘れてましたが、ちょっと手を動かしてみれば、ぼんやり思い出しました。人間の記憶ってすごい。何年たっても、やり直せるもんだなと思いました。そして、LaTex大変だった。そっちは鮮明に蘇りました。

流れは人間の目に見えません。
けど、流れを数式で表現すれば、流れがどうなっているのがを知ることができます。
ロマンですね。

数学は嫌いではなかったなということも、すこしだけ思い出しました。

おわり。

[ポエム] 機械学習をどう学び始めるべきか!がぼんやり分かった
この、誰も読まないエントリを書くため、数値熱流体力学(CFD)ってなんだっけ?を、雑に振り返りました。

CFDを行うためには、大学初級レベルに求められる、(公式丸暗記ではない)数学の基礎知識が必須です。しかし、、、、

CFDの世界では、流れ場をどう捉えて、モデル化して、どう数式に落としこむかというところが非常に重要で、そこには熱力学および流体力学の本質にかかる極めて深い理解が必要です。本質、というと抽象度が高いですが、要は基礎となる考え方や学問が目指している方向感などです。

で、、、私が学生のころCFDを勉強していたときのモチベーションって一体なんだったんだろう?いったい、熱力学や流体力学はどうやって学んだんだろう?と振り返ったところ、ある、ものすごいことを思い出してしまいました。



というわけで、2017年は、広報や事務などの本業は笑顔でこなしつつ、趣味の世界は興味を持ったことだけを自由勝手にやっていきたいと思っています。

*1:数学的な観点でなぜなのかが知りたいですが、超難しそう。