38
卒業論文 Java プログラミングと天体の運動 岡山理科大学 総合情報学部 生物地球システム学科 田邉研究室 I04G004 安藤 晋

Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

卒業論文

Java プログラミングと天体の運動

岡山理科大学 総合情報学部 生物地球システム学科 田邉研究室

I04G004 安藤 晋

Page 2: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

要約

新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

ムを作成し、実行した。プログラムに含まれるパラメータを変えることにより、数値シミ

ュレーションを実行した結果、(1)テスト粒子に働く力であるコリオリ力と遠心力が優勢で

ある結果、いずれの天体にも引き付けられずに螺旋状に飛び出していくというシミュレー

ション、(2) 片方の天体にテスト粒子が引き付けられるというシミュレーション、そして、

(3) テスト粒子に働く力が釣り合ってテスト粒子が動かない、という厳密解の1つである正

三角形解のシミュレーションが得られた。このうち、2つ目の片方の天体にテスト粒子が

引き付けられるシミュレーションはまさに降着円盤が構成される解そのもので、粒子を増

やすと降着円盤が形成されるケースに対応していると考えられる。

Page 3: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

目次

要約 1. 序論………………………………………………………………………………………. 1 2. 理論………………………………………………………………………………………..3

2.1 方程式(万有引力の法則、ニュートンの第2法則)………………………………………3

2.2 無次元化……………………………………………………………………………………4

3. 方法………………………………………………………………………………………..7

4. Java によるプログラミング……………………………………………………………9

4.1 プログラミングの概要………………………………………………………………….9 4.2 実際のプログラム……………………………………………………………………...10

5. 結果……………………………………………………………………………………….16 6. 考察……………………………………………………………………………………….18 参考文献………………………………………………………………………………………19

Appendix-1 ルンゲ・クッタ法のプログラム…………………………………………..21 Appendix-2 1体近似のプログラム……………………………………………………..23 Appendix-3 2体問題のプログラム……………………………………………………..27 Appendix-4 制限3体問題のプログラム………………………………………………..31

Page 4: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

1. 序論

天体の運動という現象は、本質的に室内で天体を作り出して実際にどのように動くかと

いう実験をすることができないものである。よって、天体が他の天体からどのような影響

を受け、その結果どのような動きをするかは、シミュレーションにより解くということで

その運動を調べることができる。 シミュレーションの良い点は、時間スケールを自由にできるという点であり、実際は何

億年、何十億年もかかる天体の運動という現象を短時間で見ることができる。次に、条件

を簡単に変えることができ、その影響を知ることができる点である。 ニュートンが万有引力の法則を発見して以来、この力によって天体の運動をとくという、

いわゆる天体力学という一大分野が天文学に誕生した。この天体力学の目的は3体問題を

厳密的に解くことであった。 天体の運動は1体近似、2体問題、3体問題、多体問題と様々であるが、今回は特に応

用範囲の広い制限3体問題を扱う。このシミュレーションは、連星系を降着円盤の形成、

太陽系の小天体(惑星、小惑星)の運動、月探査機のシミュレーションにも応用できる。 制限3体問題とは、天体 A、天体 B、粒子と3体あったときに、粒子の質量を0と仮定し、

他の2つの質量を持つ物体の相対軌道に影響を与えないようにするというもので、他の2

つの総合された重力場での任意の時刻における無質量物体の運動(位置と速度)を求める

ことで問題が単純化される。 コンピュータが発見される前は数値の計算は手でやっていた。それゆえ簡単な計算をす

るのにもかなりの時間を要したと考えられる。時代が進むにつれディジタルコンピュータ

や大型コンピュータ、スーパーコンピュータなどが作られ、計算は格段に速くなった。し

かし、速くなったとはいえ、この時代のコンピュータは1つ計算するのに、1晩以上かか

るというものなので、数値シミュレーションを行うのも一苦労であった。それゆえ、専門

家しか数値シミュレーションには手をつけなかった。だが、近年のコンピュータは、性能

が格段に向上し、計算が極めて短時間でできるようになった。そのため、専門家以外も数

値シミュレーションが気軽にできるようになり、今こうして私が数値シミュレーションを

卒業論文のテーマとしてできるようになったのもそのようなわけである。 一番初めにできたプログラミング言語は、機械語で、CPU が直接理解し実行できるプロ

グラミング言語で、0 と 1 で表現される最も低いレベルのプログラミング言語である。次に

できたのが、アセンブリ言語といい、わかりやすい形で機械語を記述するプログラミング

言語である。次に作られたのが、Fortran という。Fortran は 1954 年にジョン・バッカス

によって考案され、コンピュータにおける最初の高級言語である。次に、COBOL が 1959年に開発された。Fortran が科学技術計算用であるのに対して、COBOL は大量のデータを

処理するための事務処理用及び管理分野用である。

Page 5: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

次に、1964 年にジョン・ケミー、トーマス・カルツによって Basic が開発された。これ

は Fortran を基に作られ、1970 年代以降にコンピュータで広く使われた。 1972 年には、デニス・リッチーらによって C 言語が開発された。この言語はソフトウェア

分野でも広く採用されており、他の言語と比べて非常に自由度が高い。1995 年には

SunMicroSystems 社によって Java が開発された。これは C 言語や C++を基に作られ、従

来の様々な言語の欠点を克服するよう設計された。機械語とアセンブリ言語のことを低級

言語というのに対して、Fortran、Basic、C、Java などのことを高級言語という。このよ

うに、Java は最近できたプログラミング言語で、Fortran や Basic、C と比べると前例が

