運動方程式の方法: 惑星の軌道 出席のメール(件名に学生番号と氏名)に,中点法をサブルーチンを使って書いたプログラムを添付

Slides:



Advertisements
Similar presentations
プログラミング Ⅱ 第2回 第1回(プログラミングⅠの復 習) の解説. プログラムの作り方 いきなり完全版を作るのではなく,だんだ んふくらませていきます. TicTa cToe1.
Advertisements

計算物理2013年度 磁気相転移の臨界指数を求める. 今回の授業の目的 磁石が温度によって磁化をもったり,もたなかっ たりする様を計算機シミュレーションで調べる これは本当に数値実験。これを発展させて,脳の ニューロンの発火具合などのシミュレーションも 可能となる。
神戸大・理 2009 年度 地球および惑星大気科学実習 (2009/07/17) 資料をもとに作成.
第14回:表計算の発展的話題 2015 年 7 月 21 日 清見礼.  本日の授業の資料は今日中に 7/jc2015.html においておく。  どうしてもうまくダウンロードできない、見るこ とができない、などあれば.
第 5 章 2 次元モデル Chapter 5 2-dimensional model. Contents 1.2 次元モデル 2-dimensional model 2. 弱形式 Weak form 3.FEM 近似 FEM approximation 4. まとめ Summary.
初年次セミナー 第13回 2次元グラフィックス(1).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
Fortran と有限差分法の 入門の入門の…
・力のモーメント ・角運動量 ・力のモーメントと角運動量の関係
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
英語勉強会.
Ex7. Search for Vacuum Problem
FORTRAN 科学技術計算用 数値演算精度を重視したシステム K=0 DO 10 I=0,N,1 K=K+I 10 CONTINUE
Ex8. Search for Vacuum Problem(2)
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
シミュレーション物理3 プログラミングの基本 その2
数値計算及び実習 第3回 プログラミングの基礎(1).
2010年7月9日 統計数理研究所 オープンハウス 確率モデル推定パラメータ値を用いた市場木材価格の期間構造変化の探求 Searching for Structural Change in Market-Based Log Price with Regard to the Estimated Parameters.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
常微分方程式と偏微分方程式 1.常微分方程式 独立変数が一個のもの 振動の運動方程式 2.偏微分方程式 独立変数が二個以上のもの
重力3体問題の数値積分Integration of 3-body encounter.
シミュレーション物理5 運動方程式の方法: サブルーチンの使い方.
大阪工業大学 情報科学部 情報システム学科 宇宙物理研究室 B 木村悠哉
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
第6章 2重ループ&配列 2重ループと配列をやります.
シミュレーション物理7 乱数.
重力レンズ効果を想定した回転する ブラックホールの周りの粒子の軌道
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
誤差の二乗和の一次導関数 偏微分.
Northrop Grumman RQ-4 Global Hawk
Licensing information
動力学(Dynamics) 運動方程式のまとめ 2008.6.17
北極振動指数と日本各地の気温の関係を調べる
第7回 条件による繰り返し.
繰り返し計算 while文, for文.
Borland Delphi 6 でビジュアルプログラミング
電界中の電子の運動 シミュレータ作成 精密工学科プログラミング基礎 資料.
コンピュータに計算させる命令を確かめよう!
情報とコンピュータ 静岡大学工学部 安藤和敏
情報とコンピュータ 静岡大学工学部 安藤和敏
講義では、Cプログラミングの基本を学び 演習では、やや実践的なプログラミングを通して学ぶ
第7回 条件による繰り返し.
Bursty Bulk Flow 生成に関する理論モデル
デジタル画像とC言語.
動力学(Dynamics) 力と運動方程式 2008.6.10
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
情報処理 タイマの基礎 R8C タイマの基礎.
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
Ex7. Search for Vacuum Problem
シミュレーション物理2 プログラミングの基本
制御文の役割と種類 IF文 論理式と関係演算子 GO TO文
C言語 はじめに 2016年 吉田研究室.
情報とコンピュータ 静岡大学工学部 安藤和敏
Numerical solution of the time-dependent Schrödinger equation (TDSE)
シミュレーション物理 大槻東巳.
統計ソフトウエアRの基礎.
北大MMCセミナー 第62回 附属社会創造数学センター主催 Date: 2016年11月4日(金) 16:30~18:00
シミュレーション物理4 運動方程式の方法.
バネモデルの シミュレータ作成 精密工学科プログラミング基礎 資料.
高度プログラミング演習 (11).
How shall we do “Numerical Simulation”?
湘南工科大学 2013年10月22日 情報理論2 湘南工科大学情報工学科 准教授 小林 学.
プログラミング入門2 第5回 配列 変数宣言、初期化について
printf・scanf・変数・四則演算
情報基礎A 第14週プログラミング 実際のデータ処理での応用(2)
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
シミュレーション物理8 磁性.
Presentation transcript:

