前提・実現したいこと
S11とS21の計算結果を、グラフしたいですしたいです。S11とS21の計算過程で行列を用いています。今、fが1~10[GHz]の間でプロットしたいです。fが1つの値に決めるときは、計算ができるのですが、fをnp.linspace()などで表すとエラーが出ます。電磁波の計算をしています。F行列を求めてS行列を計算しています。
発生している問題・エラーメッセージ
TypeError: only length-1 arrays can be converted to Python scalars
エラーメッセージ
該当のソースコード
import numpy as np import math import matplotlib.pyplot as plt def Q(f): return np.matrix([[1,Z/2], [0,1]]) def W(f): return np.matrix([[np.cos((k*d)/2),Z0*np.sin((k*d)/2)*1j], [Y0*np.sin((k*d)/2)*1j,np.cos((k*d)/2)]]) def E(f): return np.matrix([[1,0], [Y,1]]) def FF(f): return Q(f)@W(f)@E(f)@W(f)@Q(f) def F(f): n=5 return np.linalg.matrix_power(FF, n) f_min=1000000000 f_max=10000000000 f_points=100 f=np.linspace(f_min,f_max,f_points) w=2*np.pi*f d=5*10**(-3) Z0=78 Y0=1/Z0 f0=2.4*10**9 Wse=2*np.pi*f0 Wsh=2*np.pi*f0 Cl=1.5*10**(-12) Lr=1/(Wse**2*Cl) Cr=Lr/(Z0**2) Ll_=1/(Wsh**2*Cr) e0=8.8541878128*(10**(-12)) u0=1.25663706212*(10**(-6)) k=2*np.pi*f*np.sqrt((Cr/d)*(Lr/d)) theta=(k*d)/2 w0=2*np.pi*f0 eeff=2.047 b0=w0*np.sqrt(u0*e0*eeff) #ωはω0(共振周波数)のとき l=1/b0*np.arctan(w0*Ll_/Z0) b=w*np.sqrt(u0*e0*eeff) Ll=Z0*np.tan(b*l)/w Z=-1/(w*Cl)*1j Y=-1/(w*Ll)*1j matQ=np.zeros((f_points,2,2),dtype=complex) matW=np.zeros((f_points,2,2),dtype=complex) matE=np.zeros((f_points,2,2),dtype=complex) matFF=np.zeros((f_points,2,2),dtype=complex) matF=np.zeros((f_points,2,2),dtype=complex) s11=np.zeros((f_points),dtype=complex) s22=np.zeros((f_points),dtype=complex) for i in range(f_points): matQ[i]=Q(f[i]) matW[i]=W(f[i]) matE[i]=E(f[i]) matFF[i]=FF(f[i]) matF[i]=F(f[i]) A[i]=F[i[0,0]] B[i]=F[i[0,1]] C[i]=F[i[1,0]] D[i]=F[i[1,1]] s11[i]=(A[i]+B[i]/Z0-(Z0*C[i]+D[i]))/(A[i]+B[i]/Z0+Z0*C[i]+D[i]) s21[i]=2/(A[i]+B[i]/Z0+Z0*C[i]+D[i]) S11=20*np.log10(abs(s11)) S21=20*np.log10(abs(s21)) plt.plot(f,S11,label="S11") plt.plot(f,S21,label="S21") plt.grid(True) plt.xlabel("f",fontsize=20) plt.ylabel("S-para",fontsize=20) plt.title("S-para") plt.tight_layout() plt.show()ソースコード
試したこと
import numpy as np
f=2.010**9
w=2np.pi*f
d=510**(-3)
Z0=78
Y0=1/Z0
f0=2.4109
Wse=2np.pif0
Wsh=2np.pif0
Cl=1.5*10(-12)
Lr=1/(Wse2*Cl)
Cr=Lr/(Z02)
Ll_=1/(Wsh2Cr)
e0=8.8541878128(10(-12))
u0=1.25663706212*(10**(-6))
k=2np.pifnp.sqrt((Cr/d)(Lr/d))
theta=(kd)/2
w0=2np.pif0
eeff=2.047
b0=w0np.sqrt(u0e0eeff)
l=1/b0np.arctan(w0Ll_/Z0)
b=wnp.sqrt(u0e0eeff)
Ll=Z0np.tan(b*l)/w
Z=-1/(w*Cl)1j
Y=-1/(wLl)*1j
Q=np.matrix([[1,Z/2],
[0,1]])
W=np.matrix([[np.cos((kd)/2),Z0np.sin((kd)/2)1j],
[Y0np.sin((kd)/2)1j,np.cos((kd)/2)]])
E=np.matrix([[1,0],
[Y,1]])
FF=Q@W@E@W@Q
FF_=FF[0,0]*FF[1,1]-FF[0,1]*FF[1,0]
print("FF_={:.5f}".format(FF_))
n=5
F=np.linalg.matrix_power(FF, n)
A=F[0,0]
B=F[0,1]
C=F[1,0]
D=F[1,1]
s11=(A+B/Z0-(Z0C+D))/(A+B/Z0+Z0C+D)
S11=20*np.log10(abs(s11))
s21=2/(A+B/Z0+Z0C+D)
S21=20np.log10(abs(s21))
print("s11={:.5f}".format(s11))
print("S11={:.5f}".format(S11))
print("s21={:.5f}".format(s21))
print("S21={:.5f}".format(S21))
上記のように、fが1つの値を持つときは、計算できるのですが、S11とS21のグラフを作ろうとするとうまくいきません。横軸f、縦軸S11,S21で考えたいです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー