sikino のすべての投稿

波動関数の規格化とは?

非相対論的シュレーディンガー方程式の解を規格化するお話

Q氏とR博士の会話1


Q「波動関数の規格化は、なぜ行われるのでしょうか?」

R「異なる量子数に属する状態間を、分かりやすく比較したいからだ。」

Q「なぜ規格化をすると比較ができるのでしょうか?」

R「例えば、有限区間内で定義される2つの状態があるとき、片方の状態の波動関数の値が1、もう片方が0.01という、どちらも単なる定数であることが分かったとしよう。」
R「その場合、規格化を行わないと、”値1を持つ状態のほうが多いから、もう片方は無視できる”、と直感的にしてしまうかもしれない。」
R「その点、規格化をすればどちらも同じ値にできるから、優劣がなく比較をすることが直感的にできて、都合がよい。」

Q「なるほど。わかりやすさ、ですか。」
Q「しかし規格化するといっても、何かを等しくして比較するって意味ですよね。何を等しくして比較するのですか?」

R「個数で規格化するのだ。」
R「1つの電子について解いているとき、波動関数が示す電子数を”1”であるようにするのだ。」

Q「個数で規格化するのですか。では、2個の電子を表す1つの波動関数があったらどうです?規格化は”1”ですか、”2”ですか?」

R「どちらも正解だ。1でもいいし、2でもいい。」
R「2個の電子が相関して離れない現象ならば、それは”1つのペア”を”1”にするのが良いだろう。だから、その意味ならば1が良い。」
R「しかし、電子”1つ”が重要ならば、電子1つの波動関数を”1”にするべきだろう。それが2つあるので合計数は2だ。」
R「定義が書いてあれば、それでよい。」

Q「見たい現象によって分けるのですか。規格化と言いながら、いかなる問題に対する規格は無いのですね。」

Q氏とR博士の会話2


Q「波動関数の規格化は”個数”で行われるんですよね。」

R「そうだ。」

Q「波動関数の”個数”は全存在確率密度を1にするようにすることで実現できます。」

R「そうだ。」

Q「つまり、波動関数の絶対値の二乗の、全空間に渡る積分が収束しなければならない。」

R「その通り。」

Q「ならば、自由粒子のような連続状態の規格化は不可能なのですか?」
Q「無限遠まで振動していますし、絶対値の2乗は定数です。」
Q「全位置空間に渡る積分は無限になり、規格化定数が零になります。」

R「可能だ。だが、君の疑問はもっともであり、計算自体は正しい。」
R「しかし、全存在確率密度による規格化には隠れた前提がある。」
R「それは”束縛状態であるならば、全存在確率密度で規格化すると都合がよい”ということだ。」
R「連続状態はその前提に入らない。なので全存在確率密度による規格化が計算不能でも、何も問題はない。」

Q「では連続状態の規格化とは、なんなのでしょう?」

R「計算が楽だとか、都合がよい…例えば、計算したら有限の値になる何か、があれば何で規格化しても良い。」
R「束縛状態において、全存在確率密度はたまたま採用されたのだ。」
R「本来、規格化は数学的な手順であり、”分かりやすい表現”の定数倍という表現をしたいがために生まれた。」
R「何で規格化するのか?が変わったところで、定数倍の違いしかないから、物理は変わらない。」
R「自由粒子のような連続状態の規格化は、通常、デルタ関数で行われる。」
R「しかし、例えば”指数関数の係数を1にするように決めた”と主張して、物理を作り上げても何も問題はない。」
R「この例は任意性があるので、褒められない規格化だがね。」

Q「規格化が連続状態と束縛状態で違ってもよい、ということですか。」
Q「しかし、それでは連続状態と束縛状態で規格化した関数が、その境界で不連続になってしまうかもしれませんが、問題ないのですか。」

R「問題ない。連続状態と束縛状態を別々に規格化すると約束するならば、不連続でも問題ない。」
R「一方で、束縛状態でも連続状態でも統一的な規格化の方法を採用すれば、不連続性は起こらず、すっきりする。」
R「そのような規格化方法として、例えば波動関数を単なる2乗で規格化する方法がある。」
R「この場合は波動関数を複素平面に解析接続しなければならなくなるが。」

マイナス×マイナス=プラスはなぜ?

負は、正の世界と負の世界を入れ替える因子である。

Q氏とR博士の会話1


Q「なぜ負に負を掛けると正になるのですか?」

R「ゆっくり確認していこう。まず、正の世界に正の数を掛けたら正になる。」

Q「納得します。」

R「では、正の世界に負の数を掛けたらどうなるかな?」

Q「負でしょう。」

R「そうだ。正の世界から見たら、負の数を掛けることで世界が反転するのだ。」
R「では負の世界から、世界を反転させる負の数を掛けたらどうなるかな?」

Q「負の反転は正ですから、正です。」

R「その通り。なので負に負を掛けると正なのだ。」

Q氏とR博士の会話2


Q「正の数に、正を掛けたら正になるのですよね。」

R「そうだ。」

Q「負の数に、負を掛けたら正になるのですよね。」

R「そうだ。」

Q「自分の世界の数同士をかけたらどちらも正はおかしくないですか?」
Q「正×正=正に、負×負=負になるのが、道理でしょう?」

R「その通りだ。君の疑問は全く正しい。だが、人類の都合で決められてしまったのだ。」
R「正の数しか無かった頃、人類は”正×正=正”を基準にした。その後に”数”を負に拡張したのだ。」
R「負の数に広げても”正×正=正”を保ちつつ、”正×負=負”または”負×正=負”になるように拡張したいと考えた。」
R「そう制約したから、”負×負=正”となってしまったのだ。負は正の世界と負の世界を入れ替える因子である、と。」

Q「なるほど。もし仮に”負×負=負”を基準に選んでいたら、正の数が正の世界と負の世界を入れ替える因子となるわけですか。」

R「その通りだ。負×負=負”を基準とするならば、”正×負=正”または”負×正=正”となり、”正×正=負”になる。こういった世界を作ることも可能なのだ。」
R「どちらの考え方も間違いではない。なぜ負×負=正なのかの理由を突き詰めるならば、『正×正=正に選んだから』だ。」

Q「ならば、無理やり”正×正=正”と”負×負=負”を満たすように強引に数学を組み立てたら、”正×負”はどうなるのでしょう?」