運動方程式の方法: 惑星の軌道 出席のメール(件名に学生番号と氏名)に,中点法をサブルーチンを使って書いたプログラムを添付 シミュレーション物理6 運動方程式の方法: 惑星の軌道 出席のメール(件名に学生番号と氏名)に,中点法をサブルーチンを使って書いたプログラムを添付

今回の授業の目的 4次のRunge-Kutta法を用いて,惑星の軌道のシミュレーションを行う

rk4.f90 4次のルンゲークッタ法 Dt4まで正しい。 高精度の数値計算に向いている。 これ以上次数を上げると,表式が複雑になりかえって計算時間がかかる。

自由落下のプログラムをrk4.f90を使うよう改良 program freefall !------------------------- ! This is a program to investigate the free fall ! 2005/5/12 Written by T. Ohtsuki ! Runge-Kutta method, subroutine used ! derivs is used as a subprogram, using "contains". ! This makes parameters in the procedure derivs global variables implicit none ! Always begin with this statement integer,parameter::double=selected_real_kind(14) real(kind=double), parameter::zero=0.0_double,one=1.0_double,half=0.5_double real(kind=double),parameter::pi=3.1415926535897932 integer,parameter::nd=2 ! dimension of the equation real(kind=double),dimension(nd)::y,dydx,yout !位置,速度はベクトルで定義 real(kind=double)::deltat,t,tmax,analytic integer::i,nmax real(kind=double),parameter::g=9.8_double,gamma=1.0_double external:: derivsfreefall !---------main program--------- deltat=0.05_double t=zero y(1)=zero ! initial velocity,初期値も当然変わる y(2)=zero ! initial position

tmax=5._double nmax=int((tmax-deltat/2._double)/deltat)+1 do i=1,nmax call derivsfreefall(nd,t,y,dydx) ! 微分係数を求める call rk4(nd,y,dydx,t,deltat,yout,derivsfreefall) !微分係数を使ってΔtだけ時間発展 y=yout end do tmax=deltat*nmax analytic=-g*tmax/gamma-g/gamma**2*exp(-gamma*tmax)+g/gamma**2 !ここら辺もいらない print *,tmax,y(2),analytic end program freefall

微分を求めるサブルーチン, derivsfreefall.f90として保存 !------------------- Subroutines --------------------- SUBROUTINE derivsfreefall(nd,x,y,dydx) !------------------------- ! subroutine derivs ! nd : dimension of y ! x : time (usually time independent) ! dydx: first derivative w.r.t. time, not a partial derivative IMPLICIT NONE integer,parameter::double=selected_real_kind(14) integer::nd REAL(kind=double), INTENT(IN) :: x REAL(kind=double), DIMENSION(nd), INTENT(IN) :: y REAL(kind=double), DIMENSION(nd), INTENT(OUT) :: dydx real(kind=double),parameter::g=9.8_double,gamma=1.0_double dydx(1)=-(g+gamma*y(1)) !g, gamma are global values!ここは当然変える dydx(2)=y(1) END SUBROUTINE derivsfreefall

