電気回路シミュレーション



この出版物では、状態変数を使用して電気回路をモデル化する方法について説明しています。



この出版物は、この方法による電気回路のモデリングに関する少なくとも1つのhow2がロシア語であることを確認するためのものです。 かつて、私は多くのグーグルを検索しましたが、通常の素材に出会ったことはありません。 すべてのマニュアルとテキストには理論のみが含まれていました。 さらに、私が見つけた材料には、完全な解決サイクルがありませんでした。



スキーム⟶方程式⟶数値解法⟶グラフィックス。



実際、これはアクションのアルゴリズムです。



スキームがあり、今はオームとキルヒホフの法則を使用して方程式を作成する必要があります。



成分方程式:

C fracdUcdt=ic;L fracdildt=UL;







U1=i1R1;U2=i2R2;U3=i3R3;U4=i4R4;U1=i1R1;







輪郭方程式:

EULU1=0;







U1U2U3=0;







U3UCU4=0;







節点方程式:

iLi1i2=0;







i2i3i4=0;







ic=i4;









次に、微分方程式を導出する必要があります。 この方法では、状態変数のためにコンデンサーとインダクターの磁束結合を充電するのが一般的です。 これらの値がわかれば、ノードとブランチの電圧と電流を引き出すことができます。 また:



  1. 方程式は独立している必要があります。
  2. 方程式には、状態変数とソースのみを含める必要があります。 他のすべての変数は、状態変数で表現する必要があります。
  3. 状態変数の一次導関数は、各方程式の左側に入力する必要があります。 右側に派生物がないはずです。


最初の微分方程式を導きます:

UL=EU1=EU2U3=EU2UCU4;







UL=Ei2R2UCiCR4=EiL fracEULR1R2UCiCR4;







UL=EiLR2+E fracR2R1UL fracR2R1UCiCR4;







UL fracR1+R2R1=E fracR1+R2R1iLR2UCiCR4;







iC=iLi1i3=iL fracEULR1 fracUC+iCR4R3;







iC fracR3+R4R3=iL fracEULR1 fracUCR3;







コイルの電圧の式でコンデンサ電流を代入します。

UL fracR1+R2R1=E fracR1+R2R1iLR2UC fracR3R4R3+R4iL fracER1+ fracULR1 fracUCR3;







方程式を変換すると、最初の微分方程式が得られます。

L fracdiLdt=UL=E fracR1R1+R2R3+R4+R3R4iLR2R3+R4+R3UCR3;







二次微分方程式を導きます:

iC=iLi1i3=iL fracEULR1 fracUCR3 fraciCR4R3;







C fracdUcdt=ic= fracR3CR3+R4iL fracEULR1 fracUCR3









これで、数値的に解くことができる微分方程式系ができました。

 begincasesL fracdiLdt=E fracR1R1+R2R3+R4+R3R4iLR2R3+R4+R3UCR3;C fracdUcdt= fracR3CR3+R4iL fracEULR1 fracUCR3; endcases









オイラー法を使用します これは最も単純で 、Pythonを使用しています。

Xi=Xi1+h fracdXi1dt







プログラム
import numpy as np import matplotlib.pyplot as plt #Input voltage amplitude AMP = 21.0 #Active components r1 = 2000.0; r2 = 10.0; r3 = 10.0; r4 =2000.0; #Reactive components c=0.0001; l=0.06; #Time components T=0.01; t0=0.0; step=T/1000; tf=T*10 steps=int(tf/step); #Input voltage def E(t): n=int(t/T) if ((t >= n*T )and(t <= n*T + T/2)): return AMP else: return 0.0 time = np.arange(t0, tf, step) ul = []; il = []; uc = []; ic = []; y = []; for i in range(0, steps, 1): y.append(E(time[i])) def dIl_dt(t): return float((1.0/l)*(E(t) - (r1/((r1+r2)*(r3+r4)+r3*r4) * (il[int(t/step)]*(r2*(r3+r4)+r3) - uc[int(t/step)]*r3)))) def dUc_dt(t): return float((1.0/c)* (r3/(r3+r4)) * (il[int(t/step)]-(E(t)-ul[int(t/step)])/r1 - uc[int(t/step)]/r3)) #Start condition ul.append(E(0)); il.append(0.0); uc.append(0.0); ic.append(0.0); #Euler method for i in range(1, steps, 1): il.append(il[i-1] + step*dIl_dt(time[i-1])) uc.append(uc[i-1] + step*dUc_dt(time[i-1])) ul.append(l*dIl_dt(time[i])) ic.append(c*dUc_dt(time[i])) plt.figure("charts") e = plt.subplot(311) e.plot(time, y) e.set_xlabel('time (s)') e.set_ylabel('E(t), (V)', color='b') plt.grid(True) UL = plt.subplot(312) UL.plot(time, ul) UL.set_xlabel('time (s)') UL.set_ylabel('Ul(t), (V)', color = 'b') IL = UL.twinx() IL.plot(time, il, 'r') IL.set_ylabel('Il(t), (A)', color = 'r') plt.grid(True) UC = plt.subplot(313) UC.plot(time, uc) UC.set_xlabel('time (s)') UC.set_ylabel('Uc(t), (V)', color = 'b') IC = UC.twinx() IC.plot(time, ic, color = 'r') IC.set_ylabel('Ic(t), (A)', color = 'r') plt.grid(True) plt.show()
      
      









シミュレーション結果:





実際の計算のために他の方法を使用して差異を解決し、自己学習用の要素の電圧と電流のグラフを取得する方が、最も単純なオイラー法で十分です。 電子工学では、最も一般的なニュートンラプソン法-ほとんどのCADシステムでは、この方法が使用されます。



文学から私はMathanov P.N.の本に助言します およびZeveke G.V.

また、あらゆる種類の技術(MSTU、サンクトペテルブルク、トムスクなど)および類似の資料のマニュアルは、そこに書かれている内容を理解するよりも簡単に捨てられます。 ここで、キャッチフレーズは非常に不適切です。「単純化は難しく、複雑化は簡単です。」



All Articles