PyMieScatt > LowFrequencyMieQ() > Equation of Qext | 新人応援 > １次情報と実装の乖離

```txt:動作環境
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
```

### 関連

- [PyMieScatt > LowFrequencyMieQ() > for small size parameter](https://qiita.com/7of9/items/eef138257744e0442c2f)

### 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](https://omlc.org/software/mie/maetzlermie/Maetzler2002.pdf) 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の実装を式に起こすと以下となる。

```math
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

```math
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とする。

```math
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とする。

```math
C_{ext} = \pi a^2 Q_{ext} ... (2)
```

式変形して

```math
Q_{ext} = \frac{1}{\pi a^2}C_{ext} --- (2')
```


C_{ext}は以下として定義される (Bohren and Huffman(1983) p112.

```math
C_{ext} = \frac{4\pi}{k^2}Re\{S(0^o)\}...(4.76)
```

Eq.(4.76)とEq.(2')より

```math
Q_{ext} = \frac{1}{\pi a^2}\frac{4\pi}{k^2}Re\{S(0^o)\} ... (3)
```

式変形して

```math
Q_{ext} = \frac{4}{a^2k^2}Re\{S(0^o)\} ... (3')
```

Eq.(1)から$ak=x$なので

```math
Q_{ext} = \frac{4}{x^2}Re\{S(0^o)\} ... (4)
```

$S(0^o)$はBohren and Huffman (1983)のp112のEq.(4.76)の上の式から

```math
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)より

```math
Q_{ext} = \frac{2}{x^2}Re\{\sum_n(2n+1)(a_n + b_n)\} ... (6)
```

導出完了。

### 新人応援 > １次情報と実装の乖離

上記のような式変形は頭のいい人の場合、「after some of algebra(ちょっと式変形して)」と言って実装してしまう。

PyMieScattのコードでは他の部分でも1次情報(Bohren and Huffman)から乖離した実装が見られる。
注意が必要だ。

１次情報から乖離した実装には、以下の問題がある。

- 式変形を常にできるとは限らない
    - 例として、級数展開の特異摂動法をある時に理解できたとして、それをいつまでも使えるかわからない
    - 手法を理解し続けるためには復習を続けないといけない
    - @ プログラマが知るべき97のこと by Kevlin Henney
        - 超人の神話 by Ryan Brush
        - > 超人はいないと思うようになれば、皆の行動は必ず良い方向に変わります。たとえば、共に仕事をしている人が自分よりはるかに賢いと分かっていても、「何も言わなくてもわかってくれる」とは考えなくなります。手間をかけてでも現状についての情報を十分に集め、その人に伝えるはずです。
- １次情報からの式変形に関する情報を別管理しないといけない
    - どこにその情報を管理するか?
        - git? or サーバー(on premise or cloud?)
        - ソースコメント?
        - 別ドキュメント? (e.g. pdf?, .txt, .doc?)
    - 実装とソースの二重管理が必要になり、管理の負担も増える
- 実装の間違いに気づきにくい
    - 式変形後の実装のため、式をチェックする「目（人）」の数が激減する
    - 結果として、式に間違いがあったとしても気づきにくい

対処としてどうすればいいか？

１次情報に基づき実装し、途中の式１つ１つを丁寧に実装する。
個々の式を分離して分かりやすく実装することで、バグ発見、修正、機能追加などのメンテナンスをしやすくなる。