R「未定だ。定義できない。正×負の単位を数えるための、新たな数の拡張が必要になるだろうね。」

秋間補間

秋間補間と呼ばれる補間方法があります。

こんな補間結果となります(akimaとmodified akimaの線が秋間補間の結果です)。

秋間補間の特徴は、

  • 与えられた点を必ず通る
  • オーバーシュートが発生しにくい
  • 補間したい点から遠い補間点の影響を受けない
  • 導関数の連続性は保証されない
  • 元のデータ点を大きく逸脱するような補間は苦手(線形的な補間に近い)
  • 極値におけるデータ点など、元の関数の特徴的な値が分かっているときに良い補間結果を与える

ということです。オーバーシュートとは、元のデータが急峻に変化した場合、その前後の補間結果が振動してしまい大きく外れてしまうことを意味します([5]にオーバーシュートの様子を見ることができます)。
ただし、3次スプライン補間のような微分の連続性が保証されません。

それでは計算方法を追っていきます。

導出


秋間補間は1970年に秋間浩によって提案された補間方法です[1]。地図の等高線を表示するために生成されたようです。その後修正された秋間補間が紹介されました[2]。

具体的な計算方法を見ていきます。
補間は補間したい点を中心に前後のデータ点を用いるので、両端では特別な扱いが必要です。それを区別するために領域を3つに分けて考えます。具体的には下の図のような感じです。

領域IIにおける補間


まずは領域IIを考えます。簡単に考えるために、以下の図のように補間に用いるための6点\((x_i, y_i), i=0,5\)があった時、中間の領域である\(x_2\le x\le x_3\)の中の値を補間して求めたいと考えます。

補間は3次関数で行います。すなわち\(x_2\le x\le x_3\)において

の形で補間を行います。係数\(a_0, a_1, a_2, a_3\)は補間に用いる6点のデータ点から計算できて、

の通り求められます。ここで、\(q_1, q_2, m_1,\cdots, m_5\)は


の通り求められます。\(w_1, w_2\)は使用する秋間補間の種類によって変わります。通常の秋間補間では、

の通り計算し[1,3,4]、修正秋間補間においては

で計算します[2,3,4]。

領域I, IIIにおける補間


領域I, IIIについては以下の関係を満たすように、本来は存在しない補間用のデータ点を予測します。
領域I:最も左端のデータ点を\(x_3\)、その右隣のデータ点を\(x_4, x_5\)と置きます。すると、\(x_3\)より左のデータ点\(x_2, x_1\)を関係式(7)より予測します。
領域III:最も右端のデータ点を\(x_3\)、その左隣のデータ点を\(x_2, x_1\)と置きます。すると、\(x_3\)より右のデータ点\(x_4, x_5\)を関係式(7)より予測します。

ここで、\(m_{ij}\)は

を意味します。すると、秋間補間で用いる(本来は存在しない)端のデータ点は、

領域I)

領域III)

と求められます。

プログラム例


上の式をプログラムすれば、このようになるかと思います。
注意してプログラムを作らないとゼロ割が発生します。\(x_i\ne x_j\)を仮定していれば、式(5),(6)の\(w_1, w_2\)を計算する際にこれが発生します。なので、この回避を取り入れてプログラムを作成しています。

計算例


参考文献[4]に秋間補間と修正秋間補間の振る舞いの例があります。それを本稿のプログラムを用いて計算すると同じ振る舞いを示すことが分かります。

それでは、3次スプライン補間と秋間補間、修正された秋間補間を比べて、秋間補間にどのような特徴があるかみましょう。

オーバーシュートの抑圧


本当の答えを定義することは難しいですが、変化する点(\(x=2.8\sim 3.2\))近傍で直線とすれば傾きは5になります。一階導関数はどの補間方法も連続(右から極限と左から極限が一致の意味で)ですが、秋間補間は二階導関数は連続ではありません。3次スプラインは二階導関数まで連続であるという仮定の下での補間なので、一応連続的な変化をしています。

秋間補間では3次スプライン補間よりはオーバーシュートが抑えられているものの、近傍 \((x=2.5, 3.5)\)において外れた値となっています。
修正された秋間補間では、その点が改善されオーバーシュートが発生していないことが分かります。

振動関数の補間

振動関数を補間する例として、元の関数が\(y=\sin(x)\)だったとします。

sin関数

この場合は元の関数が十分滑らかであり、高階微分も連続であることが分かっています。与えられたデータ点も誤差がないので、3次スプラインが有効でしょう。
秋間補間では本来極値をとるはずの\(x=n\pi/2,~(nは整数)\)あたりで値があまり大きくならないことから、かなり局所的な補間である特徴が分かります。すなわち、大きくオーバーシュートしない反面、予測は得意ではないということです。これを回避するためには、元の関数の極値の値など特徴的なデータが必要であることが分かります。

二次元平面の補間は本稿には載せていませんが、[4,6]にどのような違いが表れるか図があるので、興味がある方は参照してみてください。
確かに、本来の目的である地図の等高線作成には大きな効果が期待できそうなことが分かります。おそらく、取得するデータ点も標高など、地形の特徴的な点におけるデータを集めることが主となるので、秋間補間との相性が良いのでしょう。

参考文献


[1]Akima H. A New Method of Interpolation and Smooth Curve Fitting Based on Local
Procedures. Journal of the ACM, 17(4), 589 ― 602. (1970).
doi:10.1145/321607.321609

[2]Akima H. A method of univariate interpolation that has the accuracy of a third-degree
polynomial. ACM Transactions on Mathematical Software, 17(3), 341 ― 366. (1991),
doi:10.1145/114697.116810

[3]
makima 修正Akima区分的3次エルミート内挿 -MathWorks
interp1 1次データ内挿(テーブルルックアップ) -MathWorks

[4]Cleve Moler, Makima Piecewise Cubic Interpolation

[5]スプラインによる補間

[6]格子点に内挿して等値線をひく

emacsのメニューバー、ツールバーを消去する

emacsの操作に慣れてくると、emacs画面の上部にあるパネルやツールバーを使わなくなります。
大事な画面のリソースが減ってしまうので、これを消すことを考えます。

emacsの設定ファイル(~/.emacs)にメニューバーとツールバーの消去する設定

(menu-bar-mode -1)
(tool-bar-mode 0)

を記述することで消せます。書いてemacsを再度開くと、以下の通りとなります。

