« 一般化ナベアツ数Nab_n(x) (xまでのうちnの倍数とnがつく数のときだけアホになる)のナベアツ数階段をPythonでプロットする。この前やった加藤文元さんのナベアツ数の図示の続き。どれもNab_n(x)/x→1? | トップページ | Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その2,行列とベクトルのまま計算する場合。非可換シンボル(commutative=False)を使う。 »

2021年5月21日 (金)

Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その1、成分で書く場合

Sympyの使い方を勉強中です。何かよく知っている事例で試せないかな?ということで、

Zパラメータ(Z行列、インピーダンス行列)をSパラメータ(S行列)に変換してみよう。とりあえず2ポートで。

Zパラメータはポート1,2の電流(I1, I2)と電圧(V1,V2)を使って

[V1] = [Z11   Z12] [I1]

[V2]    [Z21   Z22] [I2]

とかける。Sパラメータはポート1、2の入射波(a1,a2)と反射波(b1,b2)を使って

[b1] = [S11   S12] [a1]

[b2]    [S21   S22] [a2]

とかける。ここで

V1=√Zo (a1 + b1), V2 = √Zo (a2 + b2)

I1=(a1 - b1)/√Zo,  I2 =  (a2 - b2)/√Zo

の関係がある。ここまでの情報からSympyに取り込む。collectが大活躍で簡略化してくれる。

やってること:subsでi,vにa,bを入れる。

solveでbについて解く。collectを使って簡略化する(simplifyが全然だめだったので)

係数を求めるのにどうも有理数ではcoeffが効かない?っぽいので、subsで片側を0にして求める。

こんな感じ:

from sympy import *
init_printing()
#Sパラメータ, Zパラメータの変数定義
var('S11,S12,S21,S22')
var('Z11,Z12,Z21,Z22')
var('a1,a2,b1,b2')
var('i1,i2,v1,v2')
S = Matrix([[S11,S12],[S21,S22]])
Z = Matrix([[Z11,Z12],[Z21,Z22]])
a=Matrix([[a1],[a2]])
b=Matrix([[b1],[b2]])
i=Matrix([[i1],[i2]])
v=Matrix([[v1],[v2]])
#特性インピーダンスZo
Zo = Symbol('Zo')
#Zパラメータと電流・電圧の関係
expr = v - Z*i
#Zパラメータの電流、電圧を進行波a, 反射波bで書き直す
expr2 =expr.subs([(i1,(a1 - b1) / sqrt(Zo)), (i2,(a2 - b2) / sqrt(Zo)), (v1, (a1 + b1) * sqrt(Zo)),(v2,(a2 + b2) * sqrt(Zo))])
#反射波bに関して解く
Sconvert = solve(expr2, [b1,b2])
#係数ごとに簡略化する。
Sconvert1 = collect(Sconvert[b1],[a1,a2,Zo])
Sconvert2 = collect(Sconvert[b2],[a1,a2,Zo])
Sconvert11 = collect(Sconvert1.subs(a2,0)/a1,Zo)
Sconvert12 = collect(Sconvert1.subs(a1,0)/a2,Zo)
Sconvert21 = collect(Sconvert2.subs(a2,0)/a1,Zo)
Sconvert22 = collect(Sconvert2.subs(a1,0)/a2,Zo)
#最終的な結果
Sconvert=Matrix([[Sconvert11,Sconvert12],[Sconvert21,Sconvert22]])
display(Sconvert)

結果はこんな感じ。

Sympy202105161

最終結果を拡大すると、

Sympy202105162

と望む結果が得られた。

とはいえ、成分で書くのはイマイチ、、、行列のまま計算したい。ということで(続く)。

« 一般化ナベアツ数Nab_n(x) (xまでのうちnの倍数とnがつく数のときだけアホになる)のナベアツ数階段をPythonでプロットする。この前やった加藤文元さんのナベアツ数の図示の続き。どれもNab_n(x)/x→1? | トップページ | Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その2,行列とベクトルのまま計算する場合。非可換シンボル(commutative=False)を使う。 »

学問・資格」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 一般化ナベアツ数Nab_n(x) (xまでのうちnの倍数とnがつく数のときだけアホになる)のナベアツ数階段をPythonでプロットする。この前やった加藤文元さんのナベアツ数の図示の続き。どれもNab_n(x)/x→1? | トップページ | Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その2,行列とベクトルのまま計算する場合。非可換シンボル(commutative=False)を使う。 »

最近の記事

最近のコメント

2025年1月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
フォト
無料ブログはココログ