節点解析法について

 投稿者:大熊 正メール  投稿日:2009年 2月 1日(日)14時39分35秒
  増幅器を含む、交流回路の解析

1. CR回路2段の低域フィルターで単純な増幅器を含まないものは、
  節点方程式を立てて解けることが分りました。
  入力 E1 から最初の抵抗 R1,次がR2,その次が最終端子にアース
  に対しC2ガ在り、 このC2の出力が増幅器でK倍される。
    この増幅器の出力は、C1を介して R1とR2の節点に結ばれる。
  C1=2*C2 の時、K=1前後で最適である。
  即ち、典型的なアクテブ 2段フィルターの問題で質問いたします。

  C1 の電圧をE2 C2の電圧をE3とし、そのK倍の電圧がC1でR1とR2の
  節点に正帰還。とすると、E1とE3の関係式がでて、回路は解けます。

2. このようにまず解いて、周波数特性などを表示するのではなく、節点
 方程式のように、・・・・機械的に節点にアドミタンス等を挿入??
   して問題を解きたいのですが、E2やE3,そしてK等をマトリクス上でどう
  表現して良いか分りません。
  式を予め解かずとも、機械的に表示すれば、マトリクスが自動的に
  解いてくれるのではないかと期待しています。
   何方か御教えて下さると有り難いのですが。

3, マトリクスで複素数を MAT PRINT  A とやると、複素数がやたら
  長い表示になります。
  何とかPRINT USING #### 的に簡結な表示は出来ないでしょうか。
  無理にやるとマトリクスでは複素数をPRINT USING 表示は出来ないと
  表示されます。
 

Re: 節点解析法について

 投稿者:白石 和夫  投稿日:2009年 2月 1日(日)16時10分14秒
  > No.260[元記事へ]

> 3, マトリクスで複素数を MAT PRINT  A とやると、複素数がやたら
>   長い表示になります。
>   何とかPRINT USING #### 的に簡結な表示は出来ないでしょうか。
>   無理にやるとマトリクスでは複素数をPRINT USING 表示は出来ないと
>   表示されます。

実部と虚部,あるいは,絶対値と偏角など,虚数部分を含まない数値のペアに分けてから書式を指定してください。
また,MAT PRINT USINGみたいのが必要であれば,配列と書式を引数としてとる副プログラムを作成して使ってください。
 

Re: 節点解析法について

 投稿者:山中和義  投稿日:2009年 2月 2日(月)10時38分2秒
  > No.260[元記事へ]

大熊 正さんへのお返事です。

理想的なオペアンプの計算
 仮想の素子を考える(図2)
 ・ナレータ
  ①V+とV-との電位は同じ(イマージナリーショート)
  ②V+とV-とには電流が流れない(入力抵抗が無限大)
 ・ノレータ
  ③Voからは必要な電流が供給される(両方向)

これを適用すると、図3は、図1の等価回路になると思います。

この図3の回路図で節点方程式を考えます。
通常、Voは固定値とするが、アンプにより確定できません。(Vo=K*e2、e2は節点②の電位)
そこで、アンプの入力を出力に反映させて(反復計算で)収束させます。


プログラムは図1のようなアンプを含んだ回路図で計算できるように
以前紹介した節点電位法のものを改良してあります。

1000 !節点電位法によるフィルタ回路の周波数解析(利得、位相)
1010
1020 OPTION ARITHMETIC COMPLEX
1030
1040 LET j=SQR(-1) !虚数単位 ※電気系はjを使う
1050
1060 LET f=60 !周波数[Hz]
1070 DEF w=2*PI*f !角周波数ω
1080
1090 DEF H2Ohm(L)=j*w*L ![H]を[Ω]へ
1100 DEF F2Ohm(C)=1/(j*w*C) ![F]を[Ω]へ
1110 DEF xL(L)=w*L !誘導リアクタンス
1120 DEF xC(C)=1/(w*C) !容量リアクタンス
1130
1140 SUB DispS(z) !複素数をS表示する ※スタインメッツ(Steinmetz)
1150    PRINT ABS(z);
1160    IF ABS(z)<>0 THEN
1170       IF arg(z)<>0 THEN PRINT "∠";DEG(arg(z));"°";
1180    END IF
1190    !PRINT
1200 END SUB
1210
1220 FUNCTION S2COMPLEX(l,th) !S表示(極座標形式)を複素数へ
1230    LET S2COMPLEX=COMPLEX(l*COS(RAD(th)),l*SIN(RAD(th)))
1240 END FUNCTION
1250 FUNCTION i2COMPLEX(im,th) !瞬時値式を複素数へ ※最大値、初期位相
1260    LET i2COMPLEX=S2COMPLEX(im/SQR(2),th) !実効値、初期位相
1270 END FUNCTION
1280 !-------------------- ここまでがサブルーチン
1290
1300
1310 SUB set_curcit !素子や結線を定義する
1320    !---------- ↓↓↓↓↓ ----------
1330
1340    !●回路図 Sallen-Key 3次ローパス・フィルタ
1350
1360    !参考サイト http://sim.okawa-denshi.jp/OPseikiLowkeisan.htm
1370
1380    !          ┌─C2─┬──────┐
1390    !          │   │ ┌──┐ │
1400    !          │   └─┤-  │ │
1410    !          │     │ K├─6─
1420    ! ─2─R1─3─R2─4─R3─5─┤+  │ ↑
1430    !  ↑   │       │ └──┘ │
1440    !  Vi   C1       C3      Vo
1450    !  ↓   │       │      ↓
1460    ! ─1───┴───────┴──────┴─
1470    !  │
1480    !  ≡アース
1490
1500    LET GND=1 !アース
1510    LET Vi=2 !入力端子
1520    LET Vo=6 !出力端子
1530
1540    !素子: Rn,Vn,In、n:番号(連番) ※2文字目以降は番号
1550    !値:
1560    !端子番号(起点): 1以上の値 ※節点
1570    !端子番号: 1以上の値 ※節点
1580
1590    CALL AddElements("R1",51e3,2,3) !51k[Ω]、枝路電流は2→3と仮定する
1600    CALL AddElements("C1",F2Ohm(0.0068e-6),3,1) !0.0068[μF]
1610    CALL AddElements("R2",82e3,3,4) !82k[Ω]
1620    CALL AddElements("C2",F2Ohm(0.022e-6),4,6) !0.022[μF]
1630    CALL AddElements("R3",39e3,4,5) !39k[Ω]
1640    CALL AddElements("C3",F2Ohm(330e-12),5,1) !330[pF]
1650
1660    !※電圧源の番号は1からの連番 例. CALL AddElements("V1",?,?,?) !?[V]
1670    !なし
1680
1690    CALL AddElements("A1",1.0,5,6) !アンプ 増幅率1.0,+端子5,出力端子6
1700
1710    !---------- ↑↑↑↑↑ ----------
1720
1730    CALL AddElements("Vi",10,GND,Vi) !10[V] ※測定用の電圧
1740 END SUB
1750
1760 !---------- ↓↓↓↓↓ ----------
1770 LET Ns=0 !電圧源の数
1780 LET Nd=6 !節点の数
1790 LET Na=1 !アンプの数
1800 !---------- ↑↑↑↑↑ ----------
1810
1820 LET N=Nd+Ns+Na+1
1830
1840 !●キルヒホッフの電流則より、節点方程式を組み立てる
1850 DIM A(N,N),x(N),b(N) !連立方程式 Ax=b
1860
1870 DIM AmpK(Na),AmpPlus(Na),AmpOut(Na)
1880
1890 SUB AddElements(el$,ev,nd1,nd2) !結線情報から回路方程式を組み立てる
1900    IF (nd1<1 OR nd1>Nd) OR (nd2<1 OR nd2>Nd) THEN
1910       PRINT "素子";el$;"の節点番号が違います。";nd1;nd2
1920       STOP
1930    END IF
1940
1950    !連立方程式を組み立てる Ax=b
1960    ! ┌  │  ┐┌ ┐ ┌ ┐
1970    ! │G │±1││V │=│I │ R,C,L,電流源(Nd個)
1980    !───┼─────────
1990    ! │±1│-Zp││Ip│ │Ep│ 電圧源(Ns個)、アンプ(Na個)、入力電圧源(1個)
2000    ! └  │  ┘└ ┘ └ ┘
2010
2020    SELECT CASE UCASE$(el$(1:1)) !素子に応じて
2030    CASE "V" !電圧源なら
2040       LET t$=UCASE$(el$(2:LEN(el$)))
2050       IF t$="I" THEN !計測用の入力電圧源なら
2060          LET p=Nd+Ns+Na+1
2070       ELSE
2080          LET p=VAL(t$) !番号を得る
2090          IF p<1 OR p>Ns THEN
2100             PRINT "電圧源の番号が違います。";el$
2110             STOP
2120          END IF
2130          LET p=p+Nd
2140       END IF
2150       LET A(nd1,p)=A(nd1,p)-1 !電流Ipが節点iから節点jへ流れたとして、(Vi-Vj)-Ip*Zp=Ep
2160       LET A(p,nd1)=A(p,nd1)-1
2170       LET A(nd2,p)=A(nd2,p)+1
2180       LET A(p,nd2)=A(p,nd2)+1
2190       LET A(p,p)=A(p,p)+0 !内部抵抗Zpは0とする
2200       LET b(p)=b(p)+ev !起電力
2210
2220    CASE "A" !アンプなら
2230       LET t=VAL(el$(2:LEN(el$))) !番号を得る
2240       IF t<1 OR t>Na THEN
2250          PRINT "アンプの番号が違います。";el$
2260          STOP
2270       END IF
2280       LET p=t+Nd+Ns !出力側をノレータ(初期値0Vの電圧源)として扱う
2290       LET A(GND,p)=A(GND,p)-1
2300       LET A(p,GND)=A(p,GND)-1
2310       LET A(nd2,p)=A(nd2,p)+1
2320       LET A(p,nd2)=A(p,nd2)+1
2330
2340       LET AmpK(t)=ev !増幅率
2350       LET AmpPlus(t)=nd1 !+端子
2360       LET AmpOut(t)=p !方程式内での出力端子
2370
2380    CASE "I" !電流源なら
2390       LET b(nd1)=b(nd1)-ev
2400       LET b(nd2)=b(nd2)+ev
2410
2420    CASE ELSE !素子なら
2430       LET Gij=1/ev
2440       !対角成分 ※節点に接続された素子(アドミタンス)の和
2450       LET A(nd1,nd1)=A(nd1,nd1)+Gij
2460       LET A(nd2,nd2)=A(nd2,nd2)+Gij
2470       !その他の成分 ※節点に接続された素子(アドミタンス)に-1をかけたものの和
2480       LET A(nd1,nd2)=A(nd1,nd2)-Gij
2490       LET A(nd2,nd1)=A(nd2,nd1)-Gij
2500
2510    END SELECT
2520 END SUB
2530
2540 DIM Ai(N,N) !連立方程式を解く
2550 SUB routine
2560    MAT A=ZER
2570    MAT b=ZER
2580    CALL set_curcit !結線から方程式を組み立てる
2590
2600    FOR i=1 TO Nd !結線されていない節点 1*Vi=0
2610       IF A(i,i)=0 THEN LET A(i,i)=1
2620    NEXT i
2630    LET A(GND,GND)=0 !電位を0とする
2640
2650    !!!MAT PRINT A; !dump it
2660    !!!MAT PRINT b;
2670
2680
2690    MAT Ai=INV(A)
2700    MAT x=Ai*b
2710    IF Na>0 THEN !アンプがあれば
2720       FOR iter=1 TO 100 !安定させる ※要調整
2730          FOR i=1 TO Na
2740             LET b(AmpOut(i))=AmpK(i)*x(AmpPlus(i)) !Vo=K*V+ ※入力を出力に反映させる
2750          NEXT i
2760          MAT x=Ai*b
2770       NEXT iter
2780    END IF
2790 END SUB
2800
2810
2820
2830 !SET bitmap SIZE 600,600 !画面を大きくする
2840 LET ymin=-150
2850 SET WINDOW -0.5,6.5, ymin,5 !表示領域
2860 DRAW grid(1,5) !左端の目盛り
2870
2880 FOR f=1 TO 6 !x軸が対数
2890    PLOT TEXT ,AT f-0.3,-0.15: mid$("10  100 1k  10k 100k1M  ",4*(f-1)+1,4)
2900 NEXT f
2910
2920 FOR f=10 TO 100000 STEP 100 !周波数[Hz]
2930    CALL routine
2940    PLOT LINES: LOG10(f),20*LOG10(ABS(x(Vo)/x(Vi))); !利得[dB]
2950 NEXT f
2960 PLOT LINES
2970
2980
2990 SET TEXT COLOR 2
3000 FOR i=5 TO ymin STEP -5 !右端の縦軸目盛り
3010    PLOT TEXT ,AT 6,i: STR$(i*2)&"°" !※利得のグラフに合わせるために2倍する
3020 NEXT i
3030
3040 SET LINE COLOR 2
3050 FOR f=10 TO 100000 STEP 100 !周波数[Hz]
3060    CALL routine
3070    LET t=arg(x(Vo)/x(Vi))
3080    IF t>0 THEN LET t=t-2*PI !0~-2πへ補正する
3090    PLOT LINES: LOG10(f),DEG(t)/2; !位相θ ※利得のグラフに合わせるために1/2倍する
3100 NEXT f
3110 PLOT LINES
3120
3130
3140 END
 

戻る