環境:Linux-mint 20
Emacs: GNU Emacs 26.3 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.14) of 2020-03-26, modified by Debian

メニューバーとツールバー有り

メニューバーとツールバー無し

参考

メニューバーの削除
Remove the Emacs menu bar

ツールバーの削除
in GNU Emacs OSX, how to hide title bar? stack overflow

Lenovo thinkpad X1とeGPUの接続時のフリーズ

現在、Lenovo社から発売されているThinkpadにeGPUを接続したとき、30分か1時間ほど経過するとフリーズする、という状態が頻発しました。

解決法はeGPU Freezing up every 30 minutes.
にあるように、

デスクトップを右クリックして”NVidia コントロールパネル”を表示
 1. 『3D設定』→『3D設定の管理』を選択
 2. 『グローバル設定』タブで『高パフォーマンスNVIDIAプロセッサ』を選択
 3. 『電源管理モード』を『パフォーマンス最大化を優先』に変更

とします。そうしたところ、現在安定しています。

環境と状況


環境
 品名: ThinkPad X1 Carbon (2019)
 OS:  Windows 10 Pro 64-bit
 eGPU Box: Razer Core X
 GPU: GeForce GTX 1660 SUPER VENTUS XS OC
 接続: ThinkPad Thunderbolt 3 Workstation ドック 2を利用したThunderbolt接続
 出力: eGPU BoxのGPUから外部ディスプレイに出力

状況と解決

eGPUを接続して30分~2時間は問題なくGPUが利用できるのですが、その後前兆もなくフリーズします。このフリーズはマウス、キーボードの入力を全く受け付けなくなる酷いフリーズです。電源ボタンを長押しして強制終了する以外にやれることがありません。
強制終了後に起動したのちに動く時間を利用して、再起動、リセット、GPUドライバの更新などを試しましたが状況が全く変わりませんでした。

いろいろ調べたところ、eGPU Freezing up every 30 minutes.に行きつき、上のような設定を行ったところ、今のところ安定して動いています。

論文に使える図をgnuplotで作る

本稿の目的は、論文に用いることができるレベルの図をgnuplotで制作することです。
gnuplotはVersion 5.2 patchlevel 8を利用しています。

方針


本稿の方針としては、実際の論文からとってきた図を再現することです。
元データはないので、あくまで枠線や、フォントなどを合わせることを目的とします。

対象とする図は以下の[1]の図3と[2]の図3にします。
これらを選んだ理由は特にないですが、これらを再現することを目標にします。

[1]の図3を再現


ではまず、Phys. Rev. A 102, 033316 (2020)の図3を再現しましょう。

[1]の図3

[1]の図3をgnuplotで再現した図

gnuplotで用いた全コードは以下に折りたたんでおきます。

データは適当に作成しました。データのダウンロードは以下からどうぞ。
https://slpr.sakura.ne.jp/qp/supplement_data/PRA102_033107_Fig3likedata.tar.gz

細かな説明をしていきます。

  • 線の色の指定
    線の色はlinetypeで決定していきます。

    set linetype  1 lc rgb '#0072bd' lw 1 # blue

    の意味は、gnuplotでプロットした時の1番目の線を、カラーコード’#0072bd’, 線の太さ”1″とすることを指定しています。プロット時に”lc 1″としてもこの1番目の色に変更できるようになります。linetype 6まで同じです。

  • 複数画面の表示位置指定
    続いて、

    # left top figure(1) position
    lx1=0.14; ly1=0.87
    rx1=0.47; ry1=0.57

    ~~~

    set lmargin screen lx1
    set tmargin screen ly1
    set rmargin screen rx1
    set bmargin screen ry1

    の部分について説明します。個別画面の左上の座標\((lx1, ly1)\)と右下の座標\((rx1, ry1)\)を決定します。座標の原点は全体の左下\((0,0)\), 全体の右上\((1,1)\)としたときに決められます。実際にその値を適用しているのがlmargin, tmarginなどです。詳しい説明は、gnuplotで複数の図を載せるを参照してください。

  • eps出力のためのターミナル指定
  • if(@ARG1 == 1){
      set terminal postscript eps size 5,5 dashed enhanced color font 'Roman,20'
      set output "PRA102_033107_Fig3.eps"
    }

    の部分は、出力ターミナルの設定を行っています。条件分岐は引数によってターミナルに出力するのか、epsとして画像出力するのかを指定するためです。使いやすさのためです。重要なのは、 size 5,5 の箇所です。ここを正方形にしておかないとxyの比が変わってしまうので扱いづらくなります。
    eps画像の切り抜き(Boundary boxの変更)はgsviewなどでできるので、画面四方の空白はいくらあってもよいです。そのサイズをgnuplot上で合わせるよりも、gnuplotで思った通りの出力をすること優先しましょう。
    フォントも重要ですね。経験上、2×2の画像であればsize5,5の時フォントサイズ20よいと思います。論文の本文はRomanフォントが使われるため、図もRomanにしておいたほうがよいでしょう。

  • 個別画面の細かい指定
    1. タイトルの指定
      set title "{/Gothic-bold=24 Linear scale}" offset 0,0

      タイトルを指定します。図のLinear scaleと書かれた太字です。[1]の図を見ると、どうもゴシック体の太字で書いているようです。なので、フォントをGothic-boldとして、文字の大きさを24に変更します。

    2. 凡例の指定
    3. set key reverse samplen 1 width 0

      凡例はkeyで指定します。reverseは凡例の中の”文字-線の種類”の表示順を”線の種類-文字”に変更します。samplenは、凡例内の線の長さを変更する(デフォルトで4)、wigthは線の種類と文字の間隔を指定するパラメータとして考えればよいでしょう。具体的な値は実際に出力させて何度も気に入るまでトライアンドエラーしています。

    4. x,y軸の設定
    5. unset log x
      set xr[-2:52]
      set xtics 10 nomirror
      set mxtics 1
      set format x "%2.0f"
      set xl "{/Roman-Italic {/=20 tJ}}/{/=14 @^{/Symbol=14 -}{/Roman-Italic {/=20 h}}}"

      軸設定をまとめて説明しますが、特に特殊文字の出力が難しいと思うのでここに注目します。プランク定数は特殊文字であり、postscriptターミナルでは出力することができないと思います。なので、文字hとハイフンを組み合わせて出力しています。私が思いついたわけではなくググりました。[4]に詳細が書いてありまして、それから持ってきました。文字サイズが違うので適当に合わせました。
      y軸も同じですので、省略します

    6. グラフのプロット
    7. plot "hJ5_fit.d" u 1:2 w l lw 2 lc 5 dashtype 2 ti "{/Gothic-Condensed linear fit}",\
           "hJ5.d" u 1:2 w l lw 2 lc 1 dashtype 1 ti "{/Roman-Italic M}=24   ",\
           "hJ5.d" u 1:2 w l lw 2 lc 2 dashtype 2 ti "{/Roman-Italic M}=32   ",\
           "hJ5.d" u 1:2 w l lw 2 lc 3 dashtype 4 ti "{/Roman-Italic M}=64   ",\
           "hJ5.d" u 1:2 w l lw 2 lc 4 dashtype 3 ti "{/Roman-Italic M}=128 ",\
           "hJ5.d" u 1:2 w l lw 2 lc 5 dashtype 5 ti "{/Roman-Italic M}=256 "

      最後にグラフをプロットします。dashtypeは実線、破線を決定するパラメータです。私の環境では実線が1, 破線は2以降になっていますが、環境によって違うかもしれません。各自合わせましょう。
      また、linear fitという文字は、なんというかギュッとまとまっています。しかもRoman体ではなくゴシック体です。これを指定するには、

      ti "{/Gothic-Condensed linear fit}"

      と入力することで実現可能です。

