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

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

pythonによるデータプロット

前回のあらまし

前回はpythonを使った数値計算の結果を、そのままグラフに表示することを試みた。pythonのパッケージにmatplotlibというライブラリがあり、そこに含まれるpyplotという機能を利用することにした。インストールは順調に終了し、試しに描いてみた適当なグラフの描画にも成功した。計算結果を表示するため、計算部分とグラフ表示部分を組み合わせた新しいプログラムを今回は書いてみる。

計算結果をグラフに表示するための準備:配列

pyplotでは、計算結果を一度配列に格納する必要がある。x方向とy方向とに対応する2つの配列を用意し、plot(x,y)という形で描画させるスタイルである。

pythonは変数型の宣言が”結構曖昧”で済むので、この辺りはやりやすいと感じると同時に戸惑いも感じる。C言語のようにメモリ空間できっちり領域を確保するというよりは、コンパイラの裁量に合わせて柔軟にやってもらうという感じである。

まだpythonの文法にそれほど馴染んでいるわけではないので、検索結果をそのまま鵜呑みにして受け入れて見たところ、ちゃんと動いた。しばらくはこの方法でやっていこうと思う。

まずは配列の宣言だが、普通は具体的な値を指定することで初期化を図る。多くのお手本的プログラムを紹介しているサイトも、その方法で書かれている。しかし、我々がやりたいのは、関数が定義されている領域をN分割し、そこにおける関数値を配列に入れることである。$N=1000$の場合に手書きでデータを用意するのは現実的ではない....。

そこで色々調べるとメモリ空間を動的に確保する文法が見つかった。今回のプログラムではこれを採用してコードを書くことにする。

 x = [0.0] * (N + 1)

これは初期値0.0を配列に入れつつx[N+1]という配列を用意せよ、という意味となる。x[0]=0.0, ..., x[N+1]=0.0までが準備される。

前回の記事で書いたプログラムに、matplotlibを組み込んで改良したプログラムが次である。

#!/usr/local/bin/python3

# Plot of sin(x) 
# 
# Ver. 1 [Oct.4, 2023]

import math
import matplotlib.pyplot as pl

PI = 4.0*math.atan(1.0)
N=10

dx = 2*PI/N

x = [0.0] * (N+1)
y = [0.0] * (N+1) 

for i in range(N+1):
    x1 = dx * i
    x[i] = x1
    y[i] = math.sin(x1)

pl.plot(x,y,"bo", x,y, "g--")
pl.show()

結果は次の図の通り。

pythonだけで作ったグラフ

計算点を五倍($N=50$)に変更してみた。

$N=50$に変更して描いた正弦曲線[$0:2\pi$]

これで、計算結果をgnuplotのように表示できるようになれた!

次は、いよいよ数値積分して見たい。