少ない。よって、私はまだ前例の少ない Java でシミュレーションを作成することにした。 内容としては、ルンゲ・クッタ法を用いて、ニュートンの運動方程式を万有引力のもと

で数値的に解き、天体がどのように動くかというプログラムを作成し、シミュレーション

を実行する。 以下、本論分は、2.理論 3.方法 4.Java プログラミングの概要 5.プログラムの説明

6.結果 7.考察 という構成で書かれている。

Page 6: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

2. 理論

2.1 方程式 天体の運動のシミュレーションを行うプログラムを作成する上で、最も基本的な要素は

万有引力である。天体と天体の間に万有引力が働き、お互いに引き合う。万有引力の法則

は 2rGMmF −= である。ここで、Gは万有引力定数(6.672×10-11m3kg-1s-2)で、M、mは天

体の質量、rは天体間の距離である。この万有引力の法則をニュートンの第2法則ma=Fと組

み合わせて数値的に解く。それぞれの式をプログラミングするために変形させる。

ニュートンの第2法則 ma=F → iii F

dtrdm rr

=2

2

(i =1, 2, 3,・・・・・N)

ここで、 iFrは他のすべての天体からの万有引力である。

万有引力の法則 m 32

2

rGMmx

dtxd

−= (x 成分)

m 32

2

rGMmy

dtyd

−= (y 成分)

上記の式は1体近似の式である。今度は、制限3体問題における万有引力の方程式に変換

する。下記はテスト粒子が天体 A と天体 B から受ける万有引力の式である。

原点を中心に取ると、回転座標系ではテスト粒子は万有引力以外に天体 A と天体 B からな

る連星系からのコリオリ力と遠心力を受ける。コリオリ力とは、回転座標系上で移動した

際に移動方向と垂直方向に移動速度に比例した大きさで受ける慣性力のことである。遠心

力とは、回転座標系上で回転の中心からみて外側へと向かう慣性力のことである。コリオ

リ力と遠心力の方程式を次に記す。

32

223

1

112