以上でおおよその説明が終わりです。

重要なのはトライアンドエラーです。ターミナルによって表示が異なるので、postscriptで出力すると決めたら確認はpostscriptで行いましょう。実際に最終出力図をqtターミナルの表示上では、このようになります。

ベクタ形式であるEPS画像のサイズは102.5kBです。論文に投稿する場合でも許容できるサイズではないでしょうか。

ラスタライズ形式であるPNGをimagemagickを用いて

convert -density 400x400 -background white -flatten -alpha off PRA102_033316_Fig3.eps PRA102_033316_Fig3.png

で変換すると、91.8kBです。この程度の差であれば、ベクタ形式のほうが良いでしょう。

[2]の図3を再現


続いてPhys. Rev. A 102, 033107 (2020)の図3を再現しましょう。
大きな違いはカラーマップを利用した図であることです。

[2]の図3

[2]の図3をgnuplotで再現した図

データは適当に作成しました。データのダウンロードは以下からどうぞ。
https://slpr.sakura.ne.jp/qp/supplement_data/PRA102_033107_Fig3likedata.tar.gz

※ギリシャ文字Φは、

{/Symbol-Oblique f}

とすることでギリシャ文字のイタリックを用いることができます。

[1]と同じ部分がかなりあるので、違う部分だけを説明していきます。

  • カラーマップの設定
    見た目で[3]の’hot’と呼ばれるカラーセットだとわかったので、それを用います。

    set palette rgb 21,22,23 negative # colormap setting

    ただし、カラーマップの色が反対になっているので、それを指定するnegativeを追加しています。

  • カラーボックスの設定
    unset colorbox

    ~~~~

    set cbtics 0.5 scale 0 # scale 0, to delete tics line in colorbox
    set cbr[-2:0]
    set colorbox user origin 0.91,0.35 size 0.02,0.25 border # change size of colorbox

    カラーボックスに注目すると、左図(a)はカラーボックスがないですが、右図(b)にはあります。なので、カラーボックスを出力しないunset colorboxを指定しています。
    また、(b)のカラーボックスはカラーの値を示すところにticsが入ってないため、cbticsのscale(ticsの線の大きさ)を0にしています。
    さらに見ると、カラーボックスの大きさが少し小さいです。なので、カラーボックスの大きさ位置を指定するために、set colorbox user origin …を指定しています。

  • テキストボックスの表示
    set label tc rgb "black" at graph 0.02, graph 0.95 front "(a)"

    グラフ上のテキスト(a), (b)は、テキストボックスを追加して画面上に表示します。上のような指定で表示できます。

ベクタ形式であるEPS画像のサイズは752kBです。論文に投稿する画像としては、許容できるといえばできるサイズですが、若干大きいです。

ラスタライズ形式であるPNGをimagemagickを用いて

convert -density 400x400 -background white -flatten -alpha off PRA102_033107_Fig3.eps PRA102_033107_Fig3.png

で変換すると296kBです。2倍少し容量が小さくなるので論文全体の画像数が多いのならば、ラスタライズ形式の方が良いかもしれません。共著者と相談するとよいでしょう。

以上で説明を終わります。

参考文献


[1]S. Goto and I. Danshita, “Measurement-induced transitions of the entanglement scaling law in ultracold gases with controllable dissipation”, Phys. Rev. A 102, 033316 (2020)

[2]Z. Chen and F. He, “Interference of nuclear wave packets carrying different angular momenta in the dissociation of H2+ in strong circularly polarized laser pulses”, Phys. Rev. A 102, 033107 (2020)

[3]color mapについて
http://www.gnuplotting.org/?s=color

[4]6.4 What if I need h-bar (Planck’s constant)? -gnuplot FAQ
http://www.gnuplot.info/faq/#x1-610006.4

そのほか有用なページ

gnuplotでoption詰め込んで論文用figureを作ってみた[1] -qiita, @ucc_white
https://qiita.com/ucc_white/items/544b85e009a58d046d3c

Gnuplotのいろは -東京工業大学 科学技術創成研究院 佐藤千明研究室
http://www.csato.pi.titech.ac.jp/From2014/software/how-to-gnuplot.html

連成振動

弦を考えます。弦は重さ\(M\), 長さ\(L\), ばね定数\(K\)を持ちます。

この弦を波動方程式に頼らないで定式化しましょう。
波動方程式は、2次元の波動のうち、1次元分の方向を\(y=y(x, t)\)として表現するため、x軸にとって多価関数となる弦を表現することが出来ません。物性物理学等で格子の振動を考える場合は、結晶を構成する原子が平衡位置から殆ど動かないのでこういった問題は起こりません(起こったとしても無視される位少ないので、大多数の振る舞いを考える場合には問題になりません)。
よって多次元の問題を考えるには波動方程式を元にして考えるのは不適切です。そのため、弦を単なる連成振動として考えて、完全に2次元の問題として扱いたいと思います。

図のような連成振動のモデルを考えます。

