PythonのSciPyライブラリを使って行列、多項式やフーリエ変換等の計算をする方法

スポンサーリンク

Python SciPyは、Python NumPyと数学的アルゴリズムを構成要素として持つライブラリです。

Python SciPyライブラリは、科学的な計算や処理の分野で大いに活用されています。


スポンサーリンク

Python Scipy入門

SciPy ライブラリが提供する様々な機能を使用するためには、SciPy ライブラリをインストールする必要があります。

この目的のために、pipコマンドを使用してSciPyライブラリをインストールすることにします。

pip install scipy

このライブラリの機能を使用するためには,以下の記述でライブラリをインポートする必要があります.

import scipy

Python のサブパッケージ SciPy

SciPy ライブラリには、科学計算の実行と効率を向上させるための様々なサブモジュールが用意されています。

SciPy ライブラリでよく使われるサブモジュールを以下に示します。

  • special: このサブモジュールは特定のタスクを実行するための特殊関数を含んでいます。
  • 定数: 定数を表す.
  • optimize: このサブモジュールには最適化のためのアルゴリズムが含まれています。
  • integrate: 積分を表します。このサブモジュールには,数学的積分を行うための関数が含まれています.
  • 補間(interpolate): 補間を行うための関数を表します。補間を行うための関数を表します。
  • linalg: 線形代数方程式の演算を行う関数を表します。
  • io: 与えられた入力に対して Input/Output 演算を行う関数を表す.
  • fftpack: 離散フーリエ変換を行う関数を表す.
  • signal: Pythonで信号処理を行うための関数やツールを表現します。
  • sparse: 疎な行列を扱うアルゴリズムを表現します。
  • cluster: 階層的なクラスタリングを行うための関数を表す.

Pythonによる線形代数 SciPy

線形代数は線形方程式を表し、行列を使ってそれらを表します。

SciPyライブラリの linalg サブモジュールは、線形方程式に関連するすべての機能を実行するために使用されます。

これは、2次元のNumPy配列に変換されるオブジェクトを受け取り、タスクを実行します。


1. 1. 連立方程式の解法

線形方程式と一緒にリナルグ部分モジュールの働きを、例題を使って理解しよう。

4x+3y=12
3x+4y=18

上の一次方程式を考えてみましょう。

この方程式を linalg.solve() 関数で解いてみましょう。

from scipy import linalg
import numpy
X=numpy.array([[4,3],[3,4]])
Y=numpy.array([[12],[18]])
print(linalg.solve(X,Y))
X.dot(linalg.solve(X,Y))-Y

上記のコードでは、numpy.array()関数を通して、入力方程式に存在する係数と定数を渡しています。

さらに、 linalg.solve() 関数は連立方程式を解き、その方程式に対応する x と y の値を表示します。

equation1.dot(linalg.solve())-equation2` コマンドは、方程式の出力を確認するために使用されます。

出力は以下の通りです。

[[-0.85714286]
 [ 5.14285714]]
array([[0.],
       [0.]])

array([[0.], [0.]]) は、一次方程式が正しく解かれたことを確認します。

[[-0.85714286] [ 5.14285714]]: これらは、線形方程式を解くために使用されるxとyの値です。


2. 行列の行列式を求める

linalg.det()` メソッドは、入力行列の行列式を求めるために用いられる。

例えば、以下の様になります。

from scipy import linalg
import numpy
determinant=numpy.array([[2,4],[4,12]])
linalg.det(determinant)

結果は以下の通りです。

8.0

3. 行列の逆行列を計算する

linalg.inv()` メソッドは入力された行列の逆行列を計算するために使用される。

例えば、以下の様になります。

from scipy import linalg
import numpy
inverse=numpy.array([[2,4],[4,12]])
linalg.inv(inverse)

結果は以下の通りです。

array([[ 1.5 , -0.5 ],
       [-0.5 0.25]])

Python で多項式の計算を行う SciPy

SciPyライブラリの poly1d サブモジュールは、1次元の多項式の操作を行うために使用されます。

これは係数を入力として受け取り、多項式オブジェクトを形成します。

例題を使ってpoly1dサブモジュールを理解しましょう。

例題

from numpy import poly1d
 
# Creation of a polynomial object using coefficients as inputs through poly1d
poly_input = poly1d([2, 4, 6, 8])
 
print(poly_input)
 
# Performing integration for value = 4
print("
Integration of the input polynomial:
"
)
print(poly_input.integ(k=3))
 
# Performing derivation
print("
Derivation of the input polynomial:
"
)
print(poly_input.deriv())

上のコードでは、多項式の係数を受け取るために poly1d() が使用されています。

さらに、 polynomial.integ(value) は、入力されたスカラー値に対する多項式の積分を求めるために用いられます。

polynomial.deriv()` 関数は、入力された多項式の導出値を計算するために使用されます。

出力は以下の通りです。

   3     2
2 x + 4 x + 6 x + 8
 
Integration of the input polynomial:
 
     4         3     2
