バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は、Python(Numpy)で直積は可能かを確認した。
結果としては可能。
ただし、ベクトル(数列)、行ベクトル、列ベクトルの違いでやや振り回された感はある。
今回は、Python(Numpy)によるフーリエ変換、逆フーリエ変換for文無し版にチャレンジ
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
Python(Numpy)によるフーリエ変換、逆フーリエ変換for文無し版
前回、Python(Numpy)の直積に関してはいろいろあったにしても
可能ってのがわかったわけだし、
フーリエ変換、逆フーリエ変換for文無し版も作れるよね。
一応作って来た。
大体流れは一緒な感じ?
流れは・・・一緒だな。
ただ、ベクトルの種別都合で変数を増やしてるところはあるな。
まぁとりあえずコードを見てみよう。
フーリエ変換、逆フーリエ変換for文無し版のコード
コードの差分は以下になる。
Fw = np.zeros(len(ft), dtype=complex) # F(ω) フーリエ変換後の関数格納用
# F(ω)=∫f(t)e^(-iωt)dt
cnt=0
for tn in t:
Fw[cnt]=ft@np.exp(-1j*w*tn).T*dt
cnt = cnt+1
fx = np.zeros(len(Fw), dtype=complex) # f(x) 逆フーリエ変換後の関数格納用
# f(x)=(1/2π)∫F(ω)e^(iωt)dω
cnt=0
x=t
for wn in w:
fx[cnt]=Fw@np.exp(1j*wn*x).T*dw/(2*np.pi)
cnt = cnt+1
↓
# ベクトルを行ベクトルへ変換
wMat=np.reshape(w, (1,N));
tMat=np.reshape(t, (1,N));
# F(ω)=∫f(t)e^(-iωt)dt
Fw=ft@np.exp(-1j*wMat.T@tMat)*dt;
# f(x)=(1/2π)∫F(ω)e^(iωt)dω
x=tMat
fx=Fw@np.exp(1j*wMat.T@x)*dw/(2*np.pi);
コードを見た感想
MATLABの時と同じようにかなりスッキリはしてるけど、
wMat、tMatってのが増やした変数ってところだね。
しかし、何ゆえに増やしたのかがわからん。
wMat、tMatはベクトル(数列)を行ベクトルに代えてる。
最初から行ベクトル、列ベクトルとすれば、
確かにこの変数は不要となる。
しかし、その場合、その後のplot時に変数参照が添え字だらけになって、かなりMATLABコードと乖離しちゃうんだよね。
それは嫌なんで一時的に行ベクトルにする変数を増やした。
って感じだ。
なるほど。
確かにMATLABコードと変に乖離するのは嫌だな。
まぁMATLAB側の時の話でfor文無し版のコードは使わない方針にしたわけだから、好き勝手書き換えても良かったんだけどね。
本音をいっちゃうとめんどくさかったから。
(ぶっちゃけやがった・・・。)
まぁ出来るということが分かること自体は収穫だよね。
まだ実際に動かしてはいないけどね。
まとめ
まとめだよ。
- Python(Numpy)によるフーリエ変換、逆フーリエ変換for文無し版を作成。
- 基本的な流れはMATLABと一緒。
- しかし、行ベクトル生成用の変数を追加している。
- 最初からベクトルでも良いが、plotで使用する際に添え字が増えてMATLABコードと乖離し易くなるデメリットあり。
バックナンバーはこちら。
コメント