演習をする前に
演習の便利のために、 http://earth.sci.ehime-u.ac.jp/~kameyama/lectures-j.html 以下から、この演習で使う資料をたどれるようにしています。 復習する際などでも有効に利用してください。 ただし、[みほん] としている一部の プログラムのソースの閲覧は不可 としています。
またこの演習では、Linux を作業台として、Fortran 90 をプログラミング言語として用いていきます。 これらに自信のない人は、2年生後期の「地球物理学実験」の土屋(旬)・出倉先生担当分の資料 を復習しておくことを強く勧めます。
計算機環境の復習と演習の準備
これまでの多くの機会では Windows (10 とか 11 とか) を使ってきたであろうが、この授業では (Linux の一種である) CentOS を使って演習を進めていく。
もし自分の Windows 11 なパソコンで Linux を使ってみたくなった人は、WSL (Windows Subsystem for Linux) を使うのが最も簡単かと。 興味のある人は https://learn.microsoft.com/ja-jp/windows/wsl/install を参考にして、Ubuntu という Linux の一種をインストールしてみるとよいかも。
Linux の起動
まず何はなくとも、CentOS のデスクトップを起動させるところからスタートしよう。 やり方を忘れてしまった人は 総合情報メディアセンター のページ以下、「ITサービス」→「センター計算機」→「パソコン」のページに掲載されている手順を確認せよ。 具体的には、まずは「パソコン基本操作」で Windows 11 にログオンした後に、「Linux 利用」以下「起動方法」により Linux にログインする。 なお、演習終了後に Linux やパソコン本体を終了するには、「Linux 利用」あるいは「パソコン基本操作」以下の「終了方法」の手順に従ってください。
演習用の環境づくり
Linux のデスクトップが正しく立ち上がったら、各自のパソコンの画面上でこの演習資料が見えるようにしておこう。
- 画面の上端にある「メニューバー」(正式には「Gnome パネル」というらしい) の Firefox のアイコンをクリックするか、あるいは 「アプリケーション」から「インターネット」と進んで「Firefox ウェブ・ブラウザ」を選んで Firefox を起動し、
- 検索窓から「愛媛大学理学部理学科地学コース」の ホームページ に行き、
- 上側のメニューから「研究・教員」に行き、
- 下のほうにある亀山の行で のアイコンをクリックして 亀山のホームページ に行き、
- 左側のメニューから「講義資料」に行き、
- 「情報地球科学演習」の「演習ノート」をクリック
Linux の基本操作
続いて、Linux や「端末」の基本的な操作法を思い出してみよう。 この演習では主に「端末」を使って Linux を操作してもらうことになる。 即ち、「マウスでカチカチする」やり方ではなく、「キーボードからコマンドを入力する」やり方でコンピューターを操作することが多くなる。 この方法は確かに、(慣れるまでは) 面倒臭くて分かりにくいものなのだが、いったん慣れてしまえば「マウスでカチカチする」よりも圧倒的に速いスピードで操作できるようになる。
「端末」を立ち上げるには、画面の上端にある「メニューバー」(正式には「Gnome パネル」というらしい) の「アプリケーション」から「システムツール」と進んで「端末」を選べばOKである。 端末が開くと、その中には $ な記号が出ているはずだ。 これは「コマンドプロンプト」と呼ばれており、英語の prompt の意味の通り、ユーザからの指示 (コマンド) の入力を催促しているものである。
次に、この授業の演習で作成・操作するファイル一式をまとめておくフォルダ (正確な Linux 用語では「ディレクトリ (directory)」という) を作ってみよう。 開いた「端末」の中から、以下のように入力してみよ。 ただしコマンドプロンプトの $ は実際には入力する必要はない。
$ mkdir jouhouこれにより、jouhou という名前のフォルダ (ディレクトリ) が新たに作成されているはずだ。 なお mkdir とは、「次の名前のフォルダを新しく作ってください」という Linux の命令である (MaKe DIRectory のこと)。 いったん作ったフォルダを新たに作り直す必要はない訳だから、この操作は最初の1回だけやればよい。
ここまでできたら、端末の中で以下のように入力してみよ。
$ cd jouhouここで cd とは、「この端末でこれ以降の作業を実行する場所を、次の名前のフォルダの中に変更してください」という Linux の命令である (Change Directory のこと)。
ここまではクリアできただろうか。 来週以降の演習は、
- パソコンを起動して Windows 10 にログインし
- Linux のデスクトップ画面を立ち上げ、
- ウェブブラウザで「演習ノート」を開き、
- 端末を立ち上げ、
- jouhou という名前のフォルダ (ディレクトリ) の中に作業場所を移動しておく
なお (亀山はあまり使い方を知らないのだが) Windows でいうところの「エクスプローラ」みたいなものも、実はちゃんと用意されている。 画面上の「○○のホーム」というアイコンをクリックすると、各自の「ホームディレクトリ」の内容を見ることができる。
演習で用いるデータのダウンロード
今回の演習 (の前半) では、愛媛県松山市における1890年〜2023年までの134年間における、月ごとの平均気温 (元データは気象庁ホームページ以下より拝借) のデータを使って、簡単なデータ解析の実習を行う。
まず、ここ をクリックしてみよう。 使用するサンプルデータの中身を確認し、これをダウンロードしておくこと。
準備プログラムの作成
次は、以下に示した内容で、新しく enshu00.f90 という名前のファイルを作成しよう (別の画面で開きたい人は ここ を)。 ただし、「コピペ」はそう簡単にできないようになっているので、面倒でも自分で入力すること。
やり方を忘れてしまった人は、開いた「端末」の中から、以下のように入力するとよい。
$ gedit enshu00.f90 &これは「enshu00.f90 という名前のファイルの中身を編集したいので、gedit という名前のエディターを起動してください」という意味の命令である。 この際、enshu00.f90 という名前のファイルがまだない場合には、その名前のファイルを gedit が新しく作ってくれる。 また命令の最後に「&」をつけておくと、gedit が実行中でもその「端末」に別の命令を出すことができる。
ついでながら、この先 (卒業研究などで) Linux や プログラミングを「バリバリに」使う腹積もりの人は、gedit の代わりに emacs というエディターを使うようにすることを強くおススメする。 emacs は (gedit と比べて) 最初のハードルは高いけれど、プログラミング作業をする上での便利さは比べものにならない。 その気になった (なりそうな) 人は例えば EmacsWiki の中の「Emacsビギナ—」あたりから始めてみるといいかも。
p | r | o | g | r | a | m | e | n | s | h | u | 0 | 0 | |||||||||||||||||||||||||||||||||||||||||
i | m | p | l | i | c | i | t | n | o | n | e | |||||||||||||||||||||||||||||||||||||||||||
i | n | t | e | g | e | r | : | : | s | e | i | r | e | k | i | , | j | o | u | t | a | i | ||||||||||||||||||||||||||||||||
r | e | a | l | : | : | k | i | o | n | 0 | 1 | , | k | i | o | n | 0 | 2 | , | k | i | o | n | 0 | 3 | , | k | i | o | n | 0 | 4 | , | k | i | o | n | 0 | 5 | , | k | i | o | n | 0 | 6 | , | & | ||||||
k | i | o | n | 0 | 7 | , | k | i | o | n | 0 | 8 | , | k | i | o | n | 0 | 9 | , | k | i | o | n | 1 | 0 | , | k | i | o | n | 1 | 1 | , | k | i | o | n | 1 | 2 | ||||||||||||||
d | o | |||||||||||||||||||||||||||||||||||||||||||||||||||||
r | e | a | d | ( | * | , | ' | ( | i | 4 | , | 1 | 2 | f | 5 | . | 1 | ) | ' | , | i | o | s | t | a | t | = | j | o | u | t | a | i | ) | s | e | i | r | e | k | i | , | & | |||||||||||
k | i | o | n | 0 | 1 | , | k | i | o | n | 0 | 2 | , | k | i | o | n | 0 | 3 | , | k | i | o | n | 0 | 4 | , | k | i | o | n | 0 | 5 | , | k | i | o | n | 0 | 6 | , | & | ||||||||||||
k | i | o | n | 0 | 7 | , | k | i | o | n | 0 | 8 | , | k | i | o | n | 0 | 9 | , | k | i | o | n | 1 | 0 | , | k | i | o | n | 1 | 1 | , | k | i | o | n | 1 | 2 | ||||||||||||||
i | f | ( | j | o | u | t | a | i | / | = | 0 | ) | e | x | i | t | ||||||||||||||||||||||||||||||||||||||
w | r | i | t | e | ( | * | , | ' | ( | i | 4 | , | 1 | 2 | f | 6 | . | 1 | ) | ' | ) | s | e | i | r | e | k | i | , | & | ||||||||||||||||||||||||
k | i | o | n | 0 | 1 | , | k | i | o | n | 0 | 2 | , | k | i | o | n | 0 | 3 | , | k | i | o | n | 0 | 4 | , | k | i | o | n | 0 | 5 | , | k | i | o | n | 0 | 6 | , | & | ||||||||||||
k | i | o | n | 0 | 7 | , | k | i | o | n | 0 | 8 | , | k | i | o | n | 0 | 9 | , | k | i | o | n | 1 | 0 | , | k | i | o | n | 1 | 1 | , | k | i | o | n | 1 | 2 | ||||||||||||||
e | n | d | d | o | ||||||||||||||||||||||||||||||||||||||||||||||||||
e | n | d | p | r | o | g | r | a | m | e | n | s | h | u | 0 | 0 |
準備プログラムの実行
enshu00.f90 の入力ができたら、
$ gfortran enshu00.f90としてみよう (「コンパイルする」という)。 Fortran 90 の文法の間違いがなかった ら、gfortran から怒られることもなく、新たに a.out という名前のファイルが新しく作成されているはずだ。 a.out ができていない場合には、プログラムの中身に間違いがないかを確認した後に、上のコマンドをもう一度実行してみよ。
次は
$ cat matsuyama-kion.txt | ./a.outとしてみよう。 なお (最初だし念のため) 上で入力してほしい内容を「音読」してみると、「cat matsuyama-kion.txt」に 「たて棒 (|)」ときてから、 「ドット (.) スラッシュ (/) の直後に続けて a.out」である。 これらがどういう意味であるかは後日解説する (かも)。 またよくある日本語キーボードでは、「たて棒 (|)」は Shift キーと ¥ キーを同時に押すと入力できる。
自分で作った enshu00.f90の中に 間違いが一つもなかった ら、上で入力したコマンドの出力として、端末には以下のように表示されているはずだ (最後の3行分のみ示す)。
2021 6.2 8.9 12.7 15.5 19.5 23.4 27.2 27.5 25.0 20.1 13.7 8.8 2022 5.9 5.2 11.9 15.9 19.3 24.1 27.8 29.1 26.2 19.2 15.5 7.4 2023 6.5 7.6 12.7 15.9 19.8 23.1 28.0 28.9 27.3 19.4 14.8 9.3
うまくできない場合は、自分で作った enshu00.f90 の中に 本当に間違いがないか を確認せよ。 プログラムの間違いが修正できたら、改めて
$ gfortran enshu00.f90とし、gfortran から怒られなかったことを確認せよ。 これにより、enshu00.f90 に加えた修正を反映した a.out が作成されたことになる。 この新しい a.out を用いてもう一度
$ cat matsuyama-kion.txt | ./a.outと入力してプログラムを動かし、本当に正しく動いたかどうかを確認せよ。
準備プログラムの解説
- プログラムの基本構成
- 「変数」の「宣言」
- 実際に行わせたい処理の手順を記述
- プログラムで行う処理の流れ
基本的には 「上から下へと」 進んでいくのだが、実際のプログラミングでも
- 同じ処理の繰り返し (ループ)
- 条件によって処理の場合分け
今回の演習で行ってもらうプログラミングはもちろんのこと、一般的に「プログラミング」をマスターするためのコツは、 データの構造 (データの並び方、データの蓄え方) と 処理の構造 (順次・反復・分岐) の2つを理解することにある。
基本プログラムの作成
先に作った enshu00.f90 を手直しして、もう少し使い勝手のよいプログラムに作り変えることにしよう。 以下に示した内容で、新しく enshu01.f90 という名前のファイルを作成せよ (別の画面で開きたい人は ここ を)。 その際、enshu00.f90 と enshu01.f90 の2つで、どこがどう違うか に注目せよ。
なお (当然気付いているとは思うが)、もともとの enshu00.f90 をコピーして enshu01.f90 を作り、それを編集するのが簡単。 やり方を忘れてしまった人は、「端末」で以下のように入力せよ ($ はコマンドプロンプト)。
$ cp enshu00.f90 enshu01.f90ここで (やはり当然気付いているとは思うが) cp とは「次の名前のファイルを複製して、その次の名前のファイルを作ってください」という Linux の命令である (CoPy のこと)。 プログラムの変更が終わったら、改めて
$ gedit enshu01.f90 &
$ gfortran enshu01.f90とし、gfortran から怒られなかったことを確認せよ。 これにより、enshu01.f90 の内容に基づいた a.out が作成されたことになる。 この新しい a.out を用いてもう一度
$ cat matsuyama-kion.txt | ./a.outと入力してプログラムを動かし、本当に正しく動いたかどうかを確認せよ。 自分で作った enshu01.f90の中に 間違いが一つもなかった ら、上で入力したコマンドの出力として、端末には以下のように表示されているはずだ (最後の3行分のみ示す)。
2021 6.2 8.9 12.7 15.5 19.5 23.4 27.2 27.5 25.0 20.1 13.7 8.8 2022 5.9 5.2 11.9 15.9 19.3 24.1 27.8 29.1 26.2 19.2 15.5 7.4 2023 6.5 7.6 12.7 15.9 19.8 23.1 28.0 28.9 27.3 19.4 14.8 9.3
ここで作った enshu01.f90 というファイルは大事に保存 しておくこと。 このプログラムは 以降の実習の基本としてフル活用される 予定。 また本日の演習の出席確認のため、このプログラムを 末尾のフォーム 経由で提出せよ。
p | r | o | g | r | a | m | e | n | s | h | u | 0 | 1 | |||||||||||||||||||||||||||||||||||||||
i | m | p | l | i | c | i | t | n | o | n | e | |||||||||||||||||||||||||||||||||||||||||
i | n | t | e | g | e | r | : | : | s | e | i | r | e | k | i | , | j | o | u | t | a | i | ||||||||||||||||||||||||||||||
r | e | a | l | , | d | i | m | e | n | s | i | o | n | ( | 1 | 2 | ) | : | : | k | i | o | n | |||||||||||||||||||||||||||||
d | o | |||||||||||||||||||||||||||||||||||||||||||||||||||
r | e | a | d | ( | * | , | ' | ( | i | 4 | , | 1 | 2 | f | 5 | . | 1 | ) | ' | , | i | o | s | t | a | t | = | j | o | u | t | a | i | ) | s | e | i | r | e | k | i | , | k | i | o | n | ||||||
i | f | ( | j | o | u | t | a | i | / | = | 0 | ) | e | x | i | t | ||||||||||||||||||||||||||||||||||||
w | r | i | t | e | ( | * | , | ' | ( | i | 4 | , | 1 | 2 | f | 6 | . | 1 | ) | ' | ) | s | e | i | r | e | k | i | , | k | i | o | n | |||||||||||||||||||
e | n | d | d | o | ||||||||||||||||||||||||||||||||||||||||||||||||
e | n | d | p | r | o | g | r | a | m | e | n | s | h | u | 0 | 1 |
配列とは
enshu00.f90 と enshu01.f90 の大きな違いは、enshu01.f90 では 配列 を使ってデータを管理していることである。 では、「配列」とは何だろうか?
ふつうの「変数」は、1つの値だけしか入れることができない「器」である。 これに対し「配列 (array)」とは、同じ種類の いくつもの「変数」をまとめて作った1つの「かたまり」 のことである。 具体的には enshu01.f90 では、
- 12個の実数 (要するに「毎月の平均気温」) をまとめて入れることのできる kion という「かたまり」を用意し、
- kion の中にある12個の「入れ場所」のうち、
1 番目には 1 月の平均気温 2 番目には 2 月の平均気温 .... 12 番目には 12 月の平均気温
簡単なグラフを描く
1限の講義でも既に述べた通り、「グラフにしてみる」ことも「データ処理」における大事な作法の1つである。 そこで、Linux 上で動く簡単なグラフ化ツールである Gnuplot を使ってみよう。
まずは端末で以下のように入力してみよう ($ は端末のコマンドプロンプト)。
$ gnuplotすると Gnuplot の入力画面に入る。 そこで例えば (gnuplot>は Gnuplot のプロンプト)
gnuplot> plot sin(x),cos(x)と入力すれば、画面に \(y=\sin(x)\) と \(y=\cos(x)\) の2つのグラフが表示されているはずだ。 その後
gnuplot> quitとすれば Gnuplot から抜け出して、通常のコマンドプロンプトへ戻ってくる。
Gnuplot は、高校までで習うような関数はたいがい知っている。 自分が思いつく関数をいくつか Gnuplot で表示させてみよ。
ちょっと複雑な例では
gnuplot> plot 0.5+atan(5*x)/piとか
gnuplot> plot exp(-x**2/2)/sqrt(2*pi)なんてのもOK。 ただし atan は逆正接関数 (arc tangent)、 exp は \(e\) を底とする指数関数 (exponential function)、 **2 は平方 (2乗) で sqrt は平方根 (square root)、 pi は円周率 \(\pi=3.141592\ldots\) のこと。 またグラフの横軸の範囲を指定して表示するには、例えば以下のようにする。
gnuplot> plot [-5:5] exp(-x**2/2)/sqrt(2*pi)これにより、横軸の範囲が \(-5\le{x}\le5\) のみになったグラフが表示されるはずだ。 なおこの \(y=\dfrac{1}{\sqrt{2\pi}}\exp\left(-\dfrac{x^2}{2}\right)\) などという形の関数は一般に「ガウス関数」(Gaussian function) と呼ばれており、統計学や誤差論で「正規分布」を習う際に必ず出てくる大事なものである (1限の授業でもそのうち出てくる)。 表示されたグラフを見ながら、この関数の特徴を記憶に残しておいてほしい。
これ以外にも Gnuplot には、ファイルから読み込んだデータをグラフにする機能が備わっている。 そこで例えば
gnuplot> plot "matsuyama-kion.txt" using 1:5とすると、matsuyama-kion.txt の1列目 (西暦) を横軸に、5列目 (4月の平均気温) を縦軸にとったグラフが表示される。 さらに
gnuplot> plot "matsuyama-kion.txt" using 1:5 with linesとすれば、4月の平均気温が折れ線グラフで表示される。 同じようなやり方を使って、各月の平均気温の変化をグラフにして表示してみよ。 またグラフの横軸の範囲を指定することにより、最近10年間の4月の平均気温の変化もグラフに表示してみよ。
Gnuplot は画面上にグラフを描かせるだけでなく、描かせたグラフを画像として保存することもできる。 そのためには、例えば以下のようにすればよい。
gnuplot> plot [-5:5] exp(-x**2/2)/sqrt(2*pi)これにより、グラフは画面に出力される代わりに、mygraph.png という名前のファイルに描かれるようになる。 なお replot とは、先に描いたグラフをもう一度 Gnuplot に描かせるための命令である。
gnuplot> set terminal png
gnuplot> set output "mygraph.png"
gnuplot> replot
出席確認用プログラム提出フォーム
Moodle のコースページ 以下の 課題ファイル提出 により、各自で作成した enshu01.f90 (に相当する) Fortran 90 プログラムの最終版を提出せよ。