いろんなものはつながっている

pythonで内積をしてみる

以下のベクトルの内積計算を考える

1.ベクトルα |α(θ,φ)>とベクトルv |v(i)>の内積をとってその和を求める。
  P(θ,φ) = Σ|<α(θ,φ)|v(i)>}^2
2.その次に各θに関し(θを固定し)、P(θ,φ)が最小になるφを求め、そのφを代入する。
3.1/P(θ)のピーク値を求める

上記を行列の計算で行う。

# coding: utf-8
import numpy as np
from scipy import linalg
from scipy import signal as signal
import matplotlib.pyplot as plt

def generate_alpha_vec(theta, phi, freq_hz):
    #定数
    sen_num = 5
    sen_dis_m = 50
    light_vel = 299792458
    #固定値
    const_phase = 2.0 * np.pi * freq_hz * sen_dis_m / light_vel
    sen_angle_diff = np.arange(sen_num) * 360.0/sen_num
    sen_angle_diff=sen_angle_diff.reshape(-1, sen_num)
    d2r = (np.pi/180.0)
    #αベクトル生成
    phi_phase = np.cos(phi * d2r)
    alpha_vec_phase = const_phase * phi_phase * np.cos((theta - sen_angle_diff) * d2r)
    alpha_vec_at_theta = np.exp(1j * alpha_vec_phase)

    return alpha_vec_at_theta

#αベクトル群
# αベクトル群をtheta数 x phi数 x ベクトル次元 の行列で用意する
def generate_alpha_vec_series(freq_hz):
    sen_num = 5
   
    theta_array = np.arange(360)
    phi_array = np.arange(80)

    alpha_vec = np.empty((0, phi_array.shape[0], sen_num))
    for theta in theta_array:
        alpha_vec_e = np.empty((0, sen_num))
        for phi in phi_array:
            alpha_vec_at_theta = generate_alpha_vec(theta, phi, freq_hz)
            alpha_vec_e = np.append(alpha_vec_e, alpha_vec_at_theta, axis=0)
        alpha_vec_e = alpha_vec_e.reshape(-1, alpha_vec_e.shape[0], alpha_vec_e.shape[1])
        alpha_vec = np.append(alpha_vec, alpha_vec_e, axis=0)

    return alpha_vec

if __name__ == '__main__':
    #データ列
    rand_data=(np.random.randn(1, 5) + np.random.randn(1, 5) * 1j)
    #相関行列
    cov = np.dot(rand_data.T, rand_data.conjugate())
    #対角化
    eigval, eigvec = linalg.eigh(cov)
    print(eigval)
    v_vec = eigvec[:,:-2]

    alpha_vec_series = generate_alpha_vec_series(freq_hz)

    #<α(θ,φ)|v(i)>  すべてのθ、φ、iについて
    proj = np.dot(alpha_vec_series, v_vec.conjugate())
    # | <α(θ,φ)|v(i)>|^2
    proj_abs2 = np.power(np.abs(proj), 2)
    #P(θ,φ)=Σ_i | <α(θ,φ)|v(i)>|^2  iについて和をとる
    proj_abs2_sum = np.sum(proj_abs2, axis=2)
    #各θに対して、P(θ,φ)が最小になるφを求める    
    p_denomi = np.min(proj_abs2_sum, axis=1)
    phi_index = np.argmax(proj_abs2_sum, axis=1)
   
    #1/P(θ)のピークを求める
    p_theta =10*np.log10(5.0/pmu_denomi)
    peak_index_list = signal.argrelmax(p_theta)
   
    #1/P(θ)をプロットする
    theta_list = np.arange(0,360)
    plt.plot(theta_list, p)
    plt.show()

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク