지난번 줄의 파동은 이를 위한 수단이고, 사실 이번 주제가 내가 하려 했고 가장 힘들었던 타겟이였다!
줄의 파동과 유사하게 전송선로를 진행, 반사 등 하는 전압, 전류 파동의 규칙과
이를 표현하는 방법에 익숙해지기를 바라며 머릿속에 전압과 전류파의 전파되는 모습을 상상하고 싶었다.^^;
내가 학부때 배웠던 회로이론, 전자기학, 초고주파 책들을 오랜만에 다시 들춰보게되고
몇 군데 인터넷사이트도 많이 봤는데, 솔직히 많이 어렵고 힘들었다. 잘 이해안되는 부분도 있고, 시간도 많이 걸리고,,,
그러나 최대한 신뢰있는 자료를 근거로 검증된 것을 시각화하려고 노력했다.
먼저 파이썬 scikit-rf 패키지 아래 문서자료를 참고하여 기본코드를 작성하고 공부했는데,
복소 전파상수, 복소 반사계수, 복소 임피던스, SWR 등에 대해 많은 도움이되는 것 같다.
위 내용을 대략 이해한 다음, 'hayt의 전자기학 9th' 전송선로의 몇 가지 예를 파이썬으로 모델링해 보고 싶었다.
비슷한 사례가 있는지 구글링하다가 아래 블로그글에서 한 줄기 빛을 찾았다.
조금은 느리게 살자: 전압파의 반사 계수(Reflection Coefficient of Voltage Wave) (ghebook.blogspot.com)
벌써 10년 더 전에 작성된 블로그글이었지만 전송선로에 대해 너무 깔끔하게 잘 정리되어 있었다!
특히 23번 식을 이용하면, 더 직관적이었고 코드로 구현이 더 쉬운 새로운 솔루션이 될 것 같았다.
매번 느끼는 것이지만 계속 고민하고 코드를 짤수록 정리와 이해가 조금씩 더 되는 것 같다.
결국 예시문제와 이를 모델링한 결과, 그리고 우여곡절 끝에 결국 완성한 코드는 아래와 같다!
<hayt의 전자기학 9th 예시문제> 안테나에서 TV 또는 FM수신기로 연결되는 인입선과 같이 특성 임피던스가 300Ω인 평행2선 전송선로를 생각하자. 이 회로의 선로길이는 2m, L과 C는 선로에서 전파속도 2.5M m/s를 만족하도록하는 값을 갖는다. 이 선로의 한 끝단에 입력저항이 300Ω인 수신기 두 대가 병렬로 연결된 되고, 안테나는 100MHz에서 Vs=60V와 직렬 연결된 저항 300Ω의 테브닌 등가회로이다. 전송선로에서의 전압은 어떻게 될까?
import matplotlib.pyplot as plt
from numpy import *
import skrf as rf
rf.stylely()
freq = rf.Frequency(100, unit='MHz', npoints=1)
# load and line properties
#Z_L = 0 # Ohm
Z_L = 150 # Ohm
#Z_L = 300000 # Ohm
Z_0 = 300 # Ohm
L = 2 # m
VF = 2.5/3
lambd = rf.c/freq.f * VF # 파장
# propagation constant
alpha = 0 # Lossless
#alpha = 0.02 # Loss : Np/m. Here a dummy value, just for the sake of the example
beta = freq.w/rf.c/VF
gamma = alpha + 1j*beta
z = linspace(-L, 0, num=301)
G_0 = (Z_L - Z_0)/(Z_L + Z_0)
SWR = (1 + G_0)/((1 - G_0))
G_in = G_0*exp(2*gamma*z)
Z_in = Z_0 * (Z_L + 1j*Z_0*tan(-beta*z)) / (Z_0 + 1j*Z_L*tan(-beta*z))
print('Z_in[z==-L] : ', Z_in[z==-L], abs(Z_in[z==-L]), angle(Z_in[z==-L])*180/pi)
# source properties
V_s = 60
Z_s = Z_0
#Z_s = 450
G_S = (Z_s - Z_0)/(Z_s + Z_0)
I_in = V_s/(Z_s + Z_in)
V_in = I_in * Z_in
print('V_in[z==-L] : ', V_in[z==-L], abs(V_in[z==-L]), angle(V_in[z==-L])*180/pi)
print('I_in[z==-L] : ', I_in[z==-L], abs(I_in[z==-L]), angle(I_in[z==-L])*180/pi)
V = (Z_0*V_s)/(Z_s+Z_0)*exp(-gamma*L)/(1-G_S*G_0*exp(-2*gamma*L)) \
*(exp(-gamma*z)+G_0*exp(gamma*z))
I = V_s/(Z_s+Z_0)*exp(-gamma*L)/(1-G_S*G_0*exp(-2*gamma*L)) \
*(exp(-gamma*z)-G_0*exp(gamma*z))
print('V[z==-L] = V_in : ', V[z==-L], abs(V[z==-L]), angle(V[z==-L])*180/pi)
print('V[z==-0] = V_L : ', V[z==0], abs(V[z==0]), angle(V[z==0])*180/pi)
fig, ax = plt.subplots(2,1,sharex=True)
ax[0].plot(z, abs(V), 'r')
ax[1].plot(z, abs(I), 'b')
ax[1].set_xlabel('z [m]')
ax[0].set_ylabel('|V| (V)')
ax[1].set_ylabel('|I| (A)')
ax[0].set_title('Voltage')
ax[1].set_title('Current')
[a.axvline(0, lw=8, color='k') for a in ax]
[a.axvline(-L, lw=8, color='k') for a in ax]
ax[1].annotate('Load', xy=(0, 0.14), xytext=(-0.5, 0.14),
arrowprops=dict(facecolor='black', shrink=0.05))
ax[1].annotate('Source', xy=(-L, 0.14), xytext=(-L+0.5, 0.14),
arrowprops=dict(facecolor='black', shrink=0.05))
plt.show(block=False)
Z_in[z==-L] : [464.16636236-206.57773312j] [508.05981122] [-23.99150608]
V_in[z==-L] : [38.04906676-5.93401418j] [38.50901201] [-8.86426477]
I_in[z==-L] : [0.07316978+0.01978005j] [0.07579622] [15.1272413]
V[z==-L] = V_in : [38.04906676-5.93401418j] [38.50901201] [-8.86426477]
V[z==-0] = V_L : [6.2464922+18.99950882j] [20.] [71.80062175]
OK! 검증완료! 전송선로에 존재하는 전압파와 전류파 식이 잘 동작하는 것 같습니다^^;
여기에 더해서,,, 설정값들(Γ0, Γs, L, γ)을 바꾸어 시뮬레이션해 볼 수도 있다!
이상,,, 혹시나 잘못된 부분 있으면 지적해주시기 바라며,,,
이와 관련한 이론이나 물리적 의미는 추후에 좀 더 보완해야겠다. 늦어서 오늘은 여기서 굳바이!!!
'물리' 카테고리의 다른 글
삼각함수, 쌍곡함수, 역함수 등 다양한 미분 정리 (0) | 2022.10.03 |
---|---|
자동차의 출력(마력), 토크 (0) | 2022.08.04 |
줄의 파동방정식 시현 (0) | 2022.04.10 |
자기장 B와 자기력선의 시각화 (0) | 2022.03.25 |
전기장E, 전위V의 시각화 (0) | 2022.02.14 |