Scipy-linalg

提供:Dev Guides
移動先:案内検索

SciPy-リナル

SciPyは、最適化された ATLAS LAPACK および BLAS ライブラリを使用して構築されます。 非常に高速な線形代数機能を備えています。 これらの線形代数ルーチンはすべて、2次元配列に変換できるオブジェクトを必要とします。 これらのルーチンの出力も2次元配列です。

SciPy.linalg対NumPy.linalg

scipy.linalgには、numpy.linalgにあるすべての関数が含まれています。 さらに、scipy.linalgには、numpy.linalgにはない他の高度な機能もいくつかあります。 numpy.linalgよりもscipy.linalgを使用するもう1つの利点は、BLAS/LAPACKサポートで常にコンパイルされることです。一方、NumPyではこれはオプションです。 したがって、NumPyのインストール方法によっては、SciPyバージョンの方が高速になる場合があります。

一次方程式

*scipy.linalg.solve* 機能は、未知のx、y値について線形方程式a *x + b* y = Zを解きます。

例として、次の連立方程式を解くことが望ましいと仮定します。

*x + 3y + 5z = 10*
*2x + 5y + z = 8*
*2x + 3y + 8z = 3*

x、y、zの値について上記の方程式を解くために、下に示すように逆行列を使用して解ベクトルを見つけることができます。

\ begin \ {bmatrix} x \\ y \\ z \ end \ {bmatrix} = \ begin \ {bmatrix} 1&3&5 \\ 2&5&1 \\ 2&3&8 \ end \ {bmatrix} ^ \ {-1} \ begin \ {bmatrix} 10 \\ 8 \\ 3 \ end \ {bmatrix} = \ frac \ {1} \ {25} \ begin \ {bmatrix} -232 \\ 129 \\ 19 \ end \ {bmatrix} = \ begin \ {bmatrix} -9.28 \\ 5.16 \\ 0.76 \ end \ {bmatrix}。

ただし、より高速で数値的に安定した linalg.solve コマンドを使用することをお勧めします。

ソルバー関数は、2つの入力「a」と「b」を取ります。「a」は係数を表し、「b」はそれぞれの右側の値を表し、ソリューション配列を返します。

次の例を考えてみましょう。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy arrays
a = np.array([[b = np.array([2, 4, -1])

#Passing the values to the solve function
x = linalg.solve(a, b)

#printing the result array
print x

上記のプログラムは、次の出力を生成します。

array([ 2., -2., 9.])

決定基を見つける

正方行列Aの行列式は、多くの場合| A |と表されます。線形代数でよく使用される量です。 SciPyでは、これは* det()*関数を使用して計算されます。 入力として行列を受け取り、スカラー値を返します。

次の例を考えてみましょう。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
A = np.array([[Passing the values to the det function
x = linalg.det(A)

#printing the result
print x

上記のプログラムは、次の出力を生成します。

-2.0

固有値と固有ベクトル

固有値-固有ベクトル問題は、最も一般的に使用される線形代数演算の1つです。 次の関係を考慮することにより、正方行列(A)の固有値(λ)および対応する固有ベクトル(v)を見つけることができます-

  • Av =λv*

    *scipy.linalg.eig* は、通常または一般化された固有値問題から固有値を計算します。 この関数は、固有値と固有ベクトルを返します。

次の例を考えてみましょう。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
A = np.array([[Passing the values to the eig function
l, v = linalg.eig(A)

#printing the result for eigen values
print l

#printing the result for eigen vectors
print v

上記のプログラムは、次の出力を生成します。

array([-0.37228132+0.j, 5.37228132+0.j]) #--Eigen Values
array([[Eigen Vectors
       [ 0.56576746, -0.90937671]])

特異値分解

特異値分解(SVD)は、正方形ではない行列への固有値問題の拡張と考えることができます。

*scipy.linalg.svd* は、行列 'a'を2つのユニタリ行列 'U'および 'Vh'と、a == Uのような特異値(実数、非負)の1次元配列 's'に分解します。 *S* Vh、「S」は適切な形状のゼロの行列で、主対角線は「s」です。

次の例を考えてみましょう。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)

#Passing the values to the eig function
U, s, Vh = linalg.svd(a)

# printing the result
print U, Vh, s

上記のプログラムは、次の出力を生成します。

(
   array([
      [ 0.54828424-0.23329795j, -0.38465728+0.01566714j,
      -0.18764355+0.67936712j],
      [-0.27123194-0.5327436j , -0.57080163-0.00266155j,
      -0.39868941-0.39729416j],
      [ 0.34443818+0.4110186j , -0.47972716+0.54390586j,
      0.25028608-0.35186815j]
   ]),

   array([ 3.25745379, 1.16150607]),

   array([
      [-0.35312444+0.j , 0.32400401+0.87768134j],
      [-0.93557636+0.j , -0.12229224-0.33127251j]
   ])
)