« Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その1、成分で書く場合 | トップページ | Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その3. S=(Z+Zo)⁻¹(Z-Zo)とS=(Z-Zo)(Z+Zo)⁻¹とどちらでもいいことを確認。 »

2021年5月22日 (土)

Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その2,行列とベクトルのまま計算する場合。非可換シンボル(commutative=False)を使う。

昨日は行列とベクトルを成分に直して計算した。イマイチかっこわるい、、、ということで行列とベクトルのまま計算する方法。

Sympyで行列はMatrixSymbolで定義できるが、実はこれではどうやら今回のものは計算できないっぽい。

それは、solveがMatrixSymbolに対応してないから。

じゃあどうするか?というと、非可換の変数として定義する。

https://docs.sympy.org/latest/tutorial/manipulation.html

例えば

A=Symbol('A', commutative=False)とすると非可換になる。これならsolveが使える。ただしcollectiveは使えない。

成分と同様、こうやって計算できる。

from sympy import *
init_printing()
#Sパラメータ, Zパラメータの非可換の変数定義
V = Symbol('V', commutative=False)
I = Symbol('I', commutative=False)
a = Symbol('a', commutative=False)
b = Symbol('b', commutative=False)
S = Symbol('S', commutative=False)
Z = Symbol('Z', commutative=False)
#特性インピーダンスを対角成分にもつ行列のみ可換
Zo = Symbol('Zo')
#Zパラメータの定義
expr = V - Z*I
#V,Iを入射波a, 反射波bで書き直す。
expr2=expr.subs([(I, (a-b)/sqrt(Zo)), (V, (a+b)*sqrt(Zo))])
#反射波bについて解いたものがSパラメータ
Sconvert = solve(expr2, b)
#aをくくりだす
display(separatevars(Sconvert[0]))

 

結果はおなじみのものが得られた。

Sympy202105201

答え:

Sympy202105202

« Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その1、成分で書く場合 | トップページ | Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その3. S=(Z+Zo)⁻¹(Z-Zo)とS=(Z-Zo)(Z+Zo)⁻¹とどちらでもいいことを確認。 »

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

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

« Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その1、成分で書く場合 | トップページ | Python+Sympy(数式処理)でZパラメータ(インピーダンス行列)からSパラメータに変換する。その3. S=(Z+Zo)⁻¹(Z-Zo)とS=(Z-Zo)(Z+Zo)⁻¹とどちらでもいいことを確認。 »

最近の記事

最近のコメント

2021年9月
      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    
フォト
無料ブログはココログ