波形の伝送アニメーション

モジュールのインポート

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import ArtistAnimation
import scienceplots
#Warning : As of version 2.0.0, you need to add import scienceplots before setting the style (plt.style.use('science')).
plt.style.use(['science', 'notebook'])

波形のユーザ関数

def funcv(t,zc): # 関数の定義
    return np.sin(t-zc)

アニメーション

1周期の正弦波信号の伝送を,$z/c$ の関数とし,時間 $t$ を変化させたアニメーションは,
fig, ax = plt.subplots() # グラフ領域の作成

# グラフ要素のリスト(artists)作成
artists = []
pi2 = 2.0*np.pi
n = 201
t_min, t_max = 0.0, 6.0*pi2
zc_min, zc_max = 0.0, 6.0*pi2
zc = np.linspace(zc_min, zc_max, n)
y = np.zeros(n)
dt = (t_max-t_min)/float(n-1)
tt = np.empty(0)
yy = np.empty((0,n))
nT = 1.0 # 伝送する正弦波信号の周期
for i in range(n):
    t = t_min+i*dt
    alpha = t-zc
    x1 = alpha >= 0.0 # 信号の範囲
    x2 = alpha <= pi2*nT # 信号の範囲
    x3 = np.logical_and(x1, x2)   
    y = np.where(x3, funcv(t,zc), 0.0)
    tpi2 = t/pi2
    my_title = ax.text(10.0, 1.6, f"$t=2\pi*${tpi2:.2f}", size="x-large")
    my_line, = ax.plot(zc, y,"blue")
    artists.append([my_line, my_title]) #  アニメーション化する要素をリスト化
    tt = np.append(tt, t)
    yy = np.append(yy, [y], axis=0)
yyt = np.transpose(yy)

# アニメーション化
ax.set_xlim(0, 30) # x軸範囲の設定
ax.set_ylim(-2, 2) # y軸範囲の設定
ax.set_xlabel("$z/c$ [s]", size="large") # x軸のラベル設定
ax.set_ylabel("$V(t-z/c) / V_{max}$", size="large") # y軸のラベル設定
anim = ArtistAnimation(fig, artists, interval=10)
anim.save("animation_sin_z_1T.gif", writer="pillow")
plt.show()

2周期の正弦波信号の伝送の場合,

3周期の正弦波信号の伝送の場合,

波形の計算値をフォーマット付きで簡易に出力すると(データを間引いている),
nd = 25
np.set_printoptions(suppress=True, precision=3, floatmode='fixed')
yy3 = yyt[0:n:nd,0:n:nd]
print(yy3)
[[ 0.000 -1.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000]
 [ 0.000  0.000 -1.000  0.000  0.000  0.000  0.000  0.000  0.000]
 [ 0.000  0.000  0.000 -1.000  0.000  0.000  0.000  0.000  0.000]
 [ 0.000  0.000  0.000  0.000 -1.000  0.000  0.000  0.000  0.000]
 [ 0.000  0.000  0.000  0.000  0.000 -1.000  0.000  0.000  0.000]
 [ 0.000  0.000  0.000  0.000  0.000  0.000 -1.000  0.000  0.000]
 [ 0.000  0.000  0.000  0.000  0.000  0.000  0.000 -1.000  0.000]
 [ 0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -1.000]
 [ 0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000]]
また,変数も一緒に出力すると,
print("sin (t - z/c)")
print(f"{' z/c':>10s}",end=' ')
[print(f"{zc[j]/np.pi:6.3f}",end=' ') for j in range(0,n,nd)]
print('')
print(f"{'i':>3s}{' t':>7s}",end=' ')
print('')
for i in range(0,n,nd):
    print(f'{i+1:3d}',end=' ')
    print(f'{tt[i]/np.pi:6.3f}',end=' ')
    for j in range(0,n,nd):
        print(f'{yyt[i,j]:6.3f}',end=' ')
    print('')
sin (t - z/c)
       z/c  0.000  1.500  3.000  4.500  6.000  7.500  9.000 10.500 12.000 
  i      t 
  1  0.000  0.000 -1.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 
 26  1.500  0.000  0.000 -1.000  0.000  0.000  0.000  0.000  0.000  0.000 
 51  3.000  0.000  0.000  0.000 -1.000  0.000  0.000  0.000  0.000  0.000 
 76  4.500  0.000  0.000  0.000  0.000 -1.000  0.000  0.000  0.000  0.000 
101  6.000  0.000  0.000  0.000  0.000  0.000 -1.000  0.000  0.000  0.000 
126  7.500  0.000  0.000  0.000  0.000  0.000  0.000 -1.000  0.000  0.000 
151  9.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -1.000  0.000 
176 10.500  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -1.000 
201 12.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000