質量\(m\)を持つ\(i\)番目の質点が、位置ベクトル\(\mathbf{x}_i\)で指定され、隣り合う質点との間が、ばね定数\(k\)、自然長\(l\)を持つ理想的なばねで繋がれているとします\((i=1,2,\cdots, N)\)。この時、運動方程式を立てると
\begin{eqnarray}
m\frac{d^2 \mathbf{x}_i}{dt^2}&=&
+k(|\mathbf{x}_{i+1}-\mathbf{x}_{i}|-l) \frac{\mathbf{x}_{i+1}-\mathbf{x}_{i}}{|\mathbf{x}_{i+1}-\mathbf{x}_{i}|}
-k(|\mathbf{x}_{i}-\mathbf{x}_{i-1}|-l)\frac{\mathbf{x}_i-\mathbf{x}_{i-1}}{|\mathbf{x}_i-\mathbf{x}_{i-1}|}
\end{eqnarray}
となります。全く同じですが、見通しをよくするため式変形すれば、
\begin{eqnarray}
m\frac{d^2 \mathbf{x}_i}{dt^2}&=& k\Bigl[A_i \mathbf{x}_{i+1}-\bigl(A_i+A_{i-1}\bigr)\mathbf{x}_{i}+A_{i-1} \mathbf{x}_{i-1}\Bigr]
\end{eqnarray}
と表せます。ここで、
\begin{equation}
A_i = \frac{|\mathbf{x}_{i+1}-\mathbf{x}_{i}|-l}{|\mathbf{x}_{i+1}-\mathbf{x}_{i}|},~~(i=1,\cdots, N, A_N = 0)
\end{equation}
と置きました。

さて、こうしたモデルを考えた時に、連成振動として考えた\(N\)分割した1つ1つの小さいばね(”ミクロなばね”と名づけます)とその弦を1つにみなした時の大きなばね(”マクロなばね”と名づけます)の間の関係式を考えましょう。
仮定として、等間隔に分割し、弦の密度は一様であるとします。

この条件の下で、
マクロなばねの重さ\(M\), 自然長\(L\), ばね定数\(K\)

ミクロなばねの重さ\(m\), 自然長\(l\), ばね定数\(k\)
の間の関係式を導出します。

結論として、マクロとミクロなばねの間に成り立つ関係は
\begin{eqnarray}
L&=&N l \\
M&=&N m \\
K &=& k/N
\end{eqnarray}
となります。

自然長

自然長\(L\)の弦を\(N\)分割するので、
\begin{equation}
L=N l
\end{equation}
の関係があります。

重さ

重さ\(M\)の弦を\(N\)分割するので、
\begin{equation}
M=N m
\end{equation}
と書けます。

ばね定数

最後にばね定数の関係を考えましょう。この関係は、弾性エネルギーを考えることで導くことができます。
マクロなばねとして全体を見た場合に長さ\(D\)だけ縮んだ時に蓄えられる弾性エネルギーと
同じだけ縮んだ時にミクロな\(N\)個のばねに蓄えられる弾性エネルギーが同じであってほしいと要請します。すなわち、ミクロなばねの縮みの合計がマクロなばねの縮み\(D\)に等しいとすると、
\begin{equation}
D=N d
\end{equation}
と書けます。
実は、大胆な過程をしないとマクロなばねとミクロなばねの関係を求めることが出来ません。
なぜなら、マクロなばねはいつでも線形応答をするかのように現在考えていますが、ミクロなばねでは場所ごとに違っても良いという様に定式化しています。なのでもともと無理な話なのです。
ではどうやって妥当な関係式を導出すればよいかといえば、ばねが非常にゆっくり運動が行われるときを仮定するのです。ゆっくり動くときの振る舞いは全てのばねが同じ動きをするとして差し支えないでしょう。そうして定式化します。
よって、
\begin{eqnarray}
\frac{1}{2}K D^2 &=& N\cdot \frac{1}{2} k d^2 \nonumber \\
\to ~~ K &=& k/N
\end{eqnarray}
という関係式が導けます。

あとは数値計算を行うだけです。陽的ルンゲクッタ法で解いたプログラムを以下に示します。

https://slpr.sakura.ne.jp/qp/supplement_data/wave_particles.tar.gz

実行は、

$ gfortran rkf45.f90 main.f90
$ ./a.out

でokだと思います。初期状態や、重さや自然長はinputファイルを見てください。

実行後、動画をgnuplot上で出力したければ、

$ gnuplot
$ call "movie.plt" 100

としてください。100は表示する時間ステップを表します。この引数の値の最大はinputファイルの中のNtまでです。

数値計算結果


実際に数値計算を行う条件として、自然長や重力があると波動方程式と若干異なる振る舞いになってしまうので、対応を見る上ではなくしています。すなわち、自然長\(L=0\)、重力\(g=0\)として計算します。

三角パルス

三角形の波がパルス状に存在するとします。
そして初期状態として、初速度がゼロであることを仮定しましょう。

この場合、波動方程式の考察から、
同じ関数であらわされる右向きの波\(f(x-vt)\)と左向きの波\(f(x+vt)\)の重ね合わせとして書かれることが分かっています。すなわち、解\(y=y(x,t)\)は
\begin{equation}
y(x,t)=f(x-vt)+f(x+vt)
\end{equation}
と書かれます。図で表せば以下のように時間発展していくことが期待されます。

これが本稿の連成振動モデルで実際にそうなっているのかを確かめるのは良い問いかけでしょう。
実際に連成振動を数値的に解くと以下の通りになります。

ゆっくりと時間発展を見ていくと

となります。明らかに右向きに進む波と左向きに進む波として分離します。分離した結果から、初期状態がそれらの波の重ね合わせで表現されていたことが分かるでしょう。

矩形パルス

矩形パルスを考えてみます。実際に数値計算をするとこんな感じです。

結局右向きと左向きの重ね合わせとしてあらわされることも確認できますが、決して単純なそれらの足し合わせで書かれているわけではないことがわかります。この振る舞いは、波動方程式に対応するように連成振動モデルを作っていないことから由来します。波動方程式としてあらわした二階微分の偏微分方程式の場合は多価関数をとることができません。なので縦に弦が伸びる場合、間に質点を置くことができないので質点の位置がいきなり飛ぶことになります。しかし、連成振動モデルではその制約をして初期状態を準備しているわけではありませんのでその違いが出て来ます。図で表せば、以下のようになります。

