前回のあらまし
前回の記事では、$f(x)=\sin(x^2)$(およびその積分)の性質について、gnuplotを用いて簡単に調べた。次の課題としては、数値積分を行なって、この関数の積分値
\begin{equation}A_k = \int_{\sqrt{k\pi}}^{\sqrt{(k+1)\pi}}f(x)dx\end{equation}
の列が単調減少列
\begin{equation}A_1 > A_2 > \cdots > A_k > \cdots\end{equation}
であるという予想を確認したい。
計算にはpythonというプログラミング言語を使ってみたいと思う。そこでまずは準備である。
pythonの準備
LinuxやUnixのシステム、あるいはそこから派生したmacOSやWindows 10などでは、デフォルトでpythonはインストールされている。pythonのHPをみると「デフォルトでインストールされているものはバージョンが古いので、まずはインストールしてほしい。プログラミングを始めるのはそれから」と書いてある。(例えば、macOSの場合はこんな感じ。)インストール自体はそれほど難しくないので、今回は環境がすでに整っているのを前提とする。
pythonにはVer.2系統とVer.3系統があり、現在のプログラムはほとんどすべてがVer.3系統を用いて書かれているそうである。macOSの場合はpython3というコマンドが/usr/local/binにあるので、それを使う。
ちなみに、pythonはインタープリタなので、python3というコマンドはコンパイルを行わない。javaと同じように、python3 test.py といった感じでプログラムを実行する。
あるいは、pythonのプログラムの先頭行にインタープリタのpath(macOSの場合は/usr/local/bin/pytho3)を指定する一文を書き入れるとファイル名により直接実行できる。
たとえば、ファイルに次のように書き込んで、
......
#!/usr/local/bin/python3
print("Hello, world!")
.....
次のように実行するだけでうまくいく(実行ファイルにするために、"chmod 755"はさすがに必要だが)。
$chmod 755 test.py
$./test.py
Hello, world!
変数の区別や、細かい初期設定は必要ない。下書きや素描をするように、思いつくままプログラムを書けるのが、pythonの良い点である。それでいて、強力なライブラリも沢山用意されているので、必要に応じて読み込めば、様々な高度な処理が可能となる。これも人気の理由ではないかと思う。
プログラミングの練習:三角関数の値の計算
まずは三角関数の値を打ち出す練習プログラムを書いてみよう。
#!/usr/local/bin/python3
import math
print(math.sin(math.pi/6))
この計算は$\sin(\pi)$を小数表示させるもので、結果は、
0.49999999999999994
となった。想定される答えは0.5だから「まあOK」である(計算精度には若干問題があるがこのくらいなら....)。
次は、0から$2\pi$の値を、刻み幅$\delta\theta=2\pi/N$, $N=10$にし、離散的に計算させてみる。繰り返しの命令はfor i=0 in range(N):で行い、ブロック部分の領域は字下げ(インデント)で対応させる。
#!/usr/local/bin/python\3
import math
PI = 4.0*math.atan(1.0)
N = 10
dx = 2*PI/N
for i in range(N):
x = dx * i
print(x, math.sin(x))
これを実行した結果をgnuplotで図示させてみた。
グラフの形がちょっと変だ。最後の点が$f(x)=0$で終わったおらず、周期が完了していない。計算点を数えると10個ある。ということは、for文は10回分の計算を繰り返しているが、最初がi=1ではなく、i=0であることを知っておく必要があるだろう。 一周期を完了させるためには$\text{range}(N) \rightarrow \text{range}(N+1)$とすればよい。
修正を行った計算を図示すると、期待通りの結果となった。
pythonのライブラリを使ってグラフを描く
pythonが人気の理由のひとつは、その豊富なライブラリであろう。これまではpythonでの計算結果を出力し、それを外部のプログラム(gnuplot)で処理した。しかし、gnuplotを用いずとも、pythonのコードの一部としてグラフを描くことが可能である。
ただ、それを実現するには若干の準備が必要である。
matplotlibの組み込み
検索すると、matplotlibがよい、と多くの記事にある(たとえばこれ)。
このライブラリを含むプログラムを書いて実行して見たがエラーが出た。どうやらデフォルトではインストールされていないようである。少し面倒な作業をやらないといけないようだ。
手順は様々なサイトに書かれている通りにやればよいが(今回試したのはmacOS)、一応書いておくことにする。
pipのインストール
まずはpipと呼ばれるpythonパッケージ用のインストーラ(Package installer for Python)をインストールするために、そのソースファイルをダウンロードする。
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
このコマンドを実行したディレクトリにget-pip.pyというファイルがダウンロードされた。
pythonは、Linuxのソフトウェア管理と同じように「レポジトリ」というシステムを使って、ライブラリなどpython言語自体の拡張部分の管理を行なっている。
pipというのは、例えばLinuxのapt-getやrpmに相当する「コマンド」であり、扱う拡張部分(ライブラリなど)はPyP(Python Package)と呼ばれる。PyPを管理するデータサーバはPyPIと呼ばれる(Python package Index)システムで、pipは必要な(指示された)拡張部分のファイルをこのシステムからネットワークを使ってダウンロードしインストールする(必要となる複数のファイルのダウンロードなども一括して管理してくれる)。
rpmやapt-getは、macOSの場合はHomebrewなどを使ってインストールできたが、どうもpipにはうまくいかないらしい(現時点では)。そこで、pythonのHPに書いてある指示通りにやることにした、と参考にしたサイトには書いてあった。
次の手順は、ダウンロードしたget-pip.pyを実行することである。
python3 get-pip.py
get-pip.pyの中身は、pipのソースファイルを圧縮したzipファイルである。これを解凍し、実行してpipをインストールするのである。
しばらくすると実行が完了する。しかしpipと打ち込んでもエラーが出る。Pathが繋がっていないようだ。インストール先は、私の場合は
/usr/local/Cellar/python\@3.9/3.9.1_6/Frameworks/Python.framework/Versions/3.9/bin/pip
だったので、ln -sを使ってPathがつながっている場所へリンクした。
これでpipが使えるようになった。
pip -V
と打ち込んでバージョンが表示されたらインストール作業は完了である。
pipをつかってmatplotlibをインストール
これでやっとmatplotlibを組み込むことができる。pipを用いて実施する。
pip install matplotlib
と打ち込むと、組み込みが始まる。様々なファイルがダウンロードされ、インストールされていく。しばらくすると完了メッセージが出る。
これでpythonのプログラムからmatplolibが使えるようになった!
お試しプログラム
グラフが描けるかどうかを試すためだけのサンプルプログラムを書いて実行してみた。
#!/usr/local/bin/python3
import math
import matplotlib.pyplot as mpx = [0,1,2,3]
y = [0,1,4,9]mp.plot(x,y,"ro",x,y,"g--")
mp.show()
結果は次のようになった。
成功である!
次は最初に書いたプログラム(sin(x)の計算)を改良して、pythonだけでグラフを描かせてみよう。このためにはリスト(配列)の概念を知る必要がある。
次回に続く。