2004.4.14 OKADA
実験 III 計算機 第 4 回
第3回 常微分方程式
常微分方程式の初期値問題の数値解法であるオイラー法とルンゲ−クッタ法を学び、
シミュレーション計算へ応用することを目的とする。
1.常微分方程式の数値解法
1−1.オイラー法(Euler 法)
常微分方程式の初期値問題を数値的に解く方法の1つにオイラー法がある。微分方程式が次式 のように与えられているとする。
) , ) (
( f t x
dt t
dx = ; x ( t
0) = x
0(1-1)
解析的には次のように解くことができる。
) ( ) ( )
, ( )
( ) ) (
(
0 0 0 0
t F t F dt x t f t
x t x dt dt
t
dx
tt t
t
= − = ∫ = −
∫
) ( ) ( )
( t x
0F t F t
0x = + −
∴ (1-2)
つまり時刻
t
でのx (t )
を求めるには与えられた関数f ( t , x )
の時間積分F (t )
を求める必要がある。これを如何にして行うかが初期値問題の課題である。
オイラー法では関数
x (t )
のテーラー展開の1次までの項を考慮する。h = t
1− t
0が非常に短い時 間ステップであるとすると、次のステップx ( t
1) = x ( t
0+ h )
に対してテーラー展開による近似が得 られる。) ( ) ( ' ) ( )
( t
1x t
0x t
0t
1t
0x ≅ + × − (1-3)
) (
11
x t
x ≡
とし、(1-1)式を使うと)
, (
0 00
1
x h f t x
x ≅ + (1-4)
と表せることがわかる。この式は時間ステップ
h
が非常に短ければ、前の時刻t = t
0における関数)
, ( t
0x
0f
の値から、次の時間ステップt
1= t
0+ h
でのx ( t
1)
が近似的に求められることを示してい る。(1-4)式を(1-2)式に代入してみると) , ( ) ( )
( t
1F t
0hf t
0x
0F − = (1-5)
が得られるが、これは
f ( t , x )
のF (t )
をhf ( t
0, x
0)
で近似していることを意味する。t x(t)
t
0t
1t
2h
図1−1.オイラー法
オイラー法を2回使えば2階の微分方程式の近似解も得られる。一般に「
h
」は微分方程式を積 分するときのステップと呼ばれる。オイラーによるx (t )
の求め方は理解しやすいが、精度があま りにも悪いため通常はもう少し高級なやり方を用いる。例えば次に説明するようなルンゲ−クッ タ公式がある(Runge-Kutta:人名に由来)。1−2.ルンゲ−クッタ法
オイラー法では関数
x (t )
のテイラー展開における1次の項までの近似を用いて、次のステップ におけるx
1を求めた。一方、4次のルンゲ−クッタ法ではテーラー展開のh
4の項までを計算する 代わりに、与えられた関数の計算を4
回行うことによって次ステップの計算を行う(すなわち、) (t
x
の高階の微分計算を行わないで、テイラー展開の4次の項まで考慮した計算をする)。この原理を理解するために2次のルンゲ−クッタ公式の導き方をみてみよう。
x
nを2次までテ ーラー展開すると) 2 (
1
'' 31 2 '
1
1
hx h x O h
x
x
n=
n−+
n−+
n−+ (1-6)
とかける。元の微分方程式から
)
,
(
1 11 '
1 − − −
−
=
n≡
n nn
f f t x
x (1-7)
である。また、
x (t )
の2階微分は2
'
2
''
f f x
dt dx x f t f dt
x
x d =
t+
x∂ + ∂
∂
= ∂
= ,
t f
tf
∂
= ∂ ,
x f
xf
∂
= ∂ (1-8)
であるから、(1-7), (1-8)式を(1-6)式に代入すると
O ( h
3)
を無視して[ ]
12 1
1
2
1
−
−
−
+ + +
≅
n n t x nn
x hf h f f f
x (1-9)
が得られる。ここで
[ f
t+ f
xf ]
n−1の添字n − 1
は、1つ前のステップでの計算値であることを示し ている。一方、
x
nをx
n−1と関数f
を使って次式のように表せると仮定してみる。
+ +
=
=
+ +
=
−
−
−
−
−
) ,
(
) , (
1 1 1
2
1 1 1
2 1 1
qk x
ph t
hf k
x t hf k
bk ak x
x
n n
n n n n
(1-10)
この式の
k
2をテーラー展開する。2変数のテーラー展開は∑ ∂ ∂ + ∂ ∂
= + +
n
n
y x y f x
y n x
f ( , )
! ) 1
,
( α β α β (1-11)
で与えられるから
( ) ( )
[
1 1 1 1] ( 3)
0
1
2
f h f ph f qk f O h
qk x ph t
h
k
n x n y nn
n
+ +
+
=
∂ + ∂
∂
= ∂
− − −∑
=(1-12)
となる。(1-10)式へ代入すると、
( ) ( )
[
1 1] ( 3)
2 1
2
hf h ph f q f f O h
k =
n−+
x n−+ ⋅
y n−+ (1-13)
となり、さらに(1-10)の第1式に代入し、
O ( h
3)
以上の項を無視すると]
) ( )
( [ )
(
1 2 1 11 − − −
−
+ + + + ⋅
≅
n n x n y nn
x a b f bh p f q f f
x (1-14)
となる。(1-9)と(1-14)式の両辺を比べると
2
/ 1 ,
2 / 1 ,
1 = =
=
+ b bp bq
a
となり、未知数4つで、方程式3つが得られる。1つの未知数を勝手に決めることができるから、
例えば
p = 1
とすると1 2 / 1
=
=
=
= q p
b
a (1-15)
と決まる。つまり2次のルンゲクッタ公式の1つは
(
1 2)
1
2
1 k k
x
x
n=
n−+ + (1-16)
) ,
(
1 11
= hf t
n−x
n−k (1-17)
) ,
(
1 1 12
hf t h x k
k =
n−+
n−+ (1-18)
と与えられることが分かった。なお、係数
p
のとり方によって別の公式も得られる。3次以上に ついても同様に計算を行って係数を決めることができる。4次のルンゲ−クッタ法の場合は、次 に示すような(1-19)~(1-24)式で与えられる。) , ) (
( f t x
dt t
dx = , (1-19)
) , (
0 01
h f t x
k = (1-20)
2 ) 2 ,
(
0 0 12
x k t h
f h
k = + + (1-21)
2 ) 2 ,
(
0 0 23
x k t h
f h
k = + + (1-22)
) ,
(
0 0 34
h f t h x k
k = + + (1-23)
) 2
2 6 ( 1
4 3 2 1 0
1
x k k k k
x = + + + + (1-24)
オイラー法では関数
x (t )
の傾き(即ち1階微分)を使って次ステップを求めるが、4次のルンゲ−クッタ法では仮の中点を含む4点での関数値を使って次ステップの
x (t )
を求めている。1−3.連立微分方程式・高階微分方程式の解法
1階の連立微分方程式を解くためには、並列に
4
次のルンゲ−クッタ公式を用いればよい。初 期値としては( t
0, x
0, y
0)
を与える。) , , ) (
( f t x y
dt t
dx = , ( ) ( , , )
y x t dt g
t
dy = (1-25)
) , , (
0 0 01
h f t x y
k
x= : k
y1= h g ( t
0, x
0, y
0) (1-26)
2 ) 2 ,
2 ,
(
0 0 1 0 12
x y x
y k x k
t h f h
k = + + + : )
, 2 , 2
(
02
0 1 0 12
x y y
y k x k
t h g h
k = + + + (1-27)
2 ) 2 ,
2 ,
(
0 0 2 0 23
x y x
y k x k
t h f h
k = + + + : )
, 2 , 2
(
02
0 2 0 23
x y y
y k x k
t h g h
k = + + + (1-28)
) ,
,
(
0 0 3 0 34 x y
x
h f t h x k y k
k = + + + : k
x4= h g ( t
0+ h , x
0+ k
x3, y
0+ k
y3) (1-29)
) 2
2 6 (
1
4 3 2
1 0
1
x k
xk
xk
xk
xx = + + + + : ( 2 2 )
6 1
4 3 2 1
0
1
y k
yk
yk
yk
yy = + + + + (1-30)
2階の微分方程式を解くには4次のルンゲ−クッタ公式を
2
回適用すればよい。例えば次式の ように2階の微分方程式が与えられているとする。) , , ) ( (
2 2
v x t dt f
t x
d = , x ( t
0) = x
0, v ( t
0, x
0) = v (1-31)
公式を適用できるようにするため、2階微分方程式を2つの1階微分方程式に書き換える。
) , , ) (
( v
v f t x dt
t
d = , x ( t
0) = x
0(1-32)
= v dt
t dx ( )
, v ( t
0, x
0) = v
0(1-33)
(1-32), (1-33)式は1階微分方程式の初期値問題であるから、4次のルンゲ−クッタ法を適用でき
る(次の1−4節を参照)。右辺の関数f ( t , x , v )
とv
は、同じ時刻で計算する必要がある。1−4.ルンゲ−クッタ法の応用例
単振動の問題を4次のルンゲ−クッタ法で求めてみよう。
0 ) 0 ( ' , 1 ) 0 ( ), ) (
(
22 2
=
=
−
= x t x x
dt t x
d ω (1-34)
この微分方程式をルンゲ-クッタ法によって解くプログラムは下のようにかける。
Mians上のコマンドボタン Testに入力 Private Sub cmdTestRK4_Click()
Dim x#, vx#
Mains.Cls
sh = Mains.ScaleHeight : sw = Mains.ScaleWidth
h = 0.0001 'ルンゲ−クッタ法の計算のステップh
w = 2# '角振動数ω=2 [Hz rad]
tmax = 20# '計算する時間の最大値t = 20(秒)
nmax = Int(tmax / h) '計算の最大ステップ数
ft = 800: fx = 800 '表示のための 倍率(適宜変更する)
'---初期条件の入力(変更可能)---
x = 1#: vx = 0#
'---
'----座標軸の表示(初め)---
Mains.Line (0, sh / 2)-(sw, sh / 2) '横軸(時間t)
Mains.Line (sw / 20, 0) -(sw / 20, sh) '縦軸(座標x)
dt = 1# '横軸tの目盛り間隔
For i = 1 To 81
Mains.Line (sw / 20 - ft * (dt * (i - 1) - tmax), sh / 2 - sh / 100) -(sw / 20 - ft * (dt * (i - 1) - tmax), sh / 2 + sh / 100) Next i
dx = 0.5 '縦軸の目盛り間隔
For i = 1 To 41
Ma ins.Line (sw / 20 - sw / 100, sh / 2 - fx * (dx * (i - 1) - 10))-(sw / 20 + sw / 100, sh / 2 - fx * (dx * (i - 1) - 10)) Next i
'----座標軸の表示(終り)---
'----単振動の計算(初め)--- For i = 1 To nmax
DoEvents '表示を滑らかにするためのオプション(計算は遅くなるが表示が見やすい)
Call testRK4(x, vx) 'ルンゲクッタ 公式を呼び出す
t = h * i '時間を進める
Mains.PSet (ft * t + sw / 20, -fx * x + sh / 2), RGB(255, 0, 0) '結果のグラフ表示 Next i
'----単振動の計算(終り)--- End Sub
4次のルンゲ−クッタ公式のプログラムは標準モジュールに入力する。標準モジュールの利用 法は第3回(付録A)を参照すること。プログラムの内容を理解するために、実際に入力して結 果を確かめてみること。分からない点があれば必ずTAに質問すること。
時間が許せば次のことも試みよ。
① 刻み幅
h
を細かく、又は粗く設定すると結果がどうなるか?②初期条件を変えるとどうなるか?
③振動数を変える、関数を変更してみる。
標準モジュールに入力 *標準モジュールについては付録を参照。
Public t#, w#, h# ‘共通変数の定義
Public Sub testRK4(x#, v x#) '4次のルンゲクッタ 公式(単振動計算用) a1 = h * fv(vx)
b1 = h * fex(x)
a2 = h * fv(vx + a1 / 2) b2 = h * fex(x + b1 / 2)
a3 = h * fv(vx + a2 / 2) b3 = h * fex(x + a2 / 2)
a4 = h * fv(vx + a3) b4 = h * fex(x + b3)
x = x + (a1 + 2 * (a2 + a3) + a4) / 6 vx = vx + (b1 + 2 * (b2 + b3) + b4) / 6 End Sub
Public Function fv#(v#) fv = v
End Function
Public Function fex#(x#) fex = -w ^ 2 * x End Function
2.イオントラップのシミュレーション
2−1.イオントラップとは?イオントラップとは電磁場によって荷電粒子(イオンや電子)を空間の狭い領域に閉じ込める 実験装置の総称で、原理の違いにより様々な種類の装置がつくられている。原子・分子の精密測 定、プラズマ物理、化学反応の研究、量子計算機実験など、様々な物理・化学の分野で応用され ている。イオントラップには大きく分けて次の2つのタイプがある。
① 交流電場によってイオンを閉じ込める
rf
イオントラップ(rf: radio frequency)② 静磁場と静電場によって閉じ込めを行うペニングトラップ(Penning:人名)
ここでは①の原理によって動作する「線形
rf
イオントラップ」とよばれる装置の原理を説明する。線形
rf
イオントラップでは、イオンを閉じ込めるための四重極電場を作るために図2−1のよ うに円柱電極を配置して、そこにラジオ周波数領域(100kH~10MHz程度)の交流電圧をかける。図2−1右側のような電圧を電極に印加すると、中心付近の
xy
方向電位は近似的に2 0
2
2
)
) ( ,
( r
y x y V
x = −
φ (2-1)
と表せる。
2r
0は対向する電極間の距離に相当している。Uz Uz
2r0
交流電圧 (Ω, Vac)
接地
断面図(xy方向)
y x
+V +V
−V
−V
図2−1.線形rfイオントラップの構造と電位の設定。実際の電極の大きさは図と同程度(数cm)である。
電磁気学で学んだ
Earnshow
の定理によると、ラプラス方程式∇
2φ = 0
を満たす電位は境界を 除く領域内部で極大または極小を持たないため、静電場だけでは3次元空間でのイオンの閉じ込 めを行うことはできない。そこで電圧V
を交流電圧と静電圧の和で置き換える:2 0
2
2
)
)(
cos ) (
,
( r
y x t V
y V
x
dc acxy
− Ω
= −
φ . (2-2)
一方、z方向については図2−1のように電極を3分割し、両側電極に静電圧
U
zをかけること によってポテンシャルの井戸を生成し、イオンの閉じ込めを行う。電圧U
zによる中心付近の電位 は、ラプラス方程式を満たす次式のような調和ポテンシャルで近似できる。
− +
= 2
) 2 , , (
2 2 2 2 0
y z x
z U z q
y
x
i zφ
z(2-3)
ここで
q
iはi
番目のイオンの電荷、U
zはz軸方向電圧、z
0は電極の幾何学的配置によって決ま る定数である。与えられたポテンシャルφ ( x , y , z ) = φ
xy+ φ
zから電場を求め、イオンについて運動 方程式をたてるとz x m
U x q
r m
t V
V q dt
x d
i z i i
ac dc i i
2 0 2
0 2
2
2 ( cos ) 2
Ω +
= − (2-4)
z y m
U y q
r m
t V
V q dt
y d
i z i i
ac dc i i
2 0 2
0 2
2
2 ( cos ) 2
Ω +
− −
= (2-5)
z z m
U q dt
z d
i z i i
2 0 2
2
4
−
= (2-6)
が得られる。これは2階の連立微分方程式であるから初期条件さえ与えれば4次のルンゲ−クッ タ公式によって解くことができる。
2−2.イオンをトラップするための条件
電極内部のイオンは前節で求めた運動方程式に従って運動をするが、どのような条件でもイオ ンをトラップできるというわけではない。z方向はポテンシャルが調和型なので常に中心力が働 き、イオンの閉じ込めが可能である。一方、
xy
方向の閉じ込めを行うためには、ある決まった交 流周波数と電圧が必要である。そこで、次にイオンをトラップするための条件を調べてみよう。
U
zがあまり大きな電圧でなければ、(2-4), (2-5)式の右辺第二項の影響は小さい。そこで(2-4), (2-5)式を次のように書き換える。
r x m
t V
V q dt
x d
i ac dc i i
2 0 2
2
≅ 2 ( − cos Ω ) (2-7)
r y m
t V
V q dt
y d
i ac dc i i
2 0 2
2
2 ( − cos Ω )
−
≅ (2-8)
この微分方程式は無次元のパラメータ
2 0 2 2
0 2
, 4 8
r m
V q q
r m
V
a q
i dc i ac= Ω
= Ω
(a, q
:トラップパラメータ),2 Ω t
=
τ (2-9)
を導入することによって、次のような微分方程式に変形できる。
0 ) 2 cos 2
2
(
2
+ a − q X =
d X
d τ
τ ( 2 -10)
0 ) 2 cos 2
2
(
2
+ − a + q Y =
d Y
d τ
τ ( 2 -11)
この方程式はマシュー方程式(Mathieu equation)と呼ばれ、数学の分野において解の安定性が よく調べられている。結論をいうと、図2−2の4本の線の内側にトラップパラメータ
( q , a )
を 設定すれば、振動解(安定な解)が得られる。すなわちイオンをトラップ電極内部に閉じ込める ことができる。線の内側部分をイオントラップの安定領域と呼ぶ。<パラメータの計算例 >
炭素の1価イオン(12C+)を例にとってトラップ 条件を計算してみよう 。ここではトラップ電極、交流電圧 に 関するパラメータを以下のように 固定する。
電極のパラメータ:
r
0= 3 . 5 ( mm) = 3.5 × 10
-3( m), z
0= 10 mm = 10
-2( m)
交流周波数:
Ω = 2 π × 5 ( MHz) = 3.14 × 10
7( rad/s)
12C+イオンに関する定数は
(kg) 10
0 . 2 /
10 12 m
C) ( 10 602 . 1
26 3
i
19
−
−
−
×
=
×
≅
×
≅
A i
N q
と計算できるので、(2-9)式から ac
dc
q V
V
a = 0 . 0053 , ≅ 0 . 0027
となる。例えば、トラップの安定領域内部にある
2 . 0 ,
0 =
= q a
に設定するための電圧は
) V ( 74 ),
V (
0 =
=
acdc
V
V
と求められる。
-0.4 -0.3 -0.2 -0.1 0 0.1 0.2 0.3 0.4
0 0.2 0.4 0.6 0.8 1
線形rfイオントラップの安定領域
a
q
図2−2.線形イオントラップの安定領域
2−4.シミュレーションプログラムの作成
ここでは4次のルンゲ−クッタ法を使って2階連立微分方程式(2-4)~(2-6)式を解くプログラム を作成し、イオントラップに閉じ込められたイオンが運動する様子(軌道)を表示させることを 目標とする。
1−3節で述べたように2階の微分方程式は2つの
1
階の微分方程式に分けられる。また、連 立微分方程式はルンゲ−クッタ法を並列に適用することで解を求められる。そこで(2-4)~(2-6)を 以下のように書き換える。x x
i z i i
ac dc i x
x x
dt x dx
z m
U x q
r m
t V
V x q
t f x t
dt v = f = 2 ( − cos Ω ) + 2 − v , = v
) , ( ), ,
(
20 2
0
d γ
(2-12)
y y
i z i i
ac dc i y
y y
dt y dy
z m
U y q
r m
t V
V x q
t f x t
dt v f v v
=
− Ω +
− −
=
= 2 ( cos ) 2 ,
) , ( ), ,
(
20 2
0
d γ
(2-13)
z z
i z i z
z z
dt z dz
z m
U z q
f z
dt v = f = − 4 − v , = v
) ( ),
(
20
d γ
(2-14)
ここではイオンの速度に比例した抵抗力
− γ v
x, − γ v
y, − γ v
zの項を追加した。γ ≠ 0
ならイオン は冷却されていく(振動が減衰する)。γ = 0
としておけば(2-4)~(2-6)と全く同じ方程式である。この問題にうまく合うように書かれた4次のルンゲ−クッタ法のサブプログラムを以下の
「cmdIonTrap」及び「rk4( )」に与えた。rk4( )のカッコの中に「引数」があることに注意する。
プログラムの利用方法についてはテストプログラム
cmdRunRK4( )を参考にすること。
プログラム「rk4( )」と「cmdIonTrap」は入力ミスを避けるために「jikken3」フォルダの中の「Runge」
フォルダの中のテキストファイル「rk4.txt」及び「IonTrap.txt」に与えた。メモ帳ファイルを開 いてからコピーし、標準モジュールまたはコマンドボタンに貼り付けること。
Mians上のコマンドボタン IonTrapに入力 Private Sub cmdIonTrap_Click()
Dim r#(20, 3), v#(20, 3), j%, x#, y#, z#, vx#, vy#, vz# ‘計算で必要な変数を宣言
Mains.Cls ‘フォームMainsのクリア
sh = Mains.ScaleHeight ‘フォーム「Mains」の幅
sw = Mains.ScaleWidth ‘フォーム「Mains」の高さ
gamma=0 ‘速度に比例した抵抗力の係数γ
tmax = Val(Mains.txttmax) * 10 ^ -3 ‘計算時間の最大値をテキストボックスで入力(ミリ秒単位)
h = Val(Mains.txth) * 10 ^ -9 ‘計算のステップ幅hを テキストボックス で入力(ナノ秒単位)
nmax = Int(tmax / h) ‘計算の最大ステップ 数
m = 0.012 / NA ‘炭素イオンの質量(kg)
Vac = 74#: Vdc = 0: Uz = 5# ‘電圧の設定
'---イオン運動の初期条件 の入力(変更可能)--- r(1, 1) = -0.00001: r(1, 2) = -0.00001: r(1, 3) = 0.00001 ‘(x, y, z)の初期値 v(1, 1) = -20: v(1, 2) = -10: v(1, 3) = 10 ‘(vx, vy, vz)の初期値 '--- ---
'----座標軸の表示(初め)---
Mains.Line (0, sh / 2)-(sw, sh / 2) ’横軸(時間t)
Mains.Line (sw / 20, 0)-(sw / 20, sh) ‘縦軸(座標x)
Mains.CurrentX = sw / 15: Mains.CurrentY = sh / 40
Mains.Print "x, y, z" ‘文字 x, y, zを表示 Mains.CurrentX = sw - sw / 40: Mains.CurrentY = sh / 2 - sh / 25
Mains.Print "t" ‘文字tを表示
'----座標軸の表示(終り)---
mx = Val(txtmx): my = Val(txtmy) ‘表示のための 倍率(適宜変更する)
‘---繰返し計算の実行(初め)--- For i = 1 To nmax
DoEvents
j = 1 'イオンの番号(1個だけなのでk=1) Call rk4(t, r(), v(), j) 'rk4( )を呼び出し、軌道計算
Mains.PSet (mx * t + sw / 20, -my * r(j, 1) + sh / 2), RGB(255, 0, 0) 'x(t)のグラフ表示 Mains.PSet (mx * t + sw / 20, -my * r(j, 2) + sh / 2), RGB(0, 0, 255) 'y(t)のグラフ表示 Mains.PSet (mx * t + sw / 20, -my * r(j, 3) + sh / 2), RGB(255, 255, 0) 'z(t)のグラフ表示
t = i * h '時間を1ステップ進める
Next i
‘---繰返し計算の実行(終り)--- End Sub
<cmdIonTrapを利用するときの注意>
①イオンの位置と速度を配列変数
r(20, 3), v(20, 3)で与える。例えば1番目のイオンの位置と速
度の関係はx ? r(1, 1), y ? r(1, 2), z ? r(1, 3) vx ? v(1, 1), vy ? v(1, 2), vz ? v(1, 3)
となっている。こうしておくと、イオン数を増やすときに便利である。
②必要となるテキストボックスは自分でフォームに貼り付けること。
③時間ステップ
h
は交流電圧の周期T = 2 π / Ω
よりも十分に短く設定しなければならない。およ そ10ns 程度に設定してみる。④イオンの質量mは質量数を
M
とするとN
AM
m = × 10
−3/
(N
A:アボガドロ数)と計算できる。
⑤座標の目盛りは入れていないが、必要に応じて表示させるのもよい。
(2-12)~(2-14)を計算するためのサブプログラム(標準モジュールに入力)
Public Sub rk4(t#, r#(), v#(), i%) Dim x#, y#, z#, vx#, vy#, vz#
x = r(i, 1): y = r(i, 2): z = r(i, 3) vx = v(i, 1): vy = v(i, 2): vz = v(i, 3)
ax1 = h * fv(vx) ay1 = h * fv(vy) az1 = h * fv(vz)
avx1 = h * (fx(t, x, vx) - gamma * vx) ‘gamma*vxは速度に比例した抵抗力 avy1 = h * (fy(t, y, vy) - gamma * vy)
avz1 = h * (fz(z, vz) - gamma * vz)
ax2 = h * fv(vx + ax1 / 2) ay2 = h * fv(vy + ay1 / 2) az2 = h * fv(vz + az1 / 2)
avx2 = h * (fx(t + h / 2, x + ax1 / 2, vx + avx1 / 2) - gamma * vx) avy2 = h * (fy(t + h / 2, y + ay1 / 2, vy + avy1 / 2) - gamma * vy) avz2 = h * (fz(z + az1 / 2, vz + avz1 / 2) - gamma * vz)
ax3 = h * fv(vx + ax2 / 2) ay3 = h * fv(vy + ay2 / 2) az3 = h * fv(vz + az2 / 2)
avx3 = h * (fx(t + h / 2, x + ax2 / 2, vx + avx2 / 2) - gamma * vx) avy3 = h * (fy(t + h / 2, y + ay2 / 2, vy + avy2 / 2) - gamma * vy) avz3 = h * (fz(z + az2 / 2, vz + avz2 / 2) - gamma * vz)
ax4 = h * fv(vx + ax3) ay4 = h * fv(vy + ay3) az4 = h * fv(vz + az3)
avx4 = h * (fx(t + h, x + ax3, vx + avx3) - gamma * vx) avy4 = h * (fy(t + h, y + ay3, vy + avy3) - gamma * vy) avz4 = h * (fz(z + az3, vz + avz3) - gamma * vz)
r(i, 1) = x + (ax1 + 2 * (ax2 + ax3) + ax4) / 6 r(i, 2) = y + (ay1 + 2 * (ay2 + ay3) + ay4) / 6 r(i, 3) = z + (az1 + 2 * (az2 + az3) + az4) / 6 v(i, 1) = vx + (avx1 + 2 * (avx2 + avx3) + avx4) / 6 v(i, 2) = vy + (avy1 + 2 * (avy2 + avy3) + avy4) / 6 v(i, 3) = vz + (avz1 + 2 * (avz2 + avz3) + avz4) / 6 End Sub
<rk4( )を利用するときの注意点>
①プログラム中の関数や変数が微分方程式のどの部分に相当するか自分で判断すること。
②fx, fy, fz, fvは各微分方程式の右辺に対応する関数である。fvについては単振動の場合と同じ関 数なので、そのまま利用する。fx, fy, fzの各関数を
Function
プロシージャで定義すること。例え ば、次のように定義する。Public Function fx#(t#, x#, vx#)
fx = 2 * q * (Vdc - Vac * Cos(Wf * t)) * x / (m * r0 ^ 2) + 2 * q * Uz * X1 / (m * z0 ^ 2) End Function
③物理定数は標準モジュールの先頭部分(=General)に
Const
文として入力する。共通変数及び固定する定数を標準モジュールに入力
Public m#, Vac#, Vdc#, Uz#, gamma# ‘関数fx, fy, fzの計算で共通に使う変数。
Public Const q# = 1.60217733E-19 ‘素電荷
Public Const NA# = 6.0221367E+23 ‘アボガドロ数
Public Const e0#=8.854187817E-12 ‘真空の誘電率
Public Const pi#= 3.141592654 ‘定数π
Public Const r0# = 0.0035 ‘電極間距離の半分
Public Const z0# = 0.01 ‘中心電極の長さ
Public Const Wf# = 2 *pi * 5000000# ‘交流電圧の角振動数 :5 MHz(変更可能)
(課 題2−1) コマンドボタン IonTrap を 用 意する 。上に示 したサブプログラム rk4( )と
cmdIonTrap を組合わせて、プログラムを完成させ、
x ( t ), y ( t ), z ( t )
の時間変化のグラフを Mains フォーム上に表示させよ。また、γ
( = gamma)の値を大きくして、変化を観察せよ。(注意1)
計算ステップは非常に小さいので( ~ 10−8sec)、表示のときの横方向の倍率は相当大きく
しなければならない。図2−3では「mx = 2e+8 =2*10^8」に設定している。また、イオンが閉 じ込めれれる領域は一般に
1mm
以下の範囲であるから、この倍率も大きくとらなければ、軌道 はただの線になってしまうので注意すること。(注意2)
「計算時間の最大値:tmax」の設定はイオンの永年振動数から決める。例えば、(V) 100 ,
0 =
=
acdc
V
V
とすると、(付録B)からイオンの永年振動数が次のように求められる。
( kHz )
2 477
2 =
= q f
RFf
従って、振動の一周期は
T = 1 / f = 2 . 1 × 10
−6s
である。イオンの運動を10
周期程度表示させるに は少なくとも「ttmax = 10−7」としなければならない。図2−3.時間の関数として
x ( t ), y ( t ), z ( t )
を表示させた例。(課題2−2) Mains とは別の新しいフォーム「Display」を準備する(付録 A参照)。Displayフォ ーム上に、
xy
座標上でのイオン軌道を描くプログラムを作成せよ(図2−4参照)。新しいコマ ンドボタン Trajectoryをつくり、そこにプログラムを書き込む。うまくいったらyz
、zx
座標上 の軌道も表示してみる。(ヒント1)Trajectory
を押すと同時に「Display」フォームを表示させるには、プログラムに「Display.Show」を加える。
Sub cmdTrajectory_Click ( )
Dim r#(20, 3), v#(20, 3), k%, x#, y#, z#, vx#, vy#, vz# '計算で必要な変数を宣言
Display.Show ‘ Displayフォームをアクティブにする
Display.Cls ‘ Displayフォームをクリア
Display.ScaleHeight = 5000 ‘ Displayフォームのスケール幅・高さ設定
Display.ScaleWidth = 5000 sh=Display.ScaleHeight sw=Display.ScaleWidth
・・・・・・
Display.PSet (mx* r(1, 1)+sw/2, -my*r(1, 2)+sh/2), RGB(255, 0, 0) ‘ Displayフォームの中心を原点にする
・・・・・・
(ヒント2)軌道全体が表示されるように倍率
mx, my
を設定すること。図2−4.イオン軌道の表示例
(課題2−3) 画面にイオンの動く様子が表示できるように Trajectoryの Psetメソッドの部分を
以下に従って修正せよ(図2−5参照)。
(a) 画面にイオンの動きを表示するために、(x, y)=(r(1,1), r(1, 2))を中心とした円を描く。繰返し 計算(For-Next文)の途中で前の円を消してから(Display.Cls)、新しい円を描くようにする
(下のプログラムを参照)。
(b) スムースな描画をさせるために計算ループ内に DoEvents やダミーの For-Next 文を挿入す る(機種によって表示スピードが異なるので調整が必要である)。
Display.FillStyle=0 ‘○を塗りつぶす Display.FillColor=RGB(255, 0, 0) ‘塗りつぶす色の設定
For i = 1 To nmax ‘繰り返し計算の部分
Display.Cls DoEvents
・・・・・・
Display.Circle (mx * r(1, 1) + sw / 2, -my * r(1, 2) + sh / 2), 50, RGB(255, 0, 0)
・・・・・・
For j = 1 To 100000 ‘ダ ミ ー の For-Nextル ー プ Next j
t = i * h '時間を1ステップ進める
Next i
図2−5.計算結果 の表示例
(オプション課題) 新しいコマンドボタン Trajectory2を用意する。クーロン力の項を考慮して、
2つのイオンの運動が同時に表示されるようにプログラムを作れ(図2−6参照)。
Trajectoryの内容をコピーして利用する。また、rk4( ), fx, fy, fzはrk4_2( ), fx2, fy2, fz2として 新たに書き直す。
(ヒント)
他の全てのイオンからi
番目のイオンに働くクーロン力の和は( )
∑
∑
≠ ≠−
−
−
− =
⋅
=
Ni j
j i j i j i ij N
i
j ij
j i
ij
x x y y z z
R q R
r q r
F , ,
4 4
0 32 3
0 2
πε πε
r r r
,
2 2
2
( ) ( )
)
(
i j i j i jij
x x y y z z
R = − + − + −
のように表せる。微分方程式の右辺に追加する関数は
F r
ij/ m
iとなる。クーロン力の項は次に示す
ように
Function
プロシージャで定義する。Public Function fcx#(x#, y#, z#, r#( ), i%, k%) ‘k:イオンの総数, i:クーロン力を受けるイオンの番号 For j = 1 To k
If i <> j Then
rr = Sqr((x - r(j, 1)) ^ 2 + (y - r(j, 2)) ^ 2 + (z - r(j, 3)) ^ 2) fcx = fcx + q ^ 2 / (4 * pi * e0 * m * rr ^ 3) * (x - r(j, 1)) End If
Next j End Function
次に示すように、ルンゲ−クッタ公式にクーロン力の部分を追加する。rk4_2(t#, r#( ), v#( ), i%,
k%)
のように引数が増えていることに注意せよ。この 丸 が イオンを表 す。軌道にそって移動 するように表示させる。
Public Sub rk4_2(t#, r#( ), v#( ), i%, k%) Dim x#, y#, z#, vx#, vy#, vz#
x = r(i, 1): y = r(i, 2): z = r(i, 3) vx = v(i, 1): vy = v(i, 2): vz = v(i, 3)
ax1 = h * fv(vx) ay1 = h * fv(vy) az1 = h * fv(vz)
avx1 = h * (fx(t, x, vx) + fcx(x, y, z, r( ), i, k) - gamma * vx) 'クーロン相互作用 を追加 avy1 = h * (fy(t, y, vy) + fcy(x, y, z, r( ), i, k) - gamma * vy)
avz1 = h * (fz(z, vz) + fcz(x, y, z, r( ), i, k) - gamma * vz)
ax2 = h * fv(vx + ax1 / 2) ay2 = h * fv(vy + ay1 / 2) az2 = h * fv(vz + az1 / 2)
avx2 = h * (fx(t + h / 2, x + ax1 / 2, vy + avy1 / 2) + fcx(x + ax1 / 2, y + ay1 / 2, z + az1 / 2, r( ), i, k) - gamma * vx) avy2 = h * (fy(t + h / 2, y + ay1 / 2, vy + avy1 / 2) + fcy(x + ax1 / 2, y + ay1 / 2, z + az1 / 2, r( ), i, k) - gamma * vy) avz2 = h * (fz(z + az1 / 2, vz + avz1 / 2) + fcz(x + ax1 / 2, y + ay1 / 2, z + az1 / 2, r( ), i, k) - gamma * vz)
・・・・・・・
コマンドボタン
Trajectory2
は基本的に課題2−3で作ったTrajectory
の中身と同じであるが、次の2点が異なる。
①2つ目のイオンの初期条件を与える。
'---イオン運動の初期条件 の入力(変更可能)--- r(1, 1) = -0.00001: r(1, 2) = -0.00001: r(1, 3) = 0.00001 v(1, 1) = -20: v(1, 2) = -10: v(1, 3) = 10
r(2, 1) = 0.00001: r(2, 2) = 0.00001: r(2, 3) = -0.00001 v(2, 1) = 20: v(2, 2) = 10: v(2, 3) = -10
②繰返し計算の部分では2つのイオン軌道を計算しなければならないので、For n = 1 to k・・・
Next n
が追加されている。また、座標軸は円を消す度に再描画してやらなければならない。・・・・・
'計算の実行(繰り返し)
For i = 1 To nmax Display.Cls DoEvents
k = 2 '総イオン数2個
For n = 1 To k ‘クーロン力を受けるイオンの番号はn
Call rk4_2(t, r( ), v( ), n, k) ’rk4_2( )を呼び出し、軌道計算
Display.Circle (mx * r(n, 2) + sw / 2, -my * r(n, 3) + sh / 2), 20, RGB(255, 0, 0) ‘ (y, z)軌道 Next n
t = i * h '時間を1ステップ 進める
‘----座標軸の描画(初め)--- Display.Line (0, sh / 2)-(sw, sh / 2) Display.Line (sw / 2, 0)-(sw / 2, sh)
Display.CurrentX = sw - sw / 20: Display.CurrentY = sh / 2 - sh / 20 Display.Print "y"
Display.CurrentX = sw / 2 + sw / 40: Display.CurrentY = sh / 40 Display.Print "z"
‘----座標軸の描画(終り)--
For j = 1 To 100000 ‘ダミーのループ Next j
Next i End Sub
<第 4 回レポート課題>
①プログラムに詳細なコメント(説明)をつける。
②ルンゲ‐クッタ公式によって求めた結果が十分な精度で計算できたかどうかをチェッ クする方法を考えてみよ(思いつかなければ文献を調べてもよい)。
(付録 A)フォームの追加
新しいフォームを追加するには次のようにすればよい。メニューバーの「プロジェクト」
?
「フ ォームモジュールの追加」を選択するか、図A−1
の矢印部分にあるコマンドボタンをクリック し、「フォームモジュール」を選択すればよい。追加したフォームは最初に作ったフォーム(例えば
Mains)に従属する形のフォームとなるので、新しいフォームをプログラム実行中に表示させ
るためには、プログラムの先頭部分に
Form2.Show
のような一行を付け加える必要がある。「Form2」の部分は新しいフォームのオブジェクト名であ る。例えば、課題2では連成振り子が振動する様子を描画する専用のフォームモジュール(Display) を追加するが、これを表示させるときも同様に「Display.Show」などとする(図
A−2も参照)。
図A−2.新しいフォーム「Display」を追加したところ 。
(付録 B )断熱近似理論によるイオン運動の解析
線形
rf
イオントラップに閉じ込められたイオンがどのような運動をしているかを知るために、断熱近似理論を適用して微分方程式の近似解を求めてみる。(2-10)式は
0
) 2 cos 2
2
(
2
+ a − q X =
dt X
d τ (B-1)
であった。イオンが閉じ込められるのは中心力が働くからであるが、その中心力の源は印加して いる交流電圧によって作られた、ある平均的なポテンシャルである。従って閉じ込められたイオ ンは交流電圧の周波数
Ω
よりも十分小さな振動数ω
で振動しているはずである。その一方で、交 流電圧の電場による摂動も受けているはずだから、イオンは主に2つの振動数成分をもっている と考えられる。そこで、イオン運動を次式のように2つの成分に分離して考えてみる。δ +
= x
X (B-2)
ここで、
x
は平均的なポテンシャルのなかをゆっくりと振動する成分、δ
は交流電圧による摂動 をうけて運動する成分とする。上記の仮定から<< X
δ ,
dt dx dt
d δ >>
(B-3)
であるので、(2-13)式を(2-12)式に代入すると
( a q ) x
d
d τ
τ
δ
22 cos 2
2
−
−
≅ (B-4)
が得られる。ここで、
V
dc電圧が0
または十分に小さくて、a << q
であると仮定すると( q ) x
d
d τ
τ
δ
22 cos 2
2
≅ (B-5)
が得られる。
δ
の振動の間にx
はほとんど変化しないので、x
を定数と近似して積分を求めるとτ
δ cos 2
2
− qx
= (B-6)
を得る。(B-6)式を(B-2)式に代入すると
q x
X
−
= cos 2 τ
1 2
(B-7)
とかける。
x
を定数と近似してもとの方程式(B-1)に代入するとτ
τ τ
τ cos 2 2 cos 2
2 2
4 cos 2
2 2
2 2
aqx qx x
x q a q
d X
d − + +
+
−
= (B-8)
となる。(B-2)式から
2 2 2 2 2 2
τ δ τ
τ d
d d
X d d
x
d = −
ここで右辺第一項は(B-8)式、第二項は(B-6)式を代入して
τ τ
τ cos 2
2 2
4 cos 2
2 2
2
2
q x aqx
q x d a
x
d − +
+
−
= (B-9)
x
の運動を支配しているのは、交流電圧による瞬間的な加速度をcos 2 τ
の1周期にわたって平均 化したものであるから、(B-9)の1周期平均をとる。τ τ τ
τ
π
q x aqx d
q x d a
x
d ∫ − +
+
−
=
02 2
2 2
2 2 cos 2
4 cos 2
q x
a
+
−
= 2
2
この微分方程式を解いて
x
を求めると、( βτ + φ )
= cos ) (t
x ,
2 q
2a +
≡
β , φ
:初期位相 (B-10) となる。元の次元に戻すと、次式のようにイオンの永年振動数を得る。Ω
= β
ω 2
1
(B-11)
以上の近似理論は、トラップパラメータが
a << q < 0 . 4
に対して成り立っていることが確かめら れている。<具体例>
炭素の1価イオン(12
C
+)の場合の ω
を計算してみよう。パラメータは以前と同じ条件とする。電極のパラメータ:
r
0= 3 . 5 ( mm) = 3.5 × 10
-3( m), z
0= 10 mm = 10
-2( m)
交流周波数:Ω = 2 π × 5 ( MHz) = 3.14 × 10
7( rad/s)
12
C
+イオン:q
i≅ 1 . 602 × 10
−19( C), m
i≅ 12 × 10
−3/ N
A= 2 . 0 × 10
−26(kg)
トラップパラメータac dc
dc
i
V q V
r m
V
a q
2 3 30
2
5 . 3 10 , 2 . 7 10
8
− −×
≅
× Ω ≅
=
(V) 100 ,
0 =
=
acdc
V
V
とすれば( rad/s )
10 2 3
2
×
6= Ω
= q
ω
⇒477 ( kHz )
2
2 =
= q f
RFf
イオンの永年振動数は交流電圧の周波数
5 MHz
よりも一桁小さいことが分かる。<参考図書>
[1]ニューメリカルレシピ・イン・シー, William H. Press他, 丹慶勝市他訳, 技術評論社
[2]数値計算法(改訂3版), 長島秀世著, 槙書店
[3]UNIXワークステーションによる科学技術計算ハンドブック, 戸川隼人著, サイエンス社
[4]プログラムはなぜ動くのか, 矢沢久雄著, 日経BP社
[5]EXCEL VBAによる化学プログラミング, 佐藤寿邦、佐藤洋子著, 培風館