2 )()(r

axGMr

axGMdt

xd −−

+−= (x 成分)

32

23

1

12

2

ryGM

ryGM

dtyd

−−= (y 成分)

1M :天体 A の質量

2M :天体 B の質量

1a :原点 O から天体 A までの距離

2a :原点 O から天体 B までの距離

Page 7: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

コリオリ力 dtdymω2− (x 成分)

dtdxmω2− (y 成分)

遠心力 (x 成分) xm 22 ω− (y 成分) ym 22 ω− よって、テスト粒子が天体 A と天体 B から受ける力は

32

223

1

1122

2 )()(2r

axGMr

axGMxmdtdym

dtxd −

−+

−=−− ωω ・・・・・・①

32

23

1

122

2

2r

yGMr

yGMymdtdxm

dtyd

−−=−− ωω ・・・・・・・・・・・・②

となる。

上記の式が回転系において制限3体問題を解く基礎方程式であるが、このままでプログ

ラムを組んでしまうと や は極端に大きく、万有引力定数は極端に小さいので、非

常に扱いづらい。そのため、無次元化をする必要がある。 1M 2M

2.2. 無次元化 無次元化とは、距離なら特徴的な長さで、質量なら特徴的な質量で、というように同じ

単位のもので割り、単位を持たない値にすることである。天体の質量は極端に大きく、万

有引力定数は極端に小さいために、次のように無次元化をして極端な値を用いなくていい

ようにする。

0rxX = 、

0ryY = 、

0

11 r

aA = 、 0

22 r

aA = 、 0rrR = 、

0ttT =

→ 、 、 、Xrx 0= Yry 0= 101 Ara = 202 Ara = 、 Rrr 0= 、 Ttt 0= ・・・・③

ここで、 は特徴的な長さ は特徴的な時間である。 0r 0t

これを式に代入し、無次元化を行う。

Page 8: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

(1) 1体近似、2体問題

基礎方程式

32

2

rGMx

dtxd

−= ・・・・・・・・・・・・・・・・・④

32

2

rGMy

dtyd

−= ・・・・・・・・・・・・・・・・・⑤

③を④、⑤式に代入

④ 30

02

0

02

)()()(

RrGMXGMr

TtdXrd

−= (右辺の を1つずつ消す) 0r

→ 320

2

2

20

0

RrGMX

dTXd

tr

−=・

→ 330

20

2

2

RrXGMt

dTXd

−=

→ 32

2

RXK

dTXd

−= ・・・・④’

⑤も同様に 30

02

0

02

)()()(

RrGMYGMr

TtdYrd

−=

→ 320

2

2

20

0

RrGMY

dTYd

tr

−=・

→ 330

20

2

2

RrYGMt

dTYd

−=

→ 32

2

RYK

dTYd

−= ・・・・⑤’

また、G の単位 22mNkg −=2222 mkgskgm −−−=

231 −−= smkg

ここで Kr

GMt=3

0

20 とおく。

G と打ち消しあい、K は無次元とわかる。

④’、⑤’は無次元化された1体近似、2体問題の方程式である。

Page 9: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

(2) 制限3体問題

基礎方程式

32

223

1

1122

2 )()(2r

axGMr

axGMxmdtdym

dtxd −

−+

−=−− ωω ・・・・・・①

32

23

1

122

2

2r

yGMr

yGMymdtdxm

dtyd

−−=−− ωω ・・・・・・・・・・・・②

ここで、Pπω 2

=

ケプラーの第3法則により 221

2

321

4)()(

πMMG

Paa +

=+

→ 2213

212

2

4)()(

4 ππω MMGaa +

=+・

→ 321

212

)()(

aaMMG

++

また、0

1t

=ω とすることにより

21

21

210 )(

)(

⎭⎬⎫

⎩⎨⎧

++

=MMG

aat とすることができる。また、 210 aar += とする。

21

11 MM

MK+

= 、 21

22 MM

MK+

= とする。

、 22

11 )( yaxr ++= 2222 )( yaxr +−=

以上を踏まえて③を①、②式に代入すると①は

{ } { }3220

2200

2002322

02

100

10010

2

00

0

02

0

02

)()(

)()(1

)()(12

)()(

YrArXrArXrGM

YrArXrArXrGMXr

tTtdYrd

tTtdXrd

+−

−−

++

+=⎟⎟

⎞⎜⎜⎝

⎛−− ・

→{ } { }322

2

2023

0322

1

1013

020

020

02

2

20

0

)(

)(1)(

)(12YAX

AXrGMrYAX

AXrGMr

Xtr

dTdY

tr

dTXd

tr

+−

−−

++

+−=−− ・・・・

→{ } { }322

2

23

0

202

3221

13

0

201

2

2

)(

)(

)(

)(2

YAX

AXr

tGM

YAX

AXr

tGMX

dTdY

dTXd

+−

−−

++

+=−− ・・

Page 10: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

ここで、 30

20

rGt

− を1とする。また、1

2

2

1

KK

aa

= より

∴{ } { }322

2

21322

1

122

2

)(

)(

)(

)(2

YAX

AXA

YAX

AXAX

dTdY

dTXd

+−

−−

++

+−=−− ・・・・・・①’

②も同様に

{ } { }3220

2200

02322

02

100

010

2

00

0

02

0

02

)()(1

)()(12

)()(

YrArXr

YrGM

YrArXr

YrGMYrtTtd

XrdtTtd

Yrd

+−−

++=⎟⎟

⎞⎜⎜⎝

⎛−− ・

→{ } { }322

2

023

0322

1

013

020

020

02

2

20

0

)(1

)(12

YAX

YrGMrYAX

YrGMr

Ytr

dTdX

tr

dTYd

tr

+−−

++−=−− ・・・・

→{ } { }322

23

0

202

3221

30

201

2

2

)()(2

YAXY

rtGM

YAXY

rtGM

YdTdX

dTYd

+−−

++−=−− ・・

∴{ } { }322

2

1322

1

22

2

)()(2

YAX

YA

YAX

YAY

dTdX

dTYd

+−−

++−=−− ・・・・・・・②’

①’、②’は制限3体問題の無次元化された方程式である。

以上の方程式を4次のルンゲ・クッタ法を用いて解く。

3. 方法

理論で記述した方程式を4次のルンゲ・クッタ法で数値的に解く。ルンゲ・クッタ法は、

数値解析において常微分方程式の近似解を求める方法で、式を以下に記す。

( )ytfdtdy ,=

という微分方程式があるとき、4次のルンゲ・クッタ法を使って逐次的に解くには、以下

の式を用いる。

( )

( )

( ) tkyttfk

tkyttfk

tkyttfk

tytfk

kkkkyy

nn

nn

nn

nn

nn

Δ+Δ+=

Δ⎟⎠⎞

⎜⎝⎛ +Δ+=

Δ⎟⎠⎞

⎜⎝⎛ +Δ+=

Δ=

++++=+

34

23

12

1

43211

.21,

21

21,

21

,

2261

Page 11: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

先ほど記載した式は1階の微分方程式であり、今回取り扱う1体近似、2体問題、制限

3体問題では、2階の微分方程式を解かなければならないので、先ほどの式を応用して、

2つの連立微分方程式にする。その式を以下に記す。

( )

( )zytgdtdz

zytfdtdy

,,

,,

=

=

という、2つの連立微分方程式があるとき、4次のルンゲ・クッタ法を適用するには、以

下の式を用いる。

( )

( )

( )

( )( )

( ) tjzkyttgj

jzkyttgj

tjzkyttgj

tzytgjtjzkyttfk

tjzkyttfk

tjzkyttfk

tzytfk

jjjjzz

kkkkyy

nnn

nnn

nnn

nnn

nnn

nnn

nnn

nnn

nn

nn

Δ++Δ+=

⎟⎠⎞

⎜⎝⎛ ++Δ+=

Δ⎟⎠⎞

⎜⎝⎛ ++Δ+=

Δ=Δ++Δ+=

Δ⎟⎠⎞

⎜⎝⎛ ++Δ+=

Δ⎟⎠⎞

⎜⎝⎛ ++Δ+=

Δ=

++++=

++++=

+

+

334

223

112

1

334

223

112

1

43211

43211

,,21,

21,

21

21,

21,

21,,

,.21,

21,

21

21,

21,

21,,

2261

2261

1体近似、2体問題なら④’、⑤’の式を、制限3体問題なら①’、②’の式を上記の4次のル

ンゲ・クッタ法に適用することで計算することができる。

Page 12: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

4. Java によるプログラミング

4.1 プログラミングの概要

Javaは 1995年 5月に米国のSun Microsystems社が発表したプログラミング言語で、

C 言語や C++を基に作られた。Java プラットフォームは JDK と JRE から構成され、開

発キットである JDK でプログラムを書き、ソースファイルを作成、実行環境である JRE でソースファイルを変換し、プログラムを実行する。

Java はクラスベースのオブジェクト指向プログラム言語である。Java のプログラムは

複数のクラスから構成され、プログラムの実行は各クラスが実体化したオブジェクト群

が相互にメッセージをやりとりしながら行われる。Java のコンパイラおよび実行環境が、

型同士の整合性を検査することによって、プログラムが正しく記述されていることや、

安全に動作することの検証が可能である。一つのクラスは複数のインタフェースを実装

できる。 Java の1番の特徴はアプレットがあることである。アプレットとは、ウェブ内でアニ

メーションの表示やマウスによるインタラクティブな操作が可能であり、ほかにもプロ

グラム結果なども表示することができる。 また、画面への文字表示、図形の描画、計算などは、ライブラリの関数を扱うことで、

簡単にプログラミングすることができる。 Java は無償で提供されており、インストールすれば誰でも使うことができるのも特徴

のひとつである。

Page 13: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

4.2 実際のプログラム 実際に組んだルンゲ・クッタ法、1 体近似、2体問題、制限3対問題のプログラムをここ

で紹介する。1体近似、2体問題、制限3体問題のプログラムは大部分が同じなので、変

更した部分だけ紹介することとする。また、すべてのプログラムをルンゲ・クッタ法は

Appendix-1、1体近似は Appendix-2、2体問題は Appendix-3、制限3体問題は Appendix-4に載せる。それではまず4次のルンゲ・クッタ法のプログラムを説明する。 public void step(){ ←step というメソッドを定義

double s1 = dt*p(t, y, v, x, u);

double w1 = dt*q(t, y, v, x, u);

double s2 = dt*p(t + 0.5*dt, y + 0.5*s1, v + 0.5*w1, x, u);

double w2 = dt*q(t + 0.5*dt, y + 0.5*s1, v + 0.5*w1, x, u);

double s3 = dt*p(t + 0.5*dt, y + 0.5*s2, v + 0.5*w2, x, u);

double w3 = dt*q(t + 0.5*dt, y + 0.5*s2, v + 0.5*w2, x, u);

double s4 = dt*p(t + dt, y + s3, v + w3, x, u);

double w4 = dt*q(t + dt, y + s3, v + w3, x, u);

y = y + 1/6.0*(s1 + 2*s2 + 2*s3 + s4);

v = v + 1/6.0*(w1 + 2*w2 + 2*w3 + w4);

double k1 = dt*f(t, y, v, x, u);

double j1 = dt*g(t, y, v, x, u);

double k2 = dt*f(t + 0.5*dt, y, v, x + 0.5*k1, u + 0.5*j1);

double j2 = dt*g(t + 0.5*dt, y, v, x + 0.5*k1, u + 0.5*j1);

double k3 = dt*f(t + 0.5*dt, y, v, x + 0.5*k2, u + 0.5*j2);

double j3 = dt*g(t + 0.5*dt, y, v, x + 0.5*k2, u + 0.5*j2);

double k4 = dt*f(t + dt, y, v, x + k3, u + j3);

double j4 = dt*g(t + dt, y, v, x + k3, u + j3);

x = x + 1/6.0*(k1 + 2*k2 + 2*k3 + k4);

u = u + 1/6.0*(j1 + 2*j2 + 2*j3 + j4);

t = t + dt; ←刻み幅を求める式

}

3章で紹介した4次のルンゲ・クッタ法をそのままプログラム化したものである。

このルンゲ・クッタ法に基礎方程式を適用するに下記のプログラムを用いる。

Page 14: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

・1体近似、2体問題の場合

private double p(double t, double y, double v, double x, double u){

return v;

}

private double q(double t, double y, double v, double x, double u){

return -k*y/Math.pow(x*x+y*y,1.5); ・・・・・・・・⑥

}

private double f(double t, double y, double v, double x, double u){

return u;

}

private double g(double t, double y, double v, double x, double u){

return -k*x/Math.pow(x*x+y*y,1.5); ・・・・・・・・⑦

}

・制限3体問題の場合

private double p(double t, double y, double v, double x, double u){

return v;

}

private double q(double t, double y, double v, double x, double u){

return -2*u+y-a2*y/Math.pow((x+a2)*(x+a2)+y*y,1.5)

-a1*y/Math.pow((x-a1)*(x-a1)+y*y,1.5);

}

private double f(double t, double y, double v, double x, double u){

return u;

}

private double g(double t, double y, double v, double x, double u){

return 2*v+x-a2*(x+a2)/Math.pow((x+a2)*(x+a2)+y*y,1.5)

-a1*(x-a1)/Math.pow((x-a1)*(x-a1)+y*y,1.5);

}

⑥には y 方向、⑦には x 方向に相当する無次元化された式をいれることにより、ルンゲ・

クッタ法で計算することができる。

Page 15: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

・1体近似 class Sun{ ←Sun というクラスを定義

Vector s1, s2; double r, m; Sun(double x, double y, double vx, double vy, double m, double r) { s1 = new Vector(); ↑(初期位置 x、初期位置 y、t 秒後の位置 x、t 秒後の位置 y、

s2 = new Vector(); 質量、半径)を設定する。 this.s1.x = x; this.s1.y = y; this.s2.x = vx; this.s2.y = vy; this.m = m; this.r = r; } } このクラスで天体の初期条件を設定する。

上記の天体の初期条件を設定するクラスにパラメータをいれるメソッド public rakkaCanvas() { this.sun = new Sun(400, 400, 0, 0, 100, 10); this.earth = new Earth(490, 400, 0, 2, 5, 5); }

↑(初期位置 x、初期位置 y、t 秒後の位置 x、t 秒後の位置 y、質量、半径)

次に、4次のルンゲ・クッタ法にパラメータを与えて計算するプログラムを紹介する。 public void move() { double rx = earth.e1.x - sun.s1.x; ←天体 A と天体 B 間の x 方向の距離 double ry = earth.e1.y - sun.s1.y; ←y方向の距離 this.rr2 = new rakkaRunge2(cdt/1000.0, ry, 0, rx, 0, 1); ↑ パラメータをルンゲ・クッタ法に与える。

(刻み幅、天体 A と天体 A 間の y 方向の距離、y 方向における初速度、

天体 A と天体 A 間の x 方向の距離、x 方向における初速度、万有引力)

for(int i = 0; i < 100; i++){ this.rr2.step(); ←100 回繰り返し計算する。 }

Page 16: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

double u = this.rr2.getu(); ←ルンゲ・クッタ法の計算結果を代入 double v = this.rr2.getv(); earth.e2.x = earth.e2.x + u; ←天体 B のt秒後の位置に計算結果を足す。 earth.e2.y = earth.e2.y + v; earth.e1.x += earth.e2.x; ←天体 B のt秒後の位置を代入し現在位置を更新 earth.e1.y += earth.e2.y; } 上記のプログラムで求めた天体の位置を下記のプログラムでシミュレーションに表示する。 天体を描画するプログラム public void paint(Graphics g){

g.setColor(Color.RED); ←天体 A を赤色に。 g.fillOval((int)sun.s1.x -(int)sun.r, (int)sun.s1.y-(int)sun.r, 2 * (int)sun.r,

2 * (int)sun.r); ↑(天体 A の x 方向の位置、天体 A の y 方向の位置、直径、直径)を決定する。

} g.setColor(Color.BLUE); ←天体 B を青色に。 g.fillOval((int)earth.e1.x-(int)earth.r, (int)earth.e1.y-(int)earth.r,

2 * (int)earth.r, 2 * (int)earth.r); ↑(天体 B の x 方向の位置、天体 A の y 方向の位置、直径、直径)を決定する。

・ 2体問題 public void move() { double rx = earth.e1.x - sun.s1.x; double ry = earth.e1.y - sun.s1.y; this.rr10 = new rakkaRunge10(cdt/1000.0, ry, 0, rx, 0, 10); for(int i = 0; i < 100; i++){ this.rr10.step(); }

Page 17: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

double u = this.rr10.getu(); double v = this.rr10.getv();

sun.s2.x = sun.s2.x - u; ←天体 A のt秒後の位置に計算結果を足す。 sun.s2.y = sun.s2.y - v; earth.e2.x = earth.e2.x + u; ←天体 B のt秒後の位置に計算結果を足す。 earth.e2.y = earth.e2.y + v;

sun.s1.x += sun.s2.x; ←天体 A のt秒後の位置を代入し現在位置を更新 sun.s1.y += sun.s2.y; earth.e1.x += earth.e2.x; ←天体 B のt秒後の位置を代入し現在位置を更新 earth.e1.y += earth.e2.y;

} 1体近似は天体 A の位置を固定しているのに対し、2体問題は天体 A、天体 B 両方ともの

位置を更新することにより、お互いに影響を及ぼしあうシミュレーションができる。

・ 制限3体問題 public rakkaCanvas() { this.jusin = new Jusin(400, 400, 0, 0, 1, 1); this.luna = new Luna(400, 400.8660254037844386, 0, 0, 1, 2); this.sun = new Sun(395, 405, 0, 0, 1, 2); this.earth = new Earth(405, 405, 0, 0, 1, 2); } 制限3体問題は1体近似、2体問題とは違い、天体を3体と重心を1つ用いる。 計算するプログラム public void move() { double rx = luna.l1.x - jusin.j1.x; ←重心とテスト粒子間の x 方向の距離 double ry = luna.l1.y - jusin.j1.y; ←重心とテスト粒子間の y 方向の距離 double a1 = jusin.j1.x - 0.5; ←天体 A と重心間の距離 double a2 = jusin.j1.x + 0.5; ←天体 B と重心間の距離 double rx1 = this.earth.e1.x - this.sun.s1.x; double ry1 = this.earth.e1.y - this.sun.s1.y;

Page 18: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

this.sr = new santaiRunge3(cdt/1000.0, ry, 0, rx, 0, 0.5, 0.5); for(int i = 0; i < 100; i++){ this.sr.step(); } double u = this.sr.getu(); double v = this.sr.getv(); luna.l2.x = luna.l2.x - u; ←テスト粒子のt秒後の位置に計算結果を足す。 luna.l2.y = luna.l2.y - v; luna.l1.x += luna.l2.x; ←テスト粒子のt秒後の位置を代入し現在位置を更新 luna.l1.y += luna.l2.y; } 以上のプログラムを用いてシミュレーションを行った。

Page 19: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

5. 結果

上記のプログラムを用いて、数値シミュレーションを行った結果。 ① 連星系からテスト粒子が螺旋状に飛び出していく。 ② テスト粒子が動かない。(正三角形解) ③ テスト粒子が片方の天体に引き付けられる、その天体の周りを回転する。

という3つの結果が得られた。 ①

テスト粒子(0, 0.5) 天体A(-0.5, 0) 天体B(0.5, 0)

-2000

-1500

-1000

-500

0

500

1000

1500

2000

-2000 -1500 -1000 -500 0 500 1000 1500 2000

テスト粒子に働く力は、それぞれの天体から受ける万有引力、連星系から受ける遠心力と

コリオリ力の3つである。この図では、万有引力に比べ遠心力とコリオリ力が強いために、

テスト粒子が螺旋状に飛び出してしまったのだと考えられる。

Page 20: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

  テスト粒子(0, 0.866) 天体A(-0.5, 0) 天体B(0.5, 0)

-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1

天体 A、天体 B、テスト粒子の3体を正三角形になるように均等な場所に置いた。 その結果、テスト粒子は動かず、その場に静止したままだった。これは、テスト粒子に働

く万有引力、遠心力、コリオリ力が釣り合ったためだと考えられる。 また、この解は数少ない厳密解のひとつとして知られている。

Page 21: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

テスト粒子(0, 0.002) 天体A(-0.5, 0) 天体B(0.5, 0)

-0.4

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

テスト粒子が片方の天体に引き付けられ、その周りを回転している。これは、テスト粒子

に働く万有引力、遠心力、コリオリ力のバランスが取れたために、連星系から飛び出さず

に、片方の天体の周りを周り続けているのだと考えられる。 また、この解は降着円盤ができる解そのものであり、粒子数を増やすと、片方の天体の

周りに降着円盤が構成されると思われる。

Page 22: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

6.考察

実際にアプレットでシミュレーションをしてみると、同じ値で計算しても数値シミュレ

ーションで求めた②の正三角形解や、③の降着円盤の解のようにはならず、最終的にはテ

スト粒子が飛び出してしまう、という結果になってしまった。この原因は、エネルギーが

保存されていないからと思われる。これは、ルンゲ・クッタ法を用いて計算しているから

である。ルンゲ・クッタ法は前進差分法であり、計算するたびに少しずつ計算結果に数値

が加算されてしまっている。時間が大きければ大きいほど、計算の刻み幅が小さければ小

さいほど、その誤差は大きなものになっていく。そのため、正三角形解のシミュレーショ

ンを行っても最終的にはテスト粒子が連星系から飛び出してしまうのである ルンゲ・クッタ法を用いて計算すると、数値が少しずつ加算されていくのを避けること

はできない、そのため、数値が大きくならないように何かしらの値で引いてやる必要があ

る。これを、粘性を持たせるといい、粘性を持たせることによって数値が徐々に大きくな

ることを防ぐことができる。 また、他の解決法として、前進差分法であるルンゲ・クッタ法を用いずに、中心差分法

や後退差分法を用いて計算をすれば、計算結果に数値が加算されずに、エネルギーを保存

したまま計算できるのではないかと考えられる。

参考文献

藪下 信、 計算物理Ⅰ、 (地人書館、 1986)

木下 宙、 天体と軌道の力学、 (東京大学出版会、 1998)

小泉 修、 理系のための Java 入門、 (工学社、 2006)

柴田 望洋、 明解 Java 入門、 (SoftBankCreative、 2007)

堀 源一郎、 初めての力学講義、 (丸善株式会社、 1990)

エクスメディア、 ビジュアルラーニング Java 入門、 (株式会社エクスメディア、 2005)

芹沢 浩、 Java グラフィクス、 (技術評論者、2002)

Page 23: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

謝辞

この大学4年間を通して、講義やプレゼミ、ゼミで天文学、物理学、そして英語など多

岐にわたって熱心なご指導をしてくださった指導教授・田邉健茲先生には大変お世話にな

り、心から感謝しております。今こうして卒業論文を書き終え、無事卒業できるのも田邉

健茲先生のおかげであると思っております。 また、3年のプレゼミのころから一緒に勉強してきた今村和義さん、国富奈々絵さんの

助けがあったからこそ、今まで頑張って来られたのだと思います。この2年間は、貴重な

体験ができ、とても充実した2年間でした。 これも皆、田邉先生をはじめ、皆様のお陰です。これからは大学4年間で学んだことを

活かして、さらに邁進していきたいと思っております。大学4年間本当にありがとうござ

いました。

Appemdix-1 ルンゲ・クッタ法 class rakkaRunge2{ ←rakkaRunge2 というクラスを定義

double dt, t, x, y, u, v, k; ←dt, t, x, y, u, v, k を double 型変数に定義

Page 24: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

public rakkaRunge2(double dt, double y0, double v0, double x0,double u0,

double k0){ dt:刻み幅

y0:初期位置 y

v0:y 軸方向における初速度

x0:初期位置 x

u0:x 軸方向における初速度

k0: 30

20

rGMt

(パラメーター)

this.dt = dt;

this.t = 0;

this.y = y0;

this.v = v0;

this.x = x0;

this.u = u0;

this.k = k0;

}

private double p(double t, double y, double v, double x, double u){

return v;

}

private double q(double t, double y, double v, double x, double u){

return -k*y/Math.pow(x*x+y*y,1.5); ←y 方向における万有引力の式

}

private double f(double t, double y, double v, double x, double u){

return u;

}

private double g(double t, double y, double v, double x, double u){

return -k*x/Math.pow(x*x+y*y,1.5); ←x 方向における万有引力の式

}

public void step(){ ←step メソッドを定義

double s1 = dt*p(t, y, v, x, u);

double w1 = dt*q(t, y, v, x, u);

double s2 = dt*p(t + 0.5*dt, y + 0.5*s1, v + 0.5*w1, x, u);

double w2 = dt*q(t + 0.5*dt, y + 0.5*s1, v + 0.5*w1, x, u);

double s3 = dt*p(t + 0.5*dt, y + 0.5*s2, v + 0.5*w2, x, u);

double w3 = dt*q(t + 0.5*dt, y + 0.5*s2, v + 0.5*w2, x, u);

double s4 = dt*p(t + dt, y + s3, v + w3, x, u);

double w4 = dt*q(t + dt, y + s3, v + w3, x, u);

y = y + 1/6.0*(s1 + 2*s2 + 2*s3 + s4);

v = v + 1/6.0*(w1 + 2*w2 + 2*w3 + w4);

Page 25: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

double k1 = dt*f(t, y, v, x, u);

double j1 = dt*g(t, y, v, x, u);

double k2 = dt*f(t + 0.5*dt, y, v, x + 0.5*k1, u + 0.5*j1);

double j2 = dt*g(t + 0.5*dt, y, v, x + 0.5*k1, u + 0.5*j1);

double k3 = dt*f(t + 0.5*dt, y, v, x + 0.5*k2, u + 0.5*j2);

double j3 = dt*g(t + 0.5*dt, y, v, x + 0.5*k2, u + 0.5*j2);

double k4 = dt*f(t + dt, y, v, x + k3, u + j3);

double j4 = dt*g(t + dt, y, v, x + k3, u + j3);

x = x + 1/6.0*(k1 + 2*k2 + 2*k3 + k4);

u = u + 1/6.0*(j1 + 2*j2 + 2*j3 + j4);

t = t + dt;

} ↑4次のルンゲ・クッタ法のプログラム

public double gett(){

return this.t;

}

public double gety(){

return this.y;

}

public double getv(){

return this.v;

}

public double getx(){

return this.x;

}

public double getu(){

return this.u;

}

}

Appendix-2 1体近似のプログラム

class Vector {

double x;

Page 26: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

double y;

}

class Sun{ ←天体 A

Vector s1, s2;

double r, m;

Sun(double x, double y, double vx, double vy, double m, double r) {

s1 = new Vector();

s2 = new Vector();

this.s1.x = x;

this.s1.y = y;

this.s2.x = vx;

this.s2.y = vy;

this.m = m;

this.r = r;

}

}

class Earth{ ←天体 B

Vector e1, e2;

double r, m;

Earth(double x, double y, double vx, double vy, double m, double r) {

e1 = new Vector();

e2 = new Vector();

this.e1.x = x;

this.e1.y = y;

this.e2.x = vx;

this.e2.y = vy;

this.m = m;

this.r = r;

}

}

class rakkaCanvas extends Canvas implements Runnable {

Page 27: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

rakkaRunge2 rr2;

Sun sun;

Earth earth;

Thread th;

double t = 0;

int dt = 100; ←刻み幅

int cdt = 10;

public rakkaCanvas() {

this.sun = new Sun(400, 400, 0, 0, 100, 10);

this.earth = new Earth(490, 400, 0, 2, 5, 5);

}

public void run() {

while (th != null) {

move();

repaint();

t = t + dt/1000.0;

try{

Thread.sleep(dt);

}

catch(InterruptedException ex){ ←例外設定

}

}

}

public void move() {

double rx = earth.e1.x - sun.s1.x;

double ry = earth.e1.y - sun.s1.y;

this.rr2 = new rakkaRunge2(cdt/1000.0, ry, 0, rx, 0, 10);

for(int i = 0; i < 100; i++){

this.rr2.step();

}

Page 28: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

double u = this.rr2.getu();

double v = this.rr2.getv();

earth.e2.x = earth.e2.x + sun.m * u;

earth.e2.y = earth.e2.y + sun.m * v;

earth.e1.x += earth.e2.x;

earth.e1.y += earth.e2.y;

}

public void paint(Graphics g){

g.setColor(Color.RED);

g.fillOval((int)sun.s1.x -(int)sun.r, (int)sun.s1.y-(int)sun.r,

2 * (int)sun.r, 2 * (int)sun.r);

g.setColor(Color.BLUE);

g.fillOval((int)earth.e1.x-(int)earth.r, (int)earth.e1.y-(int)earth.r,

2 * (int)earth.r, 2 * (int)earth.r);

}

public void start(){ ←プログラムを開始

if(th == null){

th = new Thread(this);

th.start();

}

}

public void stop(){ ←プログラムを停止

th = null;

}

}

public class ittaikinji extends Applet{

rakkaCanvas canvas;

public void init(){

this.canvas = new rakkaCanvas();

Page 29: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

setLayout(new BorderLayout());

this.add(canvas);

}

public void paint(Graphics g){ ←グラフィックを描画

}

public void start() {

canvas.start();

}

public void stop() {

canvas.stop();

}

}

Appendix-3 2体問題のプログラム

Page 30: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

class Vector {

double x;

double y;

}

class Sun{ ←天体 A

Vector s1, s2;

double r, m;

Sun(double x, double y, double vx, double vy, double m, double r) {

s1 = new Vector();

s2 = new Vector();

this.s1.x = x;

this.s1.y = y;

this.s2.x = vx;

this.s2.y = vy;

this.m = m;

this.r = r;

}

}

class Earth{ ←天体 B

Vector e1, e2;

double r, m;

Earth(double x, double y, double vx, double vy, double m, double r) {

e1 = new Vector();

e2 = new Vector();

this.e1.x = x;

this.e1.y = y;

this.e2.x = vx;

this.e2.y = vy;

this.m = m;

this.r = r;

}

}

Page 31: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

class rakkaCanvas extends Canvas implements Runnable {

rakkaRunge10 rr10;

Sun sun;

Earth earth;

Thread th;

double t = 0;

int dt = 100;

int cdt = 10;

public rakkaCanvas() {

this.sun = new Sun(400, 400, 0, 0, 100, 10);

this.earth = new Earth(490, 400, 0, 2, 5, 5);

}

public void run() {

while (th != null) {

move();

repaint();

t = t + dt/1000.0;

try{

Thread.sleep(dt);

}

catch(InterruptedException ex){

}

}

}

public void move() {

double rx = earth.e1.x - sun.s1.x;

double ry = earth.e1.y - sun.s1.y;

this.rr10 = new rakkaRunge10(cdt/1000.0, ry, 0, rx, 0, 10);

for(int i = 0; i < 100; i++){

this.rr10.step();

Page 32: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

}

double u = this.rr10.getu();

double v = this.rr10.getv();

sun.s2.x = sun.s2.x - earth.m * u;

sun.s2.y = sun.s2.y - earth.m * v;

earth.e2.x = earth.e2.x + sun.m * u;

earth.e2.y = earth.e2.y + sun.m * v;

sun.s1.x += sun.s2.x;

sun.s1.y += sun.s2.y;

earth.e1.x += earth.e2.x;

earth.e1.y += earth.e2.y;

}

public void paint(Graphics g){

g.setColor(Color.RED);

g.fillOval((int)sun.s1.x -(int)sun.r, (int)sun.s1.y-(int)sun.r,

2 * (int)sun.r, 2 * (int)sun.r);

g.setColor(Color.BLUE);

g.fillOval((int)earth.e1.x-(int)earth.r, (int)earth.e1.y-(int)earth.r,

2 * (int)earth.r, 2 * (int)earth.r);

}

public void start(){

if(th == null){

th = new Thread(this);

th.start();

}

}

public void stop(){

th = null;

}

Page 33: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

}

public class nitai extends Applet{

rakkaCanvas canvas;

public void init(){

this.canvas = new rakkaCanvas();

setLayout(new BorderLayout());

this.add(canvas);

}

public void paint(Graphics g){

}

public void start() {

canvas.start();

}

public void stop() {

canvas.stop();

}

}

Appendix-4 制限3体問題のプログラム

Page 34: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

class Vector {

double x;

double y;

}

class Jusin{ ←重心

Vector j1, j2;

double r, m;

Jusin(double x, double y, double vx, double vy, double m, double r) {

j1 = new Vector();

j2 = new Vector();

this.j1.x = x;

this.j1.y = y;

this.j2.x = vx;

this.j2.y = vy;

this.m = m;

this.r = r;

}

} class Sun{ ←天体 A

Vector s1, s2;

double r, m;

Sun(double x, double y, double vx, double vy, double m, double r) {

s1 = new Vector();

s2 = new Vector();

this.s1.x = x;

this.s1.y = y;

this.s2.x = vx;

this.s2.y = vy;

this.m = m;

this.r = r;

}

}

class Earth{ ←天体 B

Page 35: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

Vector e1, e2;

double r, m;

Earth(double x, double y, double vx, double vy, double m, double r) {

e1 = new Vector();

e2 = new Vector();

this.e1.x = x;

this.e1.y = y;

this.e2.x = vx;

this.e2.y = vy;

this.m = m;

this.r = r;

}

}

class Luna{ ←テスト粒子

Vector l1, l2;

double r, m;

Luna(double x, double y, double vx, double vy, double m, double r) {

l1 = new Vector();

l2 = new Vector();

this.l1.x = x;

this.l1.y = y;

this.l2.x = vx;

this.l2.y = vy;

this.m = m;

this.r = r;

}

}

class rakkaCanvas extends Canvas implements Runnable {

santaiRunge3 sr;

Jusin jusin;

Sun sun;

Earth earth;

Page 36: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

Luna luna;

Thread th;

double t = 0;

int dt = 100;

int cdt = 10;

public rakkaCanvas() {

this.jusin = new Jusin(400, 400, 0, 0, 1, 1);

this.luna = new Luna(400, 400.8660254037844386, 0, 0, 1, 2);

this.sun = new Sun(395, 405, 0, 0, 1, 2);

this.earth = new Earth(405, 405, 0, 0, 1, 2);

}

public void run() {

while (th != null) {

move();

repaint();

t = t + dt/1000.0;

try{

Thread.sleep(dt);

}

catch(InterruptedException ex){

}

}

}

public void move() {

double rx = luna.l1.x - jusin.j1.x;

double ry = luna.l1.y - jusin.j1.y;

double a1 = jusin.j1.x - 0.5;

double a2 = jusin.j1.x + 0.5;

double rx1 = this.earth.e1.x - this.sun.s1.x;

double ry1 = this.earth.e1.y - this.sun.s1.y;

this.sr = new santaiRunge3(cdt/1000.0, ry, 0, rx, 0, 0.5, 0.5);

Page 37: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

for(int i = 0; i < 100; i++){

this.sr.step();

}

double u = this.sr.getu();

double v = this.sr.getv();

luna.l2.x = luna.l2.x - u;

luna.l2.y = luna.l2.y - v;

luna.l1.x += luna.l2.x;

luna.l1.y += luna.l2.y;

}

public void paint(Graphics g){

g.setColor(Color.GRAY);

g.fillOval((int)luna.l1.x-(int)luna.r, (int)luna.l1.y-(int)luna.r,

2* (int)luna.r, 2 * (int)luna.r);

g.setColor(Color.RED);

g.fillOval((int)sun.s1.x -(int)sun.r, (int)sun.s1.y-(int)sun.r,

2 * (int)sun.r, 2 * (int)sun.r);

g.setColor(Color.BLUE);

g.fillOval((int)earth.e1.x-(int)earth.r, (int)earth.e1.y-(int)earth.r,

2 * (int)earth.r, 2 * (int)earth.r);

}

public void start(){

if(th == null){

th = new Thread(this);

th.start();

}

}

Page 38: Java プログラミングと天体の運動 - big.ous.ac.jptanabe/students/graduate/soturon_java_ando.pdf · 要約 新しいコンピュータ言語であるJavaを用いて制限3体問題のシミュレーションのプログラ

public void stop(){

th = null;

}

}

public class sankakkei extends Applet{

rakkaCanvas canvas;

public void init(){

this.canvas = new rakkaCanvas();

setLayout(new BorderLayout());

this.add(canvas);

}

public void paint(Graphics g){

}

public void start() {

canvas.start();

}

public void stop() {

canvas.stop();

}

}