反射波,透過波のアニメーション

モジュールのインポート

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 funcv2(alpha): # 関数の定義
    return np.sin(alpha)
def funcv3(alpha,nT): # 関数の定義
    n = len(alpha)
    y = np.zeros(n)
    x1 = alpha >= 0.0 # 信号の範囲
    x2 = alpha <= pi2*nT # 信号の範囲
    x3 = np.logical_and(x1, x2)   
    y = np.where(x3, funcv2(alpha), 0.0)
    return y

アニメーション

反射係数 $\Gamma=-0.1$ のインピーダンス不連続部($z=0$)によって, 1周期の正弦波信号が反射,透過する波形を, $z/c$ の関数とし,時間 $t$ を変化させたアニメーションで示すと,
fig, ax = plt.subplots() # グラフ領域の作成

# グラフ要素のリスト(artists)作成
artists = []
pi2 = 2.0*np.pi
n = 301
n2 = n//2+1
nT = 1.0 # 伝送する正弦波信号の周期 24.0
t_min, t_max = -5.0*pi2, 5.0*pi2 + (nT+1)*pi2
zc_min, zc_max = -5.0*pi2, 5.0*pi2
zc = np.linspace(zc_min, zc_max, n)
dt = (t_max-t_min)/float(n-1)
tt = np.empty(0)
yy = np.empty((0,n))
gamma = -0.1
for i in range(n):
    t = t_min+i*dt
    alpha = t-zc
    y1 = funcv3(alpha,nT)
    y = y1+gamma*y1[-1::-1]
    y = np.where(zc<=0.0, y, y1*(1+gamma))
    tpi2 = t/pi2
    my_title = ax.text(-5.0, 1.6, f"$t=2\pi*${tpi2:.2f}", size="x-large")
    my_line, = ax.plot(zc/pi2, y, 'RebeccaPurple')
    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(zc_min/pi2-0.5, zc_max/pi2+0.5) # x軸範囲の設定
ax.set_ylim(-2, 2) # y軸範囲の設定
ax.set_xlabel(r"$z/c/2/\pi$ [s]") # x軸のラベル設定
ax.set_ylabel("$V(t-z/c)$") # y軸のラベル設定
anim = ArtistAnimation(fig, artists, interval=10)
anim.save("p3_tlt_s10_1c_1T.gif", writer="pillow")
plt.show()

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

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

周期を十分長く,例えば,24周期とすると,

終端短絡すると,反射係数は $\Gamma=-1$ であり,このとき,次のようになる.

反射係数は $\Gamma=-0.5$ のとき,