Python演習2
1. 実験の目的
Pythonを用いて実験データをグラフに描画する方法を理解する。Pythonのプログラムファイルを作成し、コンパイルして実行する方法を理解する。
2. 実験の理論
2.1 NumPy
NumPy is the fundamental package for scientific computing in Python. It is a Python library that provides a multidimensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays, including mathematical, logical, shape manipulation, sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra, basic statistical operations, random simulation and much more.
前回からNumPyというライブラリを使って科学技術の計算を行っています。NumPyは、数値計算(numerical calculation)を高速に行うためのライブラリです。
昨今話題のディープラーニング等の機械学習(machine learning)では行列(matrix)やベクトル(vector)の計算が多く行われます。NumPyは、こういった計算を速く、便利に行うための関数を用意しています。
実はPythonだけでも行列やベクトルの計算はできますが、C言語などと比べると実行速度がとても遅いです。なぜPythonは遅いかというと、変数などの型を推論しているからです。この型推論(type inference)が大変なため、本来望んでいる計算以外のところで時間を使っています。
Tip
このように、プログラムを書くときやコンパイルするときに型を固定せず、実行時に型を推論する言語を動的型付け言語といいます。
NumPyでは、C言語と同様に型を固定して計算します。そのため素のPythonに比べて非常に高速に動作します。
前回の演習で使ったnp.loadtxt()
という関数を使うと、自動的にPython組み込みのリストではなくNumPy配列としてデータが変数に格納されます。こうしたNumPy配列に対してNumPyはさまざまな関数を提供しています。
NumPy配列に使える特徴的な機能のひとつにブロードキャスト(broadcast)があります。配列の足し算や掛け算のような計算をするとき、2つの配列の次元・形状が違っても、小さい方を大きい方に合わせて拡張してくれます。
以下に例を示します。
import numpy as np
a = np.array([1, 2, 3])
b = a * 10
print(b) # [10, 20, 30]
要素数3のNumPy配列a
に対して、スカラー値(ただの数字)10
をかけると、a
の中のすべての要素に10
をかけた結果になりました。
このように、「配列の各要素に同じ演算をしたい」ときに便利なのがブロードキャストです。
2.2 Matplotlib
Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.
MatplotlibはPythonでグラフを描画するためのライブラリです。さまざまなグラフをいくつかの命令で簡単に作成できるため、データの可視化(visualization)に役立ちます。
どのようなグラフが作れるかは公式HPのExamplesを見てください。
こうした多様なグラフの中でも、実験でよく使うのはplot
です。
のような個のデータを使い、を横軸、を縦軸として座標上にそれぞれのデータ点を打ちます。ただ点で示せば散布図と同じです。
Maplotlibでプロットできる関数がplt.plot(x, y)
です。
x
には[x1, x2, ..., xN]
, yには[y1, y2, ..., yN]
を入れて使います。
3. 実験手順
3.1 CSVファイルの読み込みとグラフ描画
この項では、の抵抗に電圧をかけた時の電流を測定したデータを使います。
Excelでこの実験データをまとめると、以下のような表になりました。
V[V] | I[mA] |
---|---|
0 | 0.00 |
1 | 10.47 |
2 | 20.64 |
3 | 30.49 |
4 | 41.88 |
5 | 52.36 |
6 | 61.08 |
7 | 69.10 |
8 | 81.92 |
9 | 87.95 |
10 | 99.47 |
ExcelファイルをPythonで扱うのは難しいため、もっと単純なデータ形式であるCSVファイルとしてこのデータを取り込みます。
今回はこの実験データをCSVファイルとして用意しています。LMSからsample.csv
をダウンロードして、Colabのサーバにアップロードしてください。
左の「ファイル」を開き、ドラッグアンドドロップでファイルをアップロードできます。
このファイルの中身を見てみましょう。
!cat sample.csv
を実行すると、
V[V], I[mA]
0, 0.00
1, 10.47
2, 20.64
3, 30.49
4, 41.88
5, 52.36
6, 61.08
7, 69.10
8, 81.92
9, 87.95
10, 99.47
と表示されます。横に並んだデータがコンマ","
によって区切られているため、CSV (Comma-Separated Values)と呼ばれます。
このファイルをPythonで読み込みます。
以下のプログラムを書き、保存して実行してください。
import numpy as np
data = np.loadtxt("sample.csv", delimiter=",")
print(data)
これを実行するとエラーが出ます。
File "work20220520-2.py", line 3, in <module>
data = np.loadtxt("sample.csv", delimiter=",")
(中略)
ValueError: could not convert string to float: 'V[V]'
「'V[V]'
は数字じゃないから読み込めない」と言っています。CSVファイルを見ると、先頭行は数字ではなく見出しになっているため、これを取り除かないと読み込めません。
プログラムを以下のように修正して、再度実行します。np.loadtxt()
という関数の引数にskiprows=1
を追加し、1行目を読み飛ばすように指示しています。
import numpy as np
data = np.loadtxt("sample.csv", delimiter=",", skiprows=1)
print(data)
読み込んだデータがprintされました。
dataは2次元(横と縦)のリストになっています。0列目の電圧をx軸、1列目の電流をy軸としましょう。
プログラムを以下のように修正してください。
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt("sample.csv", delimiter=",", skiprows=1)
x = data[:, 0]
y = data[:, 1]
data[:, 0]
と書くと、0列目のデータを取り出せます。
このデータをプロットします。以下の内容を現在のプログラムの下に加えてください。
plt.plot(x, y)
plt.show()
保存して実行すると、グラフが出ます。
プロットを点にする
このグラフはおかしいです。実験値を線分で結んでいるため、ガタガタのグラフになっています。
計測値をプロットするときは、必ず点だけにしましょう。そのために、
plt.plot()
関数に引数"."
を追加します。
plt.plot(x, y)
を以下のように修正してください。
plt.plot(x, y, ".")
これで実行すると、プロットが点になりました。
Tip
3つめの引数である"."
は、プロットのマーカー、線、色を簡単に指定する書式です。
たとえば、マーカーなしの線だけであれば"-"
と指定します。
色も指定できます。"r"
で赤、"g"
で緑になります。この2つを組み合わせて"r."
とすると、赤色の点になります。
他の書式はhttps://matplotlib.org/3.5.0/api/_as_gen/matplotlib.pyplot.plot.htmlを参照してください。
軸ラベルの追加
Python演習1でやったとおり、x軸のラベルとy軸のラベルを追加します。
凡例の追加
Python演習1でやったとおり、plt.plot()
関数に引数label="measured"
を追加します。複数の引数がある場合は、コンマ,
で区切ります。引数名=なんちゃら
のような引数は、一番後ろに書いてください。
凡例をつけたときは、plt.legend()
を忘れないでください。
ここまででグラフを表示すると、最低限の体裁が整ったグラフができました。
課題
このグラフができ、体裁も整ったら、先生に確認してもらってください。
3.2 Excelからデータのインポートとグラフ描画
この項では、およびの抵抗に電圧をかけた時の電流を測定したデータを使います。
Excelで実験結果を記録したxlsxファイルがLMSにあります。これをCSVとして保存し、Colabのサーバにアップロードしてください。
R=100[Ω] | R=200[Ω] | |
---|---|---|
V[V] | I[mA] | I[mA] |
0 | 0 | 0 |
1 | 10.47 | 4.80 |
2 | 20.64 | 10.14 |
3 | 30.49 | 15.02 |
4 | 41.88 | 19.82 |
5 | 52.36 | 25.08 |
6 | 61.08 | 30.10 |
7 | 69.1 | 35.02 |
8 | 81.92 | 39.90 |
9 | 87.95 | 45.15 |
10 | 99.47 | 49.96 |
Tips
Excelで作ったデータをCSVファイルとして出力するには、保存のときに以下の方法でファイル形式をCSV UTF-8にしてください。 https://office-hack.com/excel/excel-to-csv/
このデータからグラフを作ります。一部穴抜きをしてあるため、自分で埋めてください。なお、CSVを読み込む前に中身のデータを確認することをおすすめします。先頭から何行を読み飛ばす必要があるでしょうか。
import numpy as np
import matplotlib.pyplot as plt
# CSVファイルからデータを読み取り代入
data =
x = # dataの0列目
y1 = # dataの1列目
y2 = # dataの2列目
# (x, y1)と、(x, y2)をplotし、showする
このように、plt.plot()
をデータを変えて2回行うと、2つのプロットを同時に表示できます。
次に、この2つの理論線を追記します。理論式から、x
の中のそれぞれの点に対応するy
の値は、
y = x / R
と求められます。
R=100[Ω]
のデータに対応するy
の理論値y1_theo
と、R=200[Ω]
に対応するy
の理論値y2_theo
を計算します。
# 右辺にxを使った理論式を書く
y1_theo =
y2_theo =
Warning
プロットではがmA単位であることに注意してください。求めたyの値に1000をかける必要があります。
ここではNumPyのブロードキャストを使っています。
x
は電圧のリストですが、そこにスカラー値(ただの数)を足したりかけたりすると、x
の中のそれぞれの要素に計算が適用されます。
求められたy1_theo
とy2_theo
をもとに、理論線を描画します。
実験で得られるデータは点ですが、理論的に得られる数式は線で表すことができます。理論線は点をつけずに線だけで表すようにしましょう。
ここまでで、以下のようなグラフができれば成功です。色は多少違うかもしれません。
次に、このプロットの体裁を整えましょう。今回は4色のカラフルなグラフができたと思いますが、このままではどちらの理論線がどちらのデータに対応しているか分かりづらいです。色を揃えてあげるとよいでしょう。
Tip
オメガΩ
は全角文字のため、凡例に使うとエラーが出ます。この場合、オメガの代わりに$\Omega$
と入力するとオメガが表示されます。
参考として、よいグラフの例を載せます。必ずしもこのような体裁にする必要はありませんが、みなさんが見やすいように工夫してください。
Tip
論文誌などによっては、カラーではなく白黒の原稿しか受け付けてもらえないところもあります。そういう場合には、マーカーの種類を変えたり点線を変えたりして、白黒でも区別しやすいようにします。
ここからの課題は、必ずしも授業中に行うことは求めません。
3.3 ダイオードの静特性のグラフ描画
この項では、以下のような回路で電源電圧を変化させていったときの、ダイオード(diode)にかかる電圧とダイオードを流れる電流を記録したデータを使います。
なお、抵抗です。
まずは実験データを用意しましょう。自分が行ったダイオードの静特性の実験データをCSVにしてください。
このCSVをもとに、データをプロットしてください。ダイオードの電圧がx軸で電流がy軸です。
Warning
プロットではがmA単位であることに注意してください。
課題
このグラフができ、体裁も整ったら、先生に確認してもらったあと、LMSにグラフの画像を提出してください。
ここからの内容は授業時間中に行う必要はありません。
3.4 過渡現象のグラフ(発展課題)
抵抗に電源から電圧をかけているときに、急に電源を抵抗から切り離すと、抵抗にかかる電圧は直ちに0[V]になります。
では、コンデンサの場合はどうでしょうか。コンデンサは電荷(電気)をためる働きをするため、電源を切り離しても(理論上は)コンデンサにかかる電圧は変わりません。この状態でコンデンサに抵抗を接続すると、ためた電荷を少しずつ抵抗で使うのに伴って電圧は徐々に0[V]に近づいていきます。
このように、電源の急激な変化に対して時間をかけて追従して変化する現象を過渡現象といいます。詳しくは3年生の電気回路で勉強します。
この項では、以下のような回路でt=0のときスイッチを(1)から(2)につけかえたとき、コンデンサの電圧を0.5秒ごとにArduino で読み取ったデータを使います。
コンデンサは47[μF]、抵抗の値はExcelファイルに示した3種類で測定しました。
Excelファイルjidoukeisoku.xlsx
をCSVファイルに変換し、データをプロットしてください。x軸は時間、y軸はコンデンサの電圧です。