資料請求番号:SH43 TS51
方程式の解析に必要な単位計算をマクロで手軽に
研究・開発活動を行っていると現象を元に自分が作成した方程式が正しいのか、論文に掲載されている方程式や無次元数に対する自分の理解が正しいのかを検証するため「単位の計算」を行うことが多くあります。
組立単位であるNやPaなどをSI単位「kg、m、s、K、mol、A、Cd」に分解し、この7つの単位の冪を足したり引いたりする作業を行い、両辺で単位が一致すればその方程式の信ぴょう性は上がり、単位がゼロ、すなわち無次元数であれば、それは無次元数であると言えます。
この作業の理論は非常に簡単でいわゆる「出来て当たり前」の作業なのですが、午後3時ごろや残業中午後7時ごろ、頭が疲労した状態ではこの作業が面倒に感じ、ミスも起こりやすいです。ミスをすればそのやり直しがさらに面倒に感じ・・・と効率が低下していきます。
今回、めんどくささの解消とミス防止のために、このような作業を簡単に行うためのマクロを作成しました。このマクロを使えば指定の項の次元が一発でわかり、その内訳も一目でわかるようなマクロを目指しました。
単位の解析は意外と集中力が要る?
(マランゴニ数、マランゴニ対流を表す無次元数。このプロセスは攪拌がないからな・・・浮力対流しか起こらん思ていたら現象が全然合わんくて表面張力の温度依存性のデカい物質扱っているからこれや思うんやが・・・)
出典:今石 宣之 マランゴニ対流の基礎
ねぇねぇストーク!こないだね、ディープルが・・・・
(σTが表面張力、dが代表長さ、dT/dxが温度勾配でμが粘度、κが熱拡散率でええんやろか・・・。単位を調べるか・・。)
ディープルがね~折り紙っていう趣味に目覚めたみたいで、見せてもらったんだけどすごく上手でさぁ~・・・
・・・・・・。
(ニュートン・・・F=ma、[kg・m・s-2]、Pa・・p = N/A mが2減って[kg・m-1・s-2]、粘度はsが1増えて[kg・m-1・s-1]、
あ~これ逆数か~・・・。)
ディープルが自分で趣味見つけて、楽しんでそれを笑顔で話すのがもうワタシ嬉しくてうれしくて・・・・
(あわん・・・。なにがまちがっとる・・・??温度?熱拡散率?いや、これは拡散率やけん、一律でm2/sのはず・・・じゃあなんなん・・・??
そもそも表面張力ってN/mでよかったか?いや、そもそも表面張力に温度の次元はあるはずない、SIにするときにミスったか?それとも、そもそも記号の意味勘違いしとるか・・・。)
それでね~あとね~
・・・・。
ディープルが今度の週末に〇×行きたいって。ディープルが自発的にどこどこに行きたいなんてさぁ~
ああっ!!せからしかっ!!俺が何やってるかわからんか!!じゃまくるな!!
ご・・・ごめん・・・なさい。
・・・・・。
・・・すまねぇ。俺も言い過ぎた。
もう・・・。休日に家で仕事?頭おかしくなるわよ?
月曜から富士に行くたい。それまでの間に今のモヤモヤをどうにかしたくてな・・・。
さっきふとマランゴニ対流いう現象思いついて、それについて考えとった。
なるほど・・・それにワタシが押しかけた形になってるのね・・・。ごめんね。
もうええわ・・・。大丈夫。
単位のプロファイル化をしよう
単位の解析?単位っていっぱいあるよねぇ~。いっぱいあるけど、全部SIの7単位に集約されることくらいはワタシも知ってるよ。
そうか。
アンタ、もしかして、一回一回組立単位バラして計算やってるの?
せやけど・・・・
めんどくさいら?
めんどくせぇけどやらんと。論文の記号の意味勘違いしたり、間違った方程式を元に仮説立てて実験して、その後間違ってました~なんて嫌やろ?
特に実験中にミスに気付いたときなぁ~。残りの実験の時間と片付けの時間がしんどくてしんどくて・・・。もう情けなくて虚しくなるたい・・・。
(ストークにもそういうところあるんだ・・・。)
おっしゃる通りで。でも、色んな単位をF=maとかの基礎式に当てはめてバラしてくのめんどくさいからさぁ~、プロファイル化したら?
プロファイル?集約化せぇってことか?
うん。アンタと同じ専門の友達がさぁ、単位をこんな風にまとめててね。
ほう。
アンタ、使用頻度の低い単位は一回一回SI単位の組み合わせ調べてるら?特に電気が絡むやつ。
まぁな・・・。頻度の高いヤツでも「あれ、これでよかったっけ?」って不安になって結局調べとるなぁ~。
この一回一回の時間をこのプロファイル化の時間に投資しようって考え方。
一回こんな風にプロファイル化してしまえばこれを見るだけで済むら?
でもなぁ~。プロファイル化したデータがまちがっとったら切ないたい・・・。
それを言うなら、調べたSI単位を書き写し間違えるのも、せっかく調べたのに切ない感じじゃない?
せやな。
人間はミスするんだから、「ミスするきっかけの回数」が少なければ少ないほどいいら?
全くその通りやなぁ~。その考えには大いに賛成たい。
ワタシ、これのデータを友達から貰って会社のパソコンに入っているのよ。
「ストークに横流ししてもいい?」って言ったら、了承してくれたから、今度あげるね。
おおっ!サンキュー!
項が持つ単位をワンクリックで調べられるマクロを作ろう
マクロの使い方
それからね、ワタシ、友達から貰ったExcelシート見て思ったんだけど、「単位を7つ成分をもつマトリックス」としてみて、単位解析を行列計算に落とし込んだらすごくラクに単位の解析ができるんじゃないかな~って思って。
お~情報科卒らしい考え方やな。
・・・・・。
・・・・・マジでそれええな。
でしょ~(笑)だから、ワタシ、こんなの作ってみたのよ。
お~。なんかこう、別の表に使いたい物理量だけを指定して、それをマトリクスごと足し引き出来たらええな。
どうすればええかな~。VLOOKUP関数とか使えばええんかな?
やっぱり、ストークそれ言うと思ったよ~!
だからマクロ作っちゃった。VLOOKUPを使ったやり方はマクロ組んでから思いついた(笑)
組んだんかい。思い付きで?そういうのサッサってできるってええなぁ~・・・。
これ使ってレイノルズ数が無次元数であることが確認できるん?こういう式でdが「長さ」uが「流速」ρが「密度」μが「粘度」やねんけど。
もちろん!O列に物理量入れて、P列にその冪を入れるのよ。
それで青いボタン押せばレイノルズ数の次元が計算されるよ。
おおっ!スゲェ!!プラントル数は?ヌッセルト数は??
自分でやってみたら?ResetボタンでQ列から右、AllResetボタンでO列から右が消えるから、新しく物理量入れて。
ああ。
プラントル数
ヌセルト数
これ、ええなぁ~。
喜んでもらえてうれしいよ。
マクロの解説
それで、このマクロはどうなっとるん?
そんなに大したマクロじゃないんだけど・・・。
/* unit analysis program */
Sub unit()
/* 指定の物理量の単位を抽出・表示 */
Unit_count = Cells(1, 16) – 1
For i = 3 To 3 + Unit_count
unit_num = Range(Cells(3, 1), Cells(23, 1)).Find(What:=Cells(i, 15).Value).Row
pow = Cells(i, 16)
For j = 17 To 23
Cells(i, j) = pow * Cells(unit_num, j – 10)
Next j
Next i
/* 物理量のSI単位の冪を計算して項の単位を調査 */
Cells(5 + Unit_count, 15) = “計”
For j = 17 To 23
Cells(5 + Unit_count, j) = WorksheetFunction.Sum(Range(Cells(3, j), Cells(3 + Unit_count, j)))
Next j
End Sub
/* unit analysis program End */
このマクロは日本語で入力した物理量を表からピックアップしてくるマクロと、
ピックアップした物理量のSI単位を合計して項のSI単位を表示させるマクロに大きくわかれるのよ。
まず、Unit_countっていう変数に単位を計算したい項を形成する物理量の数が入るようになっていて、Cells(1,16)、つまりP1セルにはこの関数がセットされている。
=COUNTA(P3:P11)
COUNTA関数、空白でないセルの数を返す関数たいね。
そう。だから物理量とその冪を入れるだけここの数字が増えるようになっている。
例えばレイノルズ数は「長さ」「密度」「流速」「粘度」の4つからできとるから、ここの数字は「4」になるわけやな。
うん。それで、Unit_countという変数には「4-1」で「3」が格納される。
そしたら次のFor文の範囲が3~6に指定される。3,4,5,6行を使いますってこと。実際に3,4,5,6行が使われているでしょ?
確かに。これなら項を構成する物理量の数が変化してもフレキシブルに対応できるな。
それで次の文がポイントなんだけど・・・・
unit_num = Range(Cells(3, 1), Cells(23, 1)).Find(What:=Cells(i, 15).Value).Row
これは、3行1列~23行1列、つまりA3~A23に渡って検索し、i行15列と同じ文字列を見つけたら、その行番号を
unit_numという変数に格納しますっていう文。
・・・・・?
えっと~・・。For文あるら?i = 3~6としたら、1回目の循環ではCells(3,15)と同じ文字列を探すことになる。Cells(3,15)、つまりO3セルには「長さ」って書いてあるでしょ?そしたら「長さ」っていう項目をA3~A23に渡って探すのよ。
それはA4セルにあるな・・・。
でしょう?そしたら「4」っていう数字を「unit_num」という変数に格納するのよ。
「粘度」だったら「11」が格納される。
あ~。それでその数字を
For j = 17 To 23
Cells(i, j) = pow * Cells(unit_num, j – 10)
Next j
に使うのか~。
17~23ってのはQ~Wやな。もし、「長さ」やったら「unit_num」は「4」やから
Cells(3, 17) = pow * Cells(4, 7)になる。Cells(4,7)、つまりG4セルには「長さ」っていう物理量の「kg」の単位が存在している。それをCells(3, 17)、つまりQ3に持ってくるんやな。
列がアルファベット表記だとわかりづらいので、列を数字にしてしまうことも可能です。
※アルファベット⇔数字切り換えの方法について
そういうこと!
これをj = 17~23に渡って繰り返せば「長さ」のSI単位が丸ごとコピーできるでしょ?
Cells(3, 18) = pow * Cells(4, 8)で「m」の単位が
Cells(3, 19) = pow * Cells(4, 9)で「s」の単位が・・・
って続く。
それで「粘度」だったらi=6になって「unit_num」の数字が「11」になるけん、
Cells(6, 17) = pow * Cells(11, 7)で「kg」の単位が
Cells(6, 18) = pow * Cells(11, 8)で「m」の単位が・・・
ってコピーしてくることができるんやな~。
そうそう!そんな感じ!文字列を検索してその行番号を取得するマクロはこちらのページで詳しく解説しているから見てみてね!
※unit_num = Range(Cells(3, 1), Cells(23, 1)).Find(What:=Cells(i, 15).Value).Rowに関する詳しい説明
それで、それぞれの物理量のSI単位系をピックアップして冪の数を掛ける。そうしてできた各物理量のマトリクスの総和を取ればその項がもつ単位がわかるでしょう?
わかる。
それが
For j = 17 To 23
Cells(5 + Unit_count, j) = WorksheetFunction.Sum(Range(Cells(3, j), Cells(3 + Unit_count, j)))
Next j
の部分。レイノルズ数の単位を出したいならUnit_countの数は「4-1」で「3」になってるでしょう?そしてj = 17だったら
Cells(8, 17) = WorksheetFunction.Sum(Range(Cells(3, 17), Cells(6, 17)))
になるよね。
※Unit_countの説明
ああ。
つまりやってることは、下の動画のようにQ8セルを選択して
=SUM(Q3:Q6)
という関数書いて、それをQ列からW列に渡ってドラックしているのと同じ。
この「WorksheetFunction.Sum」ってのがSUM関数使うっていう文なんか。
そう。これを使うことで普段Excelで使っている関数がVBAでも使えるようになる。
それでFor文のj=17~23でQ列からW列に渡ってドラックする操作を表現しているの。
なるほどなぁ~。これで晴れて項がもつ次元をワンクリックで調べるマクロの完成ってわけか~。
マクロを問題解決に役立てよう
さっき、なんかやってたでしょ?難しそうな単位解析・・・。
ああ、これな。
出典:今石 宣之 マランゴニ対流の基礎
これをさっきのマクロに通してみたら?
やってみる。
あ~さっきと同じ結果や。「温度」だけ残る・・・。
ということはそもそも、俺がこの無次元数に使われている記号の解釈を間違えとる・・・か・・・。
・・・・・・
あ。
何かわかった?
このσTいうやつ、「表面張力」やなくて「表面張力の温度勾配」や。
出典:今石 宣之 マランゴニ対流の基礎
あ~そしたら辻褄あうやん・・・。
よかったじゃない!一つわからなかったことがわかって~
・・・・・・。
どうしたの?
恥ずかしか・・・。
なんで?
やって、自分の考えが正しいってσTが表面張力でN/mの次元を持ってるって信じ込んで悩んで人に当たり散らして、結局自分の見落としが原因で・・・しかも、マランゴニ対流言うものは表面張力の勾配が引き起こす現象であってその現象の本質を理解せんで・・・。
あ、あれはワタシが悪かったのよ・・・。だから落ち込まないで・・・ね。
・・・・・・。
(あ~ストークってこういうときに落ち込むんだな~。)
ところで、今やってることって自発的にやってるの?
どういうことや?
いや、例えば上司に「オマエはこの土日に、この問題について考えとけ」とか言われているワケじゃないんだら?ってこと。
そんなパワハラを絵に描いたような上司、いるかよ。
いやぁ~わかんないよ~。この世の中広いんだから。もしかしたらミナガミにもいるかもしれない、っていうか、伊予製造所(愛媛県四国中央市)にそういう上司がいるっていうウワサというか、被害報告というか・・・そういうのは聞いてる。
(あ・・・。俺、シママに心配かけてたのかもな・・・。)
マジかよ~。関わりたないな~・・・。むしろ俺ら、最初がそういう上司じゃなくて良かったなぁ~。
そうね~。
まとめ
今回は注目する項がどのような次元をもっているのか、資料や論文に提示されている無次元数は本当に無次元なのか、などを調べる作業を効率よく進めるためのマクロを作成しました。
マクロを作成しなくても、様々な単位のプロファイル化はしておくべきだと思いました。何回も調べて確認して・・・という手間を1回で済ますことができますから、ラクになりますし、なによりミスが減ると思います。
そして休日に仕事や研究について考えるのは、頭の疲労、ひいては、うつ病を誘発することがあるので極力避けましょう。
おまけ
ナビエ・ストークス式の健全性解析
ナビエ・ストークス式は流体力学の基礎式で以下の記事で解説しています。
この5つの項の全てが同じ単位を持っていれば「方程式として健全」という表現をします。単位の違うもの同士を足したりイコールで結びつけることはできません。同じ1キロでも1kgと1kmを足し合わせることができないのと同じです。この場合「不健全な方程式」といい、検討しなおしが必要になります。
この方程式の左から1項ずつ1~5の名前を付けてそれぞれの項の単位を調べます。
~1項目~
密度×流速の時間微分です。時間微分を1回行えば時間をマイナス1乗したことになります。
kg・m-2・s-2はkg・m・s-2・m-3と解釈し、単位体積当たりの力N・m-3です。元々ナビエ・ストークス式は運動方程式F = maから変形させていますから、力の次元が入っているのは当然と言えます。2項目以降ですべてkg・m-2・s-2と出ればこの方程式は健全です。
~2項目~
ナブラ(∇)は
ですから、長さのマイナス1乗に相当します。
~3項目~
~4項目~
ラプラシアンは長さの2階微分です。
~5項目~
すべてkg・m-2・s-2と出たのでこの方程式は健全と言えます。この作業を行えば「この方程式を構成する物理量を理解した」と言いやすくなります。
コメントを残す