PREVIOUS | TOP | NEXT

(第12回)常微分方程式の数値解法(2)

基本資料

C言語基礎まとめ

その他の参考資料

基本文法のまとめ

プログラミング言語C 以降、K & Rと略記します。

関連のあるPDFの資料

目標

前回の演習では、オイラー法の精度について学んだ。 今回は、オイラー法のプログラムを用いて、 最大飛距離の問題に取り組む。 最大飛距離の問題とは、 同じスピードで物体を投げる場合に どの角度で投げると飛距離が最大となるか? という問題である。 この課題に取り組むことで、 計算機を用いた 物理の研究の流れをつかむことが、 今回の目標である。

オイラー法(復習)

最大飛距離

以下の課題をとおして 計算機を使った考察のやり方を身につける:

  1. 角度Θで物体を投げたときの飛距離について調べます。
  2. まず、gnuplotで 様々なΘで 運動の軌跡をグラフ表示します。 グラフから飛距離を読み取ります。
  3. これであたりをつかんだ上で、つぎに、 飛距離の計算をするプログラムをつくります。

課題1

先週作成したプログラムをつかって、 放物運動についてさらに考察をすすめよう。
Θを、 Θ=40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
と変えて、物体の運動を計算せよ。

これらのデータをgnuplotでプロットして 飛距離(つまり、y=0に戻ってきたときのx座標の値) をグラフから読み取り、テキストファイルに記録する。 このデータから、物体をどの角度で投げるともっとも遠くまで飛ぶかを見積もる。

この飛距離のデータを印刷して、 その用紙に飛距離が最大となる角度を記入しなさい。

課題2a

課題1ではグラフから飛距離を読みとった。 この作業を自動化したい。 そこで、まず、投射角度Θが、
Θ=40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
のときの軌道(x, y)を自動で計算するように ソースコードを改造する。ソースコードを記せ。 また、プログラムを走らせた実行結果のうち、 それぞれの角度Θと、そのときyが負になる直前の xの値を、記せ。

課題2b

課題2aのプログラムにさらに工夫を加えて、 それぞれの角度Θと、そのときyが負になる直前の xの値を出力するようにプログラムを改造する。

課題2c

課題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」は最終レポートに組み込めば間に合います。 発展課題も任意提出ですが、 提出した場合は成績にボーナス点を加えることにします。 提出の締め切りは、最終回の演習の時間までです。


PREVIOUS | TOP | NEXT