両者の違いがあるので、波動方程式の結論である
\begin{equation}
y(x,t)=f(x-vt)+f(x+vt)
\end{equation}
が成り立っていない、と解釈することができます。

少しずつ時間発展をみるとこの通りになります。

三角形の波

端まで三角形のパルスであった場合にどのように振る舞うかを見てみましょう。特に面白い振る舞いがあるわけではなく、上のパルスの、右向きと左向きの波の重ね合わせで説明ができるので、単にシミュレーション結果を載せるだけにとどめます。実際に計算してみると以下のようになります。

星形

初期状態が星型である場合も見てみましょう。振る舞いも同じです。

注意点としては、実際にこの振る舞いは起こりえないことに注意しておきましょう。なぜなら、本当の弦で行った場合、重なる場所があると弦の衝突が起こります。しかし、この連成振動モデルでは計算上、衝突は起こりません。

偏りがある三角形のパルス

偏りがある場合も波動方程式では記述することができません。こんな感じの初期状態です。

これを実際にシミュレートすると以下の通りになります。

3次元の場合

3次元の場合も載せておきます。ふるまい自体はそんなに変わるわけではないので、シミュレーション結果を載せるだけにとどめておきます。

複素関数の微分と積分

複素関数論のメモです。

  1. 微分
  2. 積分
  3. 参考文献

微分


コーシー・リーマンの関係式(まとめ)


複素関数がコーシー・リーマンの関係式を満たすと、その複素関数は通常の変数通りに微分することが出来ます。複素数\(z=x+iy\)を引数に持つ複素関数\(f(z)=f(x+iy)\)が、実数値関数\(u(x,y), v(x,y)\)を用いて

と書けているとき、コーシー・リーマンの関係式

を満たすならば、\(f(z)\)は正則関数と呼ばれます。ここで、
\(f_x(x,y)=\frac{\partial f}{\partial x}, f_y(x,y)=\frac{\partial f}{\partial y}\)を意味します。式(2)を満たす場合、複素関数\(f(z)\)の複素数\(z\)による微分は

と書くことができ、式(3), (4)は同じ値となります。

コーシー・リーマンの関係式(導出)


複素関数の引数の数は1つであり、それは複素数です。すなわち1変数関数です。故に、複素関数の微分を定義しようとすれば、
\begin{align}
\frac{df(z)}{dz}
\end{align}
という量は1つに定まるはずです。しかし実数の空間で生活している我々には、1つの複素数を実部と虚部に分けて考えてしまう癖のようなものがあります。そのせいで、複素関数は平面に記述される関数であり、実部方向と虚部方向をそれぞれ独立に考えることが出来る2変数関数だと勘違いしてしまいますが、そうではありません。

すなわち、2変数の実数値関数と1変数の複素関数は全く異なる関数であり、同じ様に扱ってはいけません。しかし、我々は1次元上に複素数を表現する方法を持っておらず、本来、1変数の複素関数を2変数の実数値関数のように表現しなければイメージすることが出来ません。この場合、複素関数の表現に何らかの制約がかかることがイメージできるでしょう。その制約が正則である、という条件であり、コーシー・リーマンの関係式なのです。

では実際に本来1変数関数の複素関数を実軸と虚軸という、あたかも2変数関数のように拡張して考えて、微分を考えてみましょう。

前提として、複素関数の微分
\begin{align}
\frac{df(z)}{dz}
\end{align}
は一意に定まるとします。この下で2変数関数として\(f(z)=f(x,y)\)を拡張した場合、微分したい点への近づき方が二通りあることに気が付きます。それは、\(x\)方向と\(y\)方向ということです。2変数関数であれば、偏微分の事です。どんな方向から近づいても微分値は一意に定まると考えているので、両結果は等しくなければなりません。
微分は実数値関数と同様に差分の極限として定義して、
\begin{align}
\frac{df(z)}{dz}\equiv \lim_{\Delta z\to 0}\frac{f(z+\Delta z)-f(z)}{\Delta z}
\end{align}
と書けるとします。ここで、\(\Delta z = \Delta x+i\Delta y\)を意味しており、\(\Delta x, \Delta y\)は実数です。

点\(z=(x, y)\)に実数軸に沿って近づく場合、\(\Delta y=0\)を考えればよいので、微分は差分の極限として
\begin{align}
\frac{df(z)}{dz}=\lim_{\Delta x\to 0}\frac{f(x+\Delta x,y)-f(x,y)}{\Delta x}
\end{align}
と書かれます。ここで\(h\)は実数です。また、虚数軸に沿って近づく場合\(\Delta x=0\)を考えればよいので、
\begin{align}
\frac{df(z)}{dz}=\lim_{\Delta y\to 0}\frac{f(x,y+\Delta y)-f(x,y)}{i\Delta y}
\end{align}
と書かれるはずです。複素関数の微分は一意に決まることから、二つの近づき方を考えたとしても一致していなければなりません。複素関数が\(f(z)=u(x,y)+iv(x,y)\)と実部と虚部があらわに分離されて書かれていたとするならば、
\begin{align}
&\lim_{\Delta x\to 0}\frac{f(x+\Delta x,y)-f(x,y)}{\Delta x}\
&=\lim_{\Delta x\to 0}\frac{[u(x+\Delta,y)+iv(x+\Delta,y)]-[u(x,y)+iv(x,y)]}{\Delta x} \
&=\lim_{\Delta x\to 0}\frac{[u(x+\Delta,y)-u(x,y)]+i[v(x+\Delta,y)-v(x,y)]}{\Delta x} \
&=\frac{\partial u}{\partial x}+i\frac{\partial v}{\partial x} \
\end{align}
と書けます。また、虚軸方向は
\begin{align}
&\lim_{\Delta y\to 0}\frac{f(x,y+\Delta y)-f(x,y)}{i\Delta y}\
&=\lim_{\Delta y\to 0}\frac{[u(x,y+\Delta y)+iv(x,y+\Delta y)]-[u(x,y)+iv(x,y)]}{i\Delta y} \
&=\lim_{\Delta y\to 0}\frac{-i[u(x,y+\Delta y)-u(x,y)]+[v(x,y+\Delta y)-v(x,y)]}{\Delta y} \
&=-i\frac{\partial u}{\partial y}+\frac{\partial v}{\partial y}
\end{align}
と書くことが出来ます。
両者はもともと同じものであるとしてきましたから、実部と虚部で比較します。
すると、

