#はじめるScipy
キーワード:逆行列、固有値、固有ベクトル、最適化
...おぉ、もうなんというか
いちおう全部知ってはいるのでとりあえず突っ込んでみよう。
#準備
ライブラリはimportよー
# Scipyのモジュール
import scipy as sp
# 線形代数用のモジュール
import scipy.linalg as linalg
# 最適化計算(最小値)用のモジュール
from scipy.optimize import minimize_scalar
#determinant-行列式-
行列式求められるとかすごいなー。手計算で4×4やらされたこともあったしこういうのはありがたみが深いですね。
linalgが線形代数用なんですね。
test_array=np.array([[1,-1,-1],[-1,1,-1],[-1,-1,1]])
print(linalg.det(test_array))
出力
-4.0
#invertible matrix-逆行列-
こちらも便利でなかなか早い
print(linalg.inv(test_array))
出力
[[ 0. -0.5 -0.5]
[-0.5 -0. -0.5]
[-0.5 -0.5 0. ]]
積もnp.dotでラクチン、単位行列Iになることが確かめられます。
#eigenvalue&eigenvector-固有値・ベクトル-
eig_value,eig_vector=linalg.eig(test_array)
print("固有値")
print(eig_value)
print("固有ベクトル")
print(eig_vector)
出力
固有値
[-1.+0.j 2.+0.j 2.+0.j]
固有ベクトル
[[ 0.577 -0.816 0.428]
[ 0.577 0.408 -0.816]
[ 0.577 0.408 0.389]]
#ニュートン法で解く方程式
こんなことまでメソッドひとつでできる!!
f(x)=x^3+1 \\\
f(x)=0を解く
まず関数の定義
def test_function
return(x*2-1)
では解きましょう
#import文
from scipy.optimize import newton
#計算
print(newton(test_function,0))
出力
1.0
解を出してくれました
虚数解があると上手くいかないのかな?
$x^3+1=0$や$x^3-1=0$だと0.00010000169277201161
がかえってきました
#minimize_scalar-最小値求値-
scipyの最後にこんな機能も...
print(minimize_scalar(test_function,method="Brent"))
出力
fun: -1.0
nfev: 37
nit: 36
success: True
x: 4.4020875904303335e-09
min:-1(x=0)に一致するような結果になってますね。
では機能紹介はここまで
のこるは練習問題!!
#練習問題
問題1
``` A=np.array([1,2,3,1,3,2,3,1,2]).reshape(3,3) print(A) print('det:{:}'.format(linalg.det(A))) ```問題2
``` print('inv:{:}'.format(linalg.inv(A))) eig_value, eig_vector = linalg.eig(A) print('eig_value:{val} \n eig_vector:\n{vec}'.format(val=eig_value,vec=eig_vector)) ```問題3
``` from scipy.optimize import newton def practice_function(x): return(x**3+2*x+1) print(newton(practice_function,0)) print(practice_function(newton(practice_function,0))) ```#最後に
scipy,非常に便利な計算ライブラリですね
ニュートン法については次のページがいいと思います
[1]ニュートン法とは何か??ニュートン法で解く方程式の近似解 @PlanetMeron さん
https://qiita.com/PlanetMeron/items/09d7eb204868e1a49f49