動力学行列の正確な導出
以下の代表的な固体物理の教科書を開いても、原子の変位をFourier変換ではなく、単一の平面波で天下りで導出しているため、一般性・正確性に欠ける。
- キッテル
- グロッソ、パラビチニ
- イバッハ
- パインズ
ここでは、キチンと原子の変位をFourier変換して動力学行列を導出する。
原子の変位を次のようにフーリエ変換する。
は後の便宜のためであり、Fourier変換そのものとは関係が無い。
運動方程式は次のように表せる。
ここで、と
の定義は以下の通り。
はポテンシャルが各粒子の相対位置にのみ依存することを示す。
ポイントとなるのは、結合定数のフーリエ変換をすることである。
ここで、以下の関係を使った。
両辺の結果をまとめると、
ここまでくれば、両辺に平面波 を掛けて
の積分およびの
の総和を取ることで、
の方程式に変換できる。(その後で、
と書き直して、見栄えを良くする)
冒頭に言及した書籍では、変位をFourier変換するのではなく、単一の平面波成分のみを持つとして式変形を進めている。
この記事でも採用している、ポテンシャルの2階微分まで拾う調和近似の範囲であれば、並進対称性を持つ条件で単一ののみが現れる方程式が得られる。
それはすなわち、他の波数成分同士が混ざらないことを意味し、結局は単一の平面波成分のみを持つという仮定が正しいことなる。
ただし、最初から単色波を仮定する方法は、天下りであり、三階微分以降の非調和項を考えるときにはその導出は全く役に立たなくなる。
tLeaPで水分子だけのモデルをつくる
MDで最も簡単(と思われる)水分子だけのモデルを作りたかったが、ググっても全然出て来なかった。
タンパク質を読み込んで、そこに solvateBOX で水分子を足すことはたくさんやられている。
しかし solvateBOX は "unit" に水分子を加えるため、そもそもの unit を定義する必要がある。
水分子だけを含む unit をパッと作る方法を見つけたので、以下に tLeaP のインプットファイルを記載する。
# tleap.in
source leaprc.water.tip3p
tip3p = sequence { WAT }
#solvateBOX tip3p tip3pBOX 10.0 # All the characters in "TIP3PBOX" should be capital
solvateBOX tip3p TIP3PBOX 10.0
saveAmberParm tip3p tip3p.prmtop tip3p.inpcrd
savePDB tip3p tip3p.pdb
quit水分子の resname は "WAT" のため、sequence で WAT を1つだけ含む unit を定義すれば、solvateBOX で水分子を追加することができる。
作成した、tleap.in は 以下のコマンドで tLeaP に読み込ませられる。
tleap -f tleap.in
pythonでヒストグラムを作成し、その半値全幅を算出する。
参考サイト
NumPyでヒストグラムを作るnp.histogram関数の使い方 - DeepAge
scipy.signal.peak_widths — SciPy v1.12.0 Manual
import numpy as np from scipy.signal import find_peak, peak_widths from matplotlib import pyplot as plt # data file: data.dat # data.dat has 2 raw data, and second raw data is to be plotted as a histogram # read data from data file data = np.loadtxt('data.dat').T # check histogram by plotting plt.hist(data[1]) plt.show() # get half maximum of full width of the histogram histogram = np.histgram(data[1]) # histogram[0]: intensity (y-axis) # histogram[1]: values (x-axis) peaks = find_peaks(histogram[0]) results_half = peak_widths(histogram[0], peaks, rel_height=0.5) half_widths = results_half[0] * (histgram[1][1] - histogram[1][0]) # check peak and widths by plotting plt.plot(histogram[0]) plt.plot(peaks, histogram[0][peaks], "x") plt.hlines(*results_half[1:]) plt.show()
sedで、不要な行を消去しながら、範囲を指定して置換し、結果を上書きする
参考サイト
sed で指定した範囲の行を置換する - まくまくsed/awkノート
sed | テキストの置換処理を得意とするスクリプト言語
sedでこういう時はどう書く? #Linux - Qiita
- text.txt内の1~10行目を無視したい。
sed -e '1,10d' text.txt
sed -e '1,10d' -e '100,1000 s/hoge/HOGE/g' text.txt
- 上記の内容を、同じtext.txtに反映させたい。
sed -i -e '1,10d' -e '100,1000 s/hoge/HOGE/g' text.txt
※giにすると、大文字と小文字を区別しなくなる。
- #を含む行を消したい。
sed -e '/#/ d' text.txt
- 行頭に#がある行を消したい。
sed -e '/^#/ d' text.txt
- 行頭の#を消したい。
sed -e 's/^#//' text.txt
sed -e '/^#/ s/hoge/HOGE/g' text.txt - 行頭に#がない行のhogeだけ全てHOGEに置換したい。 >|bash| sed -e '/^#/! s/hoge/HOGE/g' text.txt
オイラー・ラグランジュ方程式の導出におけるラグランジュアンの偏微分
ラグランジュアンの微分について、佐久間さんの呟きを見つけた。
∂L/∂vに物理的解釈なんか求めなくていいけど、考えずにはいられない物理学徒のために言うと、「関数yを動かすときy,y'は独立ではない。関数を考えるな。架空の位置wと速度vの対(状態)全体のなす空間ではw,vは独立だからwを止めながらvを動かすことが意味をもつ。架空の速度によるLの微分が∂L/∂v」
— 佐久間 (@keisankionwykip) 2021年12月5日
昔の自分の記事で考察したことがあったのを思い出した。
koideforest.hatenadiary.com
改めて見直すと、汎関数微分を全微分で考えようとしていたり、不正確なところもあり、反省した。
その上で、数学と物理の考え方の違いが自分の中で見えた気がする。
ラグランジュアンの考え方に、二つあると見た。
- 物理:最終的には時間の関数と思う。
- 数学:独立な2変数(もしくは3変数)を引数に持つ関数と思う。
と
は時間の関数だから、
に
と
の具体的な形を入れると、結局は時間変数
だけで表されることになる。
荒っぽく言えば、時間だけの関数を都合の良いようにで分けて、それぞれを独立だと思って偏微分すると、それらしいものが得られる。
一方で、本来、を関数として考えるならば、定義域をしっかり規定する必要がある。
の形にする時点で、独立な変数の組
の全領域(もしくは物理として必要な領域)で
が定義されていて、その微分(導関数)も(物理として使う上で)定義されている必要がある。
この導関数は、独立な変数の組に対する微分操作によって得られる。
物理としてやその導関数を使う場合には、独立な変数の組
の値として
を代入したと考えるべきなのだろう。
熱力学の偏微分も、同じようなことが起きていると思われる。
単純な(熱力学)エントロピーのモデル
単純なエントロピーのモデルを弄ってみる。
参考文献:
- 清水明、『熱力学の基礎(第2版)』東京大学出版会
- H.B. Callen, Thermodynamics and an introduction to thermostatistics, 2nd edition (Wiley, 1985)
エントロピー表示
- 同次性
- 凸性(上に凸)
エネルギー表示
- 同次性
- 凸性(下に凸)
温度
ヘルムホルツの自由エネルギー
- 凸性(温度に対して上に凸)
温度一定の条件を課せば、凸性は内部エネルギーと一致する。
このことは、凸性がルジャンドル変換で逆になっていても、熱浴下による温度一定条件であれば、平衡状態は と同様に
を最小することで得られることに対応している。