という関係式が導けるという訳です。これがコーシー・リーマンの関係式と呼ばれるもので、1変数関数の複素関数を実部、虚部という2変数関数に無理矢理拡張した場合に現れる条件です。
複素関数の微分が定義できるとき、複素関数の実部虚部は、この関係式を満たしていなければなりません。ある範囲においてすべての点で複素関数の微分が定義できることを、正則であると言ったり、滑らかである、解析的であると言います。
”複素関数の滑らか”は通常の”滑らか”と意味が異なることに注意しましょう。通常は不連続点が無いことを指しますが、複素関数の場合はそれ以上の制約(コーシー・リーマンの関係式)を含んでいます。

また、ここでは述べませんが、複素関数は1度微分できると何回でも微分することが出来ます。
さらに微分が定義できる正則関数であれば定義域を超えた領域へ関数が拡張できる場合があります。これが解析接続と呼ばれるテクニックです。コーシー・リーマンの関係式を制約として今まで捉えてきたのですが、この制約があるからこそまだ見ぬ定義域外をこの関係式を手掛かりに関数を拡張できるのです。

例として、究極的に滑らかそうに見えるけど微分できない関数を上げましょう。
\begin{align}
f(z)=z=x+iy
\end{align}
はコーシー・リーマンの関係式を満たすため、複素関数として微分が定義でき、正則です。しかし、その複素共役を取った関数
\begin{align}
f(z)=z^*=x-iy
\end{align}
はコーシー・リーマンの関係式を満たさないため、複素関数として微分が定義できず、正則ではありません。近づき方によって微分の値が変わってしまうのです。

通常の微分が可能という意味を明確にするため、例を挙げます。\(f(z)\)が\(z\)の多項式で書かれている場合、微分は

として求める事が出来ます。通常と同じですね。これは、複素数の成分を持たない場合には実軸上で考えたものと同等になるので、実数軸上の微分を自然に拡張したようになっています。

積分


特異点周りの積分


端的にまとめます。
点\(a\)を囲うように複素平面上の閉じた積分経路の方向を\(C\)で指定するとします。\(z\)の多項式で表現される関数\(f(z)=(z-a)^n\)の積分は、

となります。点\(a\)の周りを反時計回りに1周回る場合、\(C\)はパラメータ\(t\)を用いて\(z(t)\)と書くと、
\begin{align}
z(t)=a+re^{it},~(0\le t \le 2\pi)
\end{align}
と書けます。\(r\)は積分経路の半径を意味します。式(6)の計算をすれば、

となります。\(n=-1\)の時、右辺の積分は\(2\pi\)に等しい事は明らかです。それ以外の\(n\ne -1\)ならば、

となります。よって、

が導かれます。

留数定理


一つ前の、ある点周りの積分をもう少し一般的に考えましょう。\(z=a\)を中心とした閉曲線に沿った複素関数\(f(z)\)の複素積分\(\oint_C f(z)dz\)は

と書けます。ここで\(\text{Res}[f,a]\)は留数と呼ばれる量です。これから留数について述べていきます。

\(\text{Res}[f,a]\)は、\(f(z)\)が点\(a\)周りで

とローラン展開出来るとします。この時、\(a_{-1}\)を留数と呼びます。すなわち、

を意味します。

では、留数を実際に求めていきましょう。\(f(z)\)が点\(a\)周りでローラン展開可能な場合、\(n\)の下限が重要になります。下限を極の位数\(k\)と表現します。\(k\)は、

を満たすときの値として定義できます。

もし、関数\(f(z)\)が\(z=a\)で\(k\)位の極であれば、\(z=a\)周りで

と展開できます。
留数は\(a_{-1}\)なので、\(a_{-1}\)について式変形を行っていけば、

と計算できます。

参考文献


原惟行、松永秀章著、『複素解析入門』(第3刷2010, 初版2007)

流速チューン?設定におけるホップ量と初速の変化

流速チューンと呼ばれるエアガンのチューニングがあるそうですね。

流速チューンとは
 ・重いピストンヘッドを使う
 ・強いばねを使う
 ・短いバレルにする
というチューニングを行う事のようです[1]。この結果、
 ・ホップを掛けるほど初速が上がる
 ・破裂音が鳴る
という効果が得られるらしいです。これらの効果を物理的な言葉に置き換えます。

「ホップを掛ける」ということは、BB弾がホップを掛ける為のゴムの所で止まりそこを抜けるために力が必要、ということです。
すなわち、内圧がある程度高まらないと動き出さないということを意味します。
「破裂音が鳴る」ということは、射出時に外気圧と内圧の差が大きいことを意味します。
また、短いバレルにするのは初速が上がりすぎるためだそうです。

以上の振る舞いがシミュレーションで再現できるでしょうか。
グラフの横軸を射出に必要な内圧にとり、バレル長を10cmに設定した時の射出速度と射出時の内圧をプロットしたのが以下の図です。

確かによく言われている通り、BB弾が動き出すまでに力が必要なほど(ホップを掛けるほど)、初速が上がる振る舞いが再現できています。
ある程度のホップの強さからは頭打ちになるようです。このある程度の強さが実際のエアガンで掛けられる強さなのかはわかりません。
射出時の内圧も3気圧と非常に高くなります。外気圧は1気圧なので、これだけ差があれば破裂音が鳴るのも納得でしょう。

流速チューン?のパラメータ設定は以下の通りです。通常の設定と比べ、ピストンヘッド+ばねの重さを22→30g, ばね定数を431→800kg s-2に変更しました。
————————-
BB弾直径 5.95mm
BB弾重さ 0.25g
バレルの直径 6.05mm
バレル長 10cm
シリンダー直径 24mm
ピストンヘッド+ばねの重さ 30g
ばね自然長 150mm
ばね定数 800kg s-2
————————-
流速チューンだ!と言っている方々のブログ等を拝見しましたが、なかなかばねの強さやピストンヘッドの重さ等を詳細に詳しく述べているページはありませんでしたので、上記パラメータはなんとなく設定しています。
また、流速チューン?とはてなマークを付けているのは、具体的なパラメータ例が無いことや、定義が個人によって違うからです。

追記)
通常のばねや、ピストンヘッドの重さでもホップを掛けるほど初速が上がるという傾向は変わらないことが分かりました。
すなわち、上記の傾向はバレル長が短いことによる普遍的な傾向だ、ということです。バレルが短ければホップを掛けるほど初速が上がる、という意味です。