0.5 x + 1.333 x + 3 x + 8 x + 3
 
Derivation of the input polynomial:
 
   2
6 x + 8 x + 6

Pythonとの統合を行う SciPy

SciPyライブラリの integrate サブモジュールを使用して、入力された方程式に対して積分を実行します。

次のような方程式に対して積分を実行してみましょう。

3x 2 + 2*x + 6

from scipy import integrate
integrate.quad(lambda x:3*x*2 + 2*x + 6,0,2)

上記のコードでは、入力方程式の積分を計算するために integrate.quad() 関数が使用されています。

この関数は次の引数を受け付けます。

  • 方程式
  • 上限値
  • 下限値

結果は、以下の通りになります。

(28.0, 3.1086244689504383e-13)

Pythonによるフーリエ変換 SciPy

フーリエ変換は、関数を周期的な成分の総和として理解し、描写することを可能にします。

SciPyライブラリの fftpack サブモジュールは、方程式に対してフーリエ変換を行うために使用されます。

例えば、以下の様になります。

from scipy.fftpack import fft
import numpy as np
 
# Count of sample points
n = 400
 
# sample spacing
T = 1.0 / 500.0
x_i = np.linspace(0.0, n*T, n)
y_i = np.tan(70.0 * 2.0*np.pi*x_i) + 0.5*np.tan(70.0 * 2.0*np.pi*x_i)
y_f = fft(y_i)
x_f = np.linspace(0.0, 1.0/(3.0*T), n//2)
 
# matplotlib for plotting purposes
import matplotlib.pyplot as plt
plt.plot(x_f, 2.0/n * np.abs(y_f[0:n//2]))
plt.show()

上記のコードでは、numpy.linspace()関数を用いて等間隔な整数を得ています。

さらに、入力のフーリエ値を計算するために fft() 関数が使用されています。

Python の matplotlib モジュールを使ってタンジェントグラフを描画しています。

出力は以下の通りです。

from scipy.special import cbrt
val = cbrt([27, 8])
print(val)

Python の特殊関数 SciPy

SciPy の special パッケージに含まれる特殊関数のうち、最もよく使われるものを以下に示します。

  • 立方根
  • 指数関数
  • 対数-和指数関数
  • ガンマ

1. 立方根

scipy.special.cbrt()` 関数は、与えられた入力の要素ごとの立方根を提供するために使用されます。

例えば、以下の様になります。

[3. 2.]

結果は以下の通りです。

from scipy.special import exp10
val = exp10([27, 8])
print(val)

2. 指数関数

与えられた入力の要素ごとの指数を計算するために scipy.special.exp10() 関数を使用します。

例えば、以下の様になります。

[1.e+27 1.e+08]

結果は、以下の通りになります。

from scipy.special import logsumexp
import numpy as np
inp = np.arange(5)
val = logsumexp(inp)
print(val)

3. 対数和指数関数

scipy.special.logsumexp()` 関数は、入力要素の指数の和の対数値を計算するために使用されます。

例えば、以下の様になります。

4.451914395937593

ここでは、numpy.arange()関数を用いて、入力として渡される数値の列を生成しています。

出力は以下の通り。

from scipy.special import gamma
val = gamma([5, 0.8, 2, 0])
print(val)

4. ガンマ関数

ガンマ関数はガンマ値を計算するのに使われ、ガンマ(n+1) = n ということから一般化階乗と呼ばれます

scipy.special.gamma()` 関数は,入力要素のガンマ値を計算するために使用されます。

例えば、以下の様になります。

[24.          1.16422971  1.                 inf]

結果は以下の通りです。

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as p
a = np.linspace(0, 4, 12)
b = np.sin(x**2/3+4)
print(a,b)
p.plot(a, b, 'o') # Plotting the graph assuming a and b arrays as x and y dimensions
p.show()

補間関数

補間は、曲線や直線などの上の2つ以上の点間の値を求める処理です。

scipy.interpolate` パッケージは、特定のグラフに対して補間を行うために使用されます。

例えば、以下の様になります。

[0.         0.36363636 0.72727273 1.09090909 1.45454545 1.81818182
 2.18181818 2.54545455 2.90909091 3.27272727 3.63636364 4.        ] [-0.7568025  -0.78486887 -0.85971727 -0.9505809  -0.9999744  -0.92508408
 -0.64146657 -0.12309271  0.51220599  0.96001691  0.85056799  0.09131724]

上記のコードでは、正弦波を作成し、matplotlib モジュールの Python PyPlot パッケージを使用して値をプロットしています。

結果は以下の通りです。

Fourier Transforms
Fourier Transforms – Tangent graph
Interpolation With SciPy
Interpolation With SciPy

まとめ

さて、今回はPythonのSciPyライブラリが提供する機能を理解することができました。


参考文献

  • Python SciPy
  • SciPy のドキュメント

読むことをお勧めします。

Python matplotlib チュートリアルと Python NumPy を参照してください。

タイトルとURLをコピーしました