GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
関連
Reference
- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)
- PDF: MATLAB Functions for Mie Scattering and Absorption, Research Report No. 2002-08, June 2002 by Christian Mätzler
Equation of Qext
http://pymiescatt.readthedocs.io/en/latest/forward.html#LowFrequencyMieQ
https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L175
LowFrequencyMieQ()のQextの実装を式に起こすと以下となる。
Q_{ext} = \frac{2}{x^2} \sum{(2n+1)\{Re(a_n) + Re(b_n)}\}
ここでRe()は複素数の実部を取ることを表す。
この式はどこから来たのか?
Bohrehn and Huffman (1983)
4.4 CROSS SECTIONS AND MATRIX ELEMENTS
p112
C_{ext} = \frac{4\pi}{k^2}Re\{S(0^o)\} ... (4.76)
この式から変形しているようだ。
Qextの導出
以下で導出できた。
size parameter Xは以下として定義される (Bohren and Huffman(1983) p100 (Eq. 4.51の下の式)。式1とする。
x = ka = \frac{2\pi Na}{\lambda} ... (1)
N_1 and N are the refractive indices of particle and medium
QextはExtinction efficienciesであるが、Cross section Cextとの関係は以下となる。式2とする。
C_{ext} = \pi a^2 Q_{ext} ... (2)
式変形して
Q_{ext} = \frac{1}{\pi a^2}C_{ext} --- (2')
C_{ext}は以下として定義される (Bohren and Huffman(1983) p112.
C_{ext} = \frac{4\pi}{k^2}Re\{S(0^o)\}...(4.76)
Eq.(4.76)とEq.(2')より
Q_{ext} = \frac{1}{\pi a^2}\frac{4\pi}{k^2}Re\{S(0^o)\} ... (3)
式変形して
Q_{ext} = \frac{4}{a^2k^2}Re\{S(0^o)\} ... (3')
Eq.(1)から$ak=x$なので
Q_{ext} = \frac{4}{x^2}Re\{S(0^o)\} ... (4)
$S(0^o)$はBohren and Huffman (1983)のp112のEq.(4.76)の上の式から
S_2(0^o) = S_1(0^o) = S(0^o) = \frac{1}{2}\sum_n(2n+1)(a_n + b_n)...(5)
Eq.(4)とEq.(5)より
Q_{ext} = \frac{2}{x^2}Re\{\sum_n(2n+1)(a_n + b_n)\} ... (6)
導出完了。
新人応援 > 1次情報と実装の乖離
上記のような式変形は頭のいい人の場合、「after some of algebra(ちょっと式変形して)」と言って実装してしまう。
PyMieScattのコードでは他の部分でも1次情報(Bohren and Huffman)から乖離した実装が見られる。
注意が必要だ。
1次情報から乖離した実装には、以下の問題がある。
- 式変形を常にできるとは限らない
- 例として、級数展開の特異摂動法をある時に理解できたとして、それをいつまでも使えるかわからない
- 手法を理解し続けるためには復習を続けないといけない
- @ プログラマが知るべき97のこと by Kevlin Henney
- 超人の神話 by Ryan Brush
-
超人はいないと思うようになれば、皆の行動は必ず良い方向に変わります。たとえば、共に仕事をしている人が自分よりはるかに賢いと分かっていても、「何も言わなくてもわかってくれる」とは考えなくなります。手間をかけてでも現状についての情報を十分に集め、その人に伝えるはずです。
- 1次情報からの式変形に関する情報を別管理しないといけない
- どこにその情報を管理するか?
- git? or サーバー(on premise or cloud?)
- ソースコメント?
- 別ドキュメント? (e.g. pdf?, .txt, .doc?)
- 実装とソースの二重管理が必要になり、管理の負担も増える
- どこにその情報を管理するか?
- 実装の間違いに気づきにくい
- 式変形後の実装のため、式をチェックする「目(人)」の数が激減する
- 結果として、式に間違いがあったとしても気づきにくい
対処としてどうすればいいか?
1次情報に基づき実装し、途中の式1つ1つを丁寧に実装する。
個々の式を分離して分かりやすく実装することで、バグ発見、修正、機能追加などのメンテナンスをしやすくなる。