上の計算は以下のパラメータで計算を行いました。
————————-
BB弾直径 5.95mm
BB弾重さ 0.25g
バレルの直径 6.05mm
バレル長 10cm
シリンダー直径 24mm
ピストンヘッド+ばねの重さ 22g
ばね自然長 150mm
ばね定数 431kg s-2
————————-

以上の計算は、下記ページで配布しているエクセルシート(ver1.3以降)にて計算することが出来ます。
弾道計算のコード(Excel)

参考資料


[1]流速チューンの原理と製作例、注意点

弾道計算のコード(Excel)

Excelのマクロ(VBA)で弾道計算を行うコードを作成しました。

https://slpr.sakura.ne.jp/qp/supplement_data/BBullet_course_excel/BBbullet_course_ver1.41.xlsm
上記プログラムの利用の際は連絡先と著作権についてをご覧ください。

空気抵抗を修正したβ版を作成しました。参考設定は機能しません。
https://slpr.sakura.ne.jp/qp/supplement_data/BBullet_course_excel/BBbullet_course_ver1.5_beta.xlsm

以下の微分方程式を計算します。

エクセルシート”bullet”
\(
\begin{align}
m\frac{d^2 \vec{r}}{dt^2}&=
-mg\vec{k}-\frac{1}{2}C_d \rho \pi R^2 |\vec{V}|\vec{V}
-C_l \frac{4}{3}\pi R^3 2\rho |\vec{\omega}| |\vec{V}|\frac{\vec{V}\times\vec{\omega}}{|\vec{V}\times\vec{\omega}|} \\
\frac{d\mathbf{\omega}}{dt}&=N/I \\
N&=\frac{\rho C_f}{2}R\frac{4\pi R^2}{2}\left(|v_{up}|v_{up}+|v_{down}|v_{down}\right)
\end{align}
\)
回転の減衰は本来、弾道計算(BB弾)の理論で導いた通り積分を行わなければなりませんが、簡単にするためにBB弾を真四角の箱として近似して導いています。
この近似は本来の積分値と1パーセント程度の違いしか出てこないので、BB弾の計算には非常に良い近似です。
回転の減衰を取り入れたくない場合、入力パラメータの”回転の減衰”項目をNOにすることでそのように設定が出来ます。
ゼロインを固定した時の弾道の探索機能は実装していないので出来ません。
Excelの設定項目では、Fortranで実装したコードから求めたパラメータをあらかじめ用意しておきました。
設定されたものと書いてあっても、高精度に積分計算をして求めた結果と上の近似をもちいた本エクセルの結果は違くなります。数10cm程度のずれは出てきますので、その点は注意してください。

エクセルシート”barrel”
\(
\begin{align}
m\frac{d^2}{dt^2}x(t)&=\left[P(t)-P_0\right]S_{BB}-\frac{1}{2}C_d \rho \pi R^2 |v(t)|v(t) \\
m_s\frac{d^2}{dt^2}x_0(t)&=-k\left[x_0(t)-x_B-l\right]-[P(t)-P_0]S_s -F_f\label{bbin2} \\
\frac{d}{dt}V(t)&=v(t)S_{\text{barrel}}-v_0(t)S_s+c'(S_{barrel}-\pi R^2)\mathrm{sgn}(P(t)-P_0)\sqrt{\frac{2}{\rho}|P(t)-P_0|}
\end{align}
\)

内部は以下の構造をしていると想定しています。詳細はバレル内部でのBB弾の方程式をご覧ください。

計算手法はどちらも陽的4次ルンゲクッタ法を用いています。

使い方


  1. ファイルのダウンロード
  2. 最新
    https://slpr.sakura.ne.jp/qp/supplement_data/BBullet_course_excel/BBbullet_course_ver1.5_beta.xlsm

    をクリックでダウンロード、もしくは
    右クリックして、”名前を付けてリンク先を保存”からダウンロードしてください。

  3. 計算パラメータの入力
  4. 入力する場所は、色付きのセルです。

    • 弾道計算について

    • 出力結果は大きく分けて2つの項目に分かれています。
      1つ目は定数、射出高さに着弾、地面に着弾の項目は重要と思われるパラメータの抜粋、2つ目は弾道の時間ごとのデータです。
      グラフは、2つ目のデータを元に表示しているだけですので、必要に応じて追加、変更を行ってください。

    • バレル内部の計算について

    • 出力結果は大きく分けて2つの項目に分かれています。
      1つ目は定数、内圧が大気圧に等しい時に射出される時と指定したバレル長におけるパラメータの抜粋、2つ目はBB弾、ピストンの位置、速度の時間ごとのデータです。
      グラフは、2つ目のデータを元に表示しているだけですので、必要に応じて追加、変更を行ってください。

    手入力で入力することも可能ですが、参考設定と書かれたボタンを押すことで、予め設定されたパラメータを読み込ませることもできます。

  5. 計算開始
  6.   入力パラメータを入力した後、計算開始ボタンを押すことで計算が開始されます。

注意点

常識的なパラメータの範囲内でしか動作確認をしておりません。
この結果はあくまで一例です。本シミュレーションを信用して設計・組立を行い、本シミュレーションと結果が違う事があります。その場合私は責任を負いませんので、その点をご了承して使用してください。
BB弾で出来るからと言って、銃弾等の計算はそれなりの信用しかできないことを考慮してください。

追記


バレル内部の計算において、抜弾抵抗の考慮はしていません。すなわちホップが全く掛かっていない状況の計算です。
もし、ホップを掛けた状況を再現したいのであれば、以下のような考えで出来るでしょう。

まず、ホップを掛けた状態でBB弾をバレル内部から引き出す際に必要な力をどうにかして実験的に求めます。
このホップを掛けた際に必要な力\(F\)は、内部圧力\(P\)とBB弾の面積\(S_{BB}\)を用いて
\(
F=PS_{BB}
\)
と書けるはずです。すなわち、内圧がこの力に達した時にBB弾が射出されるとして考え、その内部圧力に達した際にBB弾の運動方程式を解き始める、という方法で可能なはずです。

参考文献

[1] 弾道計算の理論 -シキノート https://slpr.sakura.ne.jp/qp/bullet-course/
[2] BB弾の弾道学 -ハイパー道楽 http://www.hyperdouraku.com/colum/ballistics/index.html