プログラミング基礎同演習
131NumPyとSciPyの使い方プログラミング基礎同演習慶應義塾大学理工学部物理情報工学科渡辺
View Slide
231NumPyとSciPyの使い方
331多次元配列を高速に扱うためのモジュール配列指向 (Array Oriented Computing)裏でLAPACKというライブラリを呼んでいるLAPACKはBLASというライブラリ上に構築されているBLAS (Basic Linear Algebra Subprograms)LAPACK (Linear Algebra PACKage)NumPy (Numeric Python)
431ベクトルや行列同士の演算ルーチンをまとめたものこれがないと数値計算ができない新しいCPUでは、専用のBLASライブラリが必要(BLAS職人)Level 1ベクトル同士の演算 = +Level 2ベクトルと行列の演算 = x= ・Level 3行列と行列の演算 = xBasic Linear Algebra Subprograms
531Linear Algebra PACKageBLASをビルディングブロックとして線形代数の問題を解くパッケージ連立一次方程式最小二乗法固有値問題特異値問題https://www.r-ccs.riken.jp/wp-content/uploads/2019/05/nakata190523.pdf線形代数演算ライブラリBLAS とLAPACKの基礎と実践 (中田真秀)𝐴𝑥 = 𝑏min 𝑏 − 𝐴𝑥𝐴𝑥 = 𝜆𝑥𝑋 = 𝑈Σ𝑉†今回の課題
631もともとは線形代数の問題を解くパッケージ(現在はLAPACKが広く使われている)LINPACKは主にベンチマークとして使われているLINPACKベンチマーク・巨大な連立一次方程式を解くベンチマーク・Top500というスパコンのランキングに用いられる・Top500は年に二回開催されるLINPACK
731地球シミュレータ京コンピュータ富岳合計1位500位
831線形代数はとても大事NumPy/SciPyがあるからPythonを使うという人がいるくらい、線形代数、行列計算は数値計算においてとても重要数値計算に限らず、理工系全ての分野に線形代数が現れる線形代数は真面目に勉強しておきましょう
931import numpy as npまずNumPyをインポートnp.arrayにPythonのリストを渡すとNumPy配列になるdata = np.array([1,2,3])data123A Visual Intro to NumPy and Data Representation (https://jalammar.github.io/visual-numpy/)np.array([[1,2],[3,4]])data1 23 4
1031A Visual Intro to NumPy and Data Representation (https://jalammar.github.io/visual-numpy/)np.zeros(3)0000 00 0np.zeros((2,2))np.ones(3)1111 11 1np.ones((2,2))np.zerosで要素が全てゼロ、np.onesで要素が全て1のNumPy配列を作ることができる「形」はタプルで指定
1131data = np.arange(8)連番の一次元配列を作るにはnp.arangeを使う0 1 2 3 4 5 6 7
1231NumPy配列は、メモリ上では一次元配列として格納np.array([[1,2],[3,4]])data1 23 4メモリ1 2 3 4data (2,2)NumPy配列の「形」は、shapeで得ることができるdata.shape #=> (2,2)
1331a = np.arange(8)0 1 2 3 4 5 6 7b = a.reshape((2,4))0 1 2 34 5 6 7c = a.reshape((2,2,2))4 56 70 12 324
1431同じ形(shape)のNumPy配列同士は四則演算ができる012111+ =1230 12 3※ 演算は要素ごとになることに注意0 12 3x =0 14 9
1531NumPy配列にスカラー量を演算できる0121+ =1230121+ =110122x =0240122x =22
1631from scipy import linalgimport numpy as npまずはインポートするlinalg.eighでエルミート行列の固有値、固有ベクトルを求めるa = np.array([[1,2],[2,1]])w, v = linalg.eigh(a)1 22 1a w3-1行列 固有値1-1v固有ベクトル (※)11※実際には正規化されたベクトルが得られる
1731シュレーディンガー方程式の固有値問題行列の低ランク近似による画像圧縮𝐴𝑥 = 𝜆𝑥𝑋 = 𝑈Σ𝑉†
1831目標差分化により、シュレーディンガー方程式が行列の固有値問題に帰着することを確認• 固有値が基底状態のエネルギーとして得られる• 基底状態の波動関数が対応する固有ベクトルとして得られる
1931𝑣 ℎ山の高さを超えられない初速古典系の場合山を登りきれずに100%跳ね返される量子系の場合ほとんど跳ね返されるが… 低確率ですり抜ける
2031電子をエネルギー障壁で閉じ込める(井戸型ポテンシャル)電子の存在確率が障壁の外に少しだけ染み出す−ℏ22𝑚𝑑2𝑑𝑥2+ 𝑉 𝑥 𝜓 𝑥 = 𝐸𝜓(𝑥)電子の存在確率は以下のシュレーディンガー方程式の解として求まる
2131−ℏ22𝑚𝑑2𝑑𝑥2+ 𝑉 𝑥 𝜓 𝑥 = 𝐸𝜓(𝑥)シュレーディンガー方程式𝜓 𝑥離散化𝑣𝑖連続的な関数 離散的なベクトル
2231𝑑2𝜓𝑑𝑥2∼ 𝑣𝑖+1−2𝑣𝑖+𝑣𝑖−1「微分」は「差分」で近似できる−ℏ22𝑚𝑑2𝑑𝑥2+ 𝑉 𝑥 𝜓 𝑥 = 𝐸𝜓(𝑥) 𝐻 Ԧ𝑣 = 𝜆 Ԧ𝑣離散化シュレーディンガー方程式 行列の固有値問題固有値: 電子のエネルギー固有ベクトル:電子の存在確率
2331電子の存在確率が障壁の外に少しだけ染み出すE0-5閉じ込め効果により少しエネルギーが高くなる井戸型ポテンシャルに閉じ込められた電子が・障壁の外に少し染み出すこと・閉じ込めによりエネルギーが少し高くなることを確認する
2431目標モノクロ画像は「行列」とみなすことができる行列を特異値分解し、低ランク近似により近似行列を作る
2531m行k列の行列と k行n列の行列の積はm行n列になる(3, 4) (4, 5) (3, 5)X =(3, 4)(4, 5)(3, 5)
2631m行k列の行列と k行n列の行列の積はm行n列になるkを小さくとると、大きな行列を細い行列の積で近似できる≒ xmnmkkn要素数mn 要素数mk 要素数knk << m, n なら mn >> k(m+n)
2731𝑋 = 𝑈Σ𝑉†x x=𝑋 𝑈 𝑉†ΣΣ 特異値(対角行列)Singular Value Decomposition, SVD𝑈 𝑉† ユニタリ行列(正方行列)
2831x x=𝑋 𝑈 𝑉†Σ𝑈 Σ x Σ𝑉†=こことここだけ使って再構成෨𝑋 = x𝑈 Σ Σ𝑉†
2931モノクロ画像は、行列とみなすことができる25 6859 12高さh、幅wのモノクロ画像は各要素0から255のh行w列の行列
3031インターネットから画像をダウンロード 画像をモノクロ化行列とみなして低ランク近似 近似された画像෨𝑋 = x𝑈 Σ Σ𝑉†
3131インターネットから画像をダウンロード 画像をモノクロ化行列とみなして低ランク近似 近似された画像෨𝑋 = x𝑈 Σ Σ𝑉†