プログラミング言語C
以降、K & Rと略記します。
前回の演習では、オイラー法の精度について学んだ。 今回は、オイラー法のプログラムを用いて、 最大飛距離の問題に取り組む。 最大飛距離の問題とは、 同じスピードで物体を投げる場合に どの角度で投げると飛距離が最大となるか? という問題である。 この課題に取り組むことで、 計算機を用いた 物理の研究の流れをつかむことが、 今回の目標である。
以下の課題をとおして 計算機を使った考察のやり方を身につける:
先週作成したプログラムをつかって、
放物運動についてさらに考察をすすめよう。
Θを、
Θ=40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
と変えて、物体の運動を計算せよ。
これらのデータをgnuplotでプロットして 飛距離(つまり、y=0に戻ってきたときのx座標の値) をグラフから読み取り、テキストファイルに記録する。 このデータから、物体をどの角度で投げるともっとも遠くまで飛ぶかを見積もる。
この飛距離のデータを印刷して、 その用紙に飛距離が最大となる角度を記入しなさい。
課題1ではグラフから飛距離を読みとった。
この作業を自動化したい。
そこで、まず、投射角度Θが、
Θ=40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
のときの軌道(x, y)を自動で計算するように
ソースコードを改造する。ソースコードを記せ。
また、プログラムを走らせた実行結果のうち、
それぞれの角度Θと、そのときyが負になる直前の
xの値を、記せ。
課題2aのプログラムにさらに工夫を加えて、 それぞれの角度Θと、そのときyが負になる直前の xの値を出力するようにプログラムを改造する。
課題2bのプログラムにさらに工夫を加えて、 飛距離を計算するプログラムをつくれ。 結果を出力せよ。 課題1のおおざっぱな見積もりと定性的に一致していることを確認せよ。 確認できたら、さらにΘの刻みを小さくすることで、 最大飛距離をあたえるΘの値を高い精度で求めよ。 gnuplotで横軸Θにたいして、縦軸に最大飛距離を プロットせよ。
ヒント
飛距離を計算するには、
課題1のプログラムの繰り返しのところを、
tn,
xn,
yn,
と
tn+1,
xn+1,
yn+1,
を記憶するようにして、
yn >= 0 かつ yn+1 < 0
まで繰り返すように変更する。
そして、飛距離は
(xn,
yn)と
(xn+1,
yn+1)とを内分する点でy=0を満たす点のx座標として求めることができる。
オイラー法ではΔ〜dtであることから、 dtを相当小さくしないと、 高い精度で運動を計算することが出来なかった。 Δ〜dtm(m>1は整数)を満たす数値解法は 高次解法と呼ばれている。 この場合はdtをオイラー法よりもずっと大きくとっても高い精度で計算することができる。 2次のルンゲ・クッタ法を参考に、 ルンゲクッタ法のプログラムを作成し、 その精度について考察せよ。
「課題1」のグラフと「課題2a」 のソースコードを印刷したものを提出すること。 最終レポートの前哨戦として、LaTeX ( 第5回参照)をつかって、 以下のような形式にするとよいでしょう。 この例では、LaTeXソースファイルは、「dynamics1.tex 」としてあります。 (これは、あくまでも例です。各自の好みの文章を つかってください。)
グラフは(ここでは、「trajectory1.eps」としておく) は「dynamics1.tex 」とおなじディレクトリー(Documents)に置いておく必要があります。
%%%%%%%%%%%%%%%%%%%%%%%% %%% dynamics1.tex %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%% \documentclass[12pt]{jsarticle} \usepackage{amsmath,amssymb} \usepackage{graphicx} \begin{document} \title{第12回(放物運動): 飛距離の投射角度依存性} \author{a2 or b2 著者名 学生番号} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{課題1: 投射角度の変化と物体の軌道} \label{sec:trajectory1} %%%%%%%%%%%%%%%%%%%%%%%%%%%% 先週のプログラムで、プログラムの実行時に 1つめの入力である$\theta$を、 $\theta = 40, 41, \cdots, 50$ と変化させて 得た 軌道を$(x,y)$ のグラフをまとめて表わすと つぎのようになる。 \begin{figure}[hb] \begin{center} \scalebox{.3}{\includegraphics{trajectory1.eps}} \caption{$\theta = 40, 41, \cdots, 50$での軌道} \label{fig:trajectory} \end{center} \end{figure} %%%%%%%%%%%%%%%%%%% % となる。ここで、データの第1列が角度$\theta$、 第2列が飛距離である。 これから、最大飛距離をあたえる $\theta$ は... であることがわかる。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{課題2a: 投射角度の変化の記述の自動化} \label{sec:source2} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \noindent 投射角度の変化をソースコードのなかで指示するようにする。 そのソースコードは、つぎのようになる。 %(※ この後、ソースコードの概要を記述するとよい。) \begin{verbatim} % ここにソースコードを記述する #include ... #define PI 3.141592 int main() { ...... ...... return 0; } \end{verbatim} %%%%%%%%%%% 実行結果はつぎにようになる。 %%%%%%%%%%%%% これから、最大飛距離を読み取ると、 \begin{verbatim} Θ yが負になる直前のxの値 ----------------------------------------- 40 ... 41 ... 42 ............ .... .... \end{verbatim} \copyright \ 2016 名前 \end{document}この後、
$ platex dynamics1 $ dvipdfmx dynamics1.dvi $ evince dynamics1.pdf &次に、起動した『ドキュメント・ビューア』のメニューで ファイル → 印刷 をえらぶ。 (あるいは、「Ctrl - p」でもよい。) 出てきたウィンドウで印刷ボタンを押す。
「課題2b」は最終レポートに組み込めば間に合います。
発展課題も任意提出ですが、
提出した場合は成績にボーナス点を加えることにします。
提出の締め切りは、最終回の演習の時間までです。