これは非常に汎用性が高い。 rk4.f90として保存 SUBROUTINE rk4(nd,y,dydx,x,h,yout,derivs) !------------------------- ! This is a Runge-Kutta subroutine ! 2005/5/11 Written by T. Ohtsuki IMPLICIT NONE integer,parameter::double=selected_real_kind(14) integer::nd REAL(kind=double), DIMENSION(nd), INTENT(IN) :: y,dydx REAL(kind=double), INTENT(IN) :: x,h REAL(kind=double), DIMENSION(nd), INTENT(OUT) :: yout INTERFACE SUBROUTINE derivs(nd,x,y,dydx) REAL(kind=double), INTENT(IN) :: x REAL(kind=double), DIMENSION(nd), INTENT(IN) :: y REAL(kind=double), DIMENSION(nd), INTENT(OUT) :: dydx END SUBROUTINE derivs END INTERFACE REAL(kind=double) :: h6,hh,xh REAL(kind=double), DIMENSION(size(y)) :: dym,dyt,yt hh=h*0.5_double h6=h/6.0_double xh=x+hh yt=y+hh*dydx call derivs(nd,xh,yt,dyt) yt=y+hh*dyt call derivs(nd,xh,yt,dym) yt=y+h*dym dym=dyt+dym call derivs(nd,x+h,yt,dyt) yout=y+h6*(dydx+dyt+2.0_double*dym) END SUBROUTINE rk4 これは非常に汎用性が高い。 rk4.f90として保存

dahlmanにアップロード, f90 –c derivsfreefall.f90 f90 –c rk4.f90 f90 freefallrk4.f90 derivsfreefall.o rk4.o a.out 精度が非常によいことを確認する

自由落下のプログラムを惑星の軌道を求めるプログラムに変更 program freefall ! Orbitとでもする !------------------------- ! This is a program to investigate the free fall ! 2005/5/12 Written by T. Ohtsuki ! Runge-Kutta method, subroutine used ! derivs is used as a subprogram, using "contains". ! This makes parameters in the procedure derivs global variables implicit none ! Always begin with this statement integer,parameter::double=selected_real_kind(14) real(kind=double), parameter::zero=0.0_double,one=1.0_double,half=0.5_double real(kind=double),parameter::pi=3.1415926535897932 integer,parameter::nd=2 ! dimension of the equation!,直線運動でなく面内の運動なのでnd=2x2=4 real(kind=double),dimension(nd)::y,dydx,yout real(kind=double)::deltat,t,tmax,analytic integer::i,nmax real(kind=double),parameter::g=9.8_double,gamma=1.0_double, これはいらなくなる External:: derivsfreefall ! これはderivsplanetに変更。 !---------main program--------- deltat=0.05_double t=zero y(1)=zero ! initial velocity,初期値も当然変わる y(2)=zero ! initial position

tmax=5._double nmax=int((tmax-deltat/2._double)/deltat)+1 do i=1,nmax!ここは全く変えなくてよい! call derivs(nd,t,y,dydx) call rk4(nd,y,dydx,t,deltat,yout,derivs) y=yout end do tmax=deltat*nmax analytic=-g*tmax/gamma-g/gamma**2*exp(-gamma*tmax)+g/gamma**2 !ここら辺もいらない print *,tmax,y(2),analytic end program freefall

プログラムのチェックは? エネルギーの保存則: よって が一定である必要がある 角運動量保存則: よって が一定である必要がある

変数 vx,vy,x,yをy(1),y(2),y(3),y(4)とする。順番は別にどうでもよいが,x, vx,y, vyというように位置と速さが混ざると粒子が増えてきたとき,面倒になる場合がある。

入出力 これまでは,画面からパラメータを入力して,画面に結果を書かせていた。 Read *,x Print *,x など。これだとあとで軌道を描かせたりするのが面倒 open,close, read, writeを使う open(1,file=“planetorbit.txt” ) ! ファイルplanetorbit.txtを1番の出力先として指定        ! 別に1でなくても2でも10でも構わない。 ! 複数のファイルをあけて,xは1に,yは10に書くのも可能 Write(1,’(e14.7)’)pi**3 ! ‘(・・)’で書き方を指定。これは指数を使うやり方 Write(1,’(f14.7)’)pi**3 ! これは指数を使わないやり方。                !14個の幅を使い,有効数字7桁という意味 !例えば’(i5)’なら5桁の整数を書く。答えが3桁なら2個空白となる。6桁以上だとX close(1) Open(1,file=“planetorbit.txt”) Read(1,*) x Close(1)

できあがったプログラムを見てみよう program planetorbit !------------------------- ! This is a program to analyze the planetary motion ! 2005/5/19 Written by T. Ohtsuki ! Runge-Kutta method, subroutine used ! derivs is used as a subprogram, using "contains". use ConservationLaw !保存則をチェックするモジュールを使う implicit none ! Always begin with this statement integer,parameter::double=selected_real_kind(14) real(kind=double), parameter::zero=0.0_double,one=1.0_double,half=0.5_double real(kind=double),parameter::pi=3.1415926535897932 integer,parameter::nd=4 ! dimension of the equation real(kind=double),dimension(nd)::y,dydx,yout real(kind=double)::deltat,t,tmax,energy,AngularMomentum integer::i,nmax external:: derivsplanet !---------main program--------- deltat=0.05_double tmax=5._double nmax=int((tmax-deltat/2._double)/deltat)+1

t=zero ! y(1):vx,y(2)=vy,y(3)=x,y(4)=y y(1)=one ! initial x-velocity y(2)=zero ! initial y-velocity y(3)=zero ! initial x-position y(4)=one ! initial y-position call ConservedVariables(nd,y,energy,AngularMomentum) open(1,file='planetorbit.txt') write(1,'(5f14.7)')t,y(3),y(4),energy,AngularMomentum !---------------------------------- ! beginning of the time evolution do i=1,nmax call derivsplanet(nd,t,y,dydx) call rk4(nd,y,dydx,t,deltat,yout,derivsplanet) y=yout t=t+deltat end do close(1) end program planetorbit

これをderivsplanet.f90として保存 !------------------- Subroutines --------------------- SUBROUTINE derivsplanet(nd,x,y,dydx) !------------------------- ! subroutine derivsplanet ! nd : dimension of y ! x : time (usually time independent) ! dydx: first derivative w.r.t. time, not a partial derivative IMPLICIT NONE integer,parameter::double=selected_real_kind(14) integer::nd REAL(kind=double), INTENT(IN) :: x REAL(kind=double), DIMENSION(nd), INTENT(IN) :: y REAL(kind=double), DIMENSION(nd), INTENT(OUT) :: dydx dydx(1)=-y(3)/sqrt(y(3)**2+y(4)**2)**3 dydx(2)=-y(4)/sqrt(y(3)**2+y(4)**2)**3 dydx(3)=y(1) dydx(4)=y(2) END SUBROUTINE derivsplanet

保存則はモジュールで計算,conservationlaw.f90というファイルを用意 module ConservationLaw implicit none contains subroutine ConservedVariables(nd,y,energy,AngularMomentum) !------------------------- ! subroutine for examining the conserved quantity IMPLICIT NONE integer::nd integer,parameter::double=selected_real_kind(14) REAL(kind=double), dimension(nd),INTENT(IN) ::y REAL(kind=double), INTENT(OUT)::energy,AngularMomentum energy=(y(1)**2+y(2)**2)/2._double-1._double/sqrt(y(3)**2+y(4)**2) AngularMomentum=y(3)*y(2)-y(4)*y(1) END subroutine ConservedVariables end module ConservationLaw

実行のさせ方 まずモジュールをコンパイル 次にrk4.f90,derivsplanet.f90をコンパイル(申してある場合はよい) f90 –c conservationlaw.f90 次にrk4.f90,derivsplanet.f90をコンパイル(申してある場合はよい) f90 –c rk4.f90 f90 –c derivsplanet.f90 最後に実行ファイルを作る f90 planetrk4.f90 conservationlaw.o rk4.o derivsplanet.o 実行ファイル名を例えばorbit.outにしたければ f90 –o orbit.out planetrk4.f90 conservationlaw.o rk4.o derivsplanet.o

課題 いろいろな初期条件で,軌道を描かせる。 軌道はffftpでダウンロードし,エクセルで描かせる 課題  いろいろな初期条件で,軌道を描かせる。 軌道はffftpでダウンロードし,エクセルで描かせる 来週はフォローアップ,今週で来た人は来なくてよい。出席は取りません。