複天一流:どんな手を使ってでも問題解決を図るブログ

宮本武蔵の五輪書の教えに従い、どんな手を使ってでも問題解決を図るブログです(特に、科学、数学、工学の問題についてですが)

pythonによるプログラミングの準備

前回のあらまし

前回の記事では、$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の準備

LinuxUnixのシステム、あるいはそこから派生したmacOSWindows 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で図示させてみた。

$g(x)=\sin(x)$のグラフ:刻み幅$(N=10)$

グラフの形がちょっと変だ。最後の点が$f(x)=0$で終わったおらず、周期が完了していない。計算点を数えると10個ある。ということは、for文は10回分の計算を繰り返しているが、最初がi=1ではなく、i=0であることを知っておく必要があるだろう。 一周期を完了させるためには$\text{range}(N) \rightarrow \text{range}(N+1)$とすればよい。

修正を行った計算を図示すると、期待通りの結果となった。

刻み幅$N=10$のまま、一周期分の計算をしたもの

pythonのライブラリを使ってグラフを描く

pythonが人気の理由のひとつは、その豊富なライブラリであろう。これまではpythonでの計算結果を出力し、それを外部のプログラム(gnuplot)で処理した。しかし、gnuplotを用いずとも、pythonのコードの一部としてグラフを描くことが可能である。

ただ、それを実現するには若干の準備が必要である。

matplotlibの組み込み

検索すると、matplotlibがよい、と多くの記事にある(たとえばこれ)。

science-log.com

このライブラリを含むプログラムを書いて実行して見たがエラーが出た。どうやらデフォルトではインストールされていないようである。少し面倒な作業をやらないといけないようだ。

手順は様々なサイトに書かれている通りにやればよいが(今回試したのは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 mp

x = [0,1,2,3]
y = [0,1,4,9]

mp.plot(x,y,"ro",x,y,"g--")
mp.show()

結果は次のようになった。

matplotlibを使ったサンプルグラフ

成功である!

次は最初に書いたプログラム(sin(x)の計算)を改良して、pythonだけでグラフを描かせてみよう。このためにはリスト(配列)の概念を知る必要がある。

次回に続く。