« 2018年2月 | トップページ | 2018年4月 »
Excel VBAをよく使っているが、最近まで構造体の中に動的配列を入れて、その構造体をさらに動的配列にする方法を知らなかった。
Public Type Complex x As Double y As Double End Type
その上で、こんな風に構造体の変数に動的配列を使う。
Public Type snp S() As Complex nmax As Integer freq As Double End Type
そして、これの構造体も行列の大きさも確保するには、
Public Sub Init_snp(S() As snp, port_num As Integer, freq_points As Integer)
Dim i As Integer, j As Integer, k As Integer
ReDim S(freq_points)
For k = 1 To freq_points ReDim S(k).S(port_num, port_num) S(k).nmax = port_num Next k
End Sub
のようなサブルーチンを作って呼び出すのが便利。
Excel VBAで複素数演算(一次方程式・FFT他, Numerical Recipes移植)、フィッティング(非線形含む)、ルンゲクッタ8次(DOP853)などが使えるライブラリ
先日は2ポートの計算でしたが、こちらが本題。
from sympy import *
init_printing()
SA=MatrixSymbol('SA',2,2)
SB=MatrixSymbol('SB',2,2)
SC=MatrixSymbol('SC',2,2)
SD=MatrixSymbol('SD',2,2)
I=Identity(2)
O=ZeroMatrix(2,2)
A=BlockMatrix([[I,-SA],[O,-SC]])
B=BlockMatrix([[SB,O],[SD,-I]])
block_collapse(Inverse(A)*B)
すると、結果はこうなる。
from sympy import *
init_printing()
S11,S12,S21,S22=symbols('S11 S12 S21 S22')
# b1=S11*a1 + S12*a2
# b2=S21*a1 + S22*a2
#を(b1,a1) = T*(a2,b2)に書き直す。
A=Matrix([[1,-S11],[0,-S21]])
B=Matrix([[S12,0],[S22,-1]])
T=A.inv()*B
T
すると簡単に、
さて昨日は2ポートの変換行列Mを求めたので、これを4ポートに応用しよう。
from sympy import *
S11,S12,S13,S14=symbols('S11 S12 S13 S14')
S21,S22,S23,S24=symbols('S21 S22 S23 S24')
S31,S32,S33,S34=symbols('S31 S32 S33 S34')
S41,S42,S43,S44=symbols('S41 S42 S43 S44')
init_printing()
S=Matrix([[S11,S12,S13,S14],[S21,S22,S23,S24],[S31,S32,S33,S34],[S41,S42,S43,S44]])
M=(1/sqrt(2))*Matrix([[1,-1,0,0],[0,0,1,-1],[1,1,0,0],[0,0,1,1]])
Smix=M*S*M.inv()
simplify(Smix)
こんな感じで計算すると、
Sdd11, Sdd12, Sdc11, Sdc12 Sdd21, Sdd22, Sdc21, Sdc22 Scd11, Scd12, Scc11, Scc12 Scd21, Scd22, Scc21, Scc22
となっている。これで普通にMixedモードが計算できるようになった! Sympyめちゃくちゃ便利。
Twitter経由で
を見て面白いな、と思ったので、そこに書かれている文献をさらに見た。
Numerical Modeling of Diffusion and Phase Transitions in Heterogeneous Media
Towards the perfect soft boiled egg
完璧なゆで卵の作り方方程式(Peter Barhamによる)
急にMixed mode Sパラメータの計算が必要になった。もちろん、
from sympy import *
v1, v2, i1, i2=symbols('v1 v2 i1 i2')
vdiff, vcom, idiff, icom=symbols('vdiff vcom idiff icom')
a1, a2, b1, b2=symbols('a1 a2 b1 b2')
adiff, acom, bdiff, bcomm=symbols('adiff acom bdiff bcom')
Zo, Zdiff, Zcom=symbols('Zo Zdiff Zcom')
init_printing()
x=solve([a1-(v1+Zo*i1)/sqrt(Zo),b1-(v1-Zo*i1)/sqrt(Zo)],[v1,i1])
v1=x[v1]
i1=x[i1]
y=solve([a2-(v2+Zo*i2)/sqrt(Zo),b2-(v2-Zo*i2)/sqrt(Zo)],[v2,i2])
v2=y[v2]
i2=y[i2]
vdiff=v1-v2
idiff=(i1-i2)/2
vcom=(v1+v2)/2
icom=(i1+i2)
Zdiff=2*Zo
Zcom=Zo/2
adiff=(vdiff+Zdiff*idiff)/sqrt(Zdiff)
bdiff=(vdiff-Zdiff*idiff)/sqrt(Zdiff)
acom=(vcom+Zcom*icom)/sqrt(Zcom)
bcom=(vcom-Zcom*icom)/sqrt(Zcom)
となる。
と計算できる。これを使えば4ポートのMixedモードもすぐに計算できる(それは次回のその2、で)。
SパラメータデータのデフォルトスタンダードファイルフォーマットであるTouchstone。
<frequency value> <N11>, <N21>, <N12>, <N22>
というように21、12の順に並ぶのに、
3ポート以上は
同時上映のアナと雪の女王・家族の思い出もオラフ大活躍でとてもよかった。
表紙の金田一耕助のような風貌から、叔父さんが名探偵で謎を解明していくミステリ?と思ったら、麻耶雄嵩さんがそんなものを書くはずがなかった。
ホーキングさんがお亡くなりになった。追悼の意を込めて、使われていた機材を紹介。
レノボのヨガ260に、文字入力としてはACATというインテルのソフトウェアが導入されている。
これはASSISTIVE CONTEXT-AWARE TOOLKIT (ACAT)の略で、
今は、オープンソースのプラットフォームになっている。Githubにソースなどがある。
口がきけない女性、黒人、老人のゲイ、と虐げられていても声を出せない人々に焦点を当てて、、、というのは表向きでただただ半魚人が幸せになるところを描きたくて、それを描いていたら感動作になってしまった、という感じの作品だ。それでアカデミー賞総なめ。
このTweet見て、
In 1993 Don Zagier found the smallest rational right triangle with area 157. He used sophisticated techniques using elliptic curves paired with a lot of computational power. pic.twitter.com/MjYJH80RiT
— Fermat's Library (@fermatslibrary) 2018年3月7日
これはぜひ確かめようと思った。
参考になる文献はこんなところ。
http://www.ias.ac.in/article/fulltext/reso/003/08/0033-0045
まずPari/GP:
となった。ただ、WolframAlphaはちゃんと計算してくれた。
ちょっと必要になってフーリエ級数の計算をする自作式を作ってみた。
« 2018年2月 | トップページ | 2018年4月 »
最近のコメント