新しく発言する  EXIT  インデックスへ

合成抵抗の計算−ブリッジ回路


  合成抵抗の計算−ブリッジ回路 山中和義 2008/08/10 11:46:01  (修正1回)
  別解(Δ-Y変換による) 山中和義 2008/08/10 11:49:37 
  合成抵抗の計算−ラダー回路 山中和義 2008/08/10 13:58:21 
  合成抵抗の計算-立方体状 山中和義 2008/08/13 10:06:41 
  │└A−B間、A−C間の場合 山中和義 2008/08/13 10:11:27 
  !合成抵抗の計算-簡易回路図シミュレーショ... 山中和義 2008/08/14 14:42:47 
  │└つづき 山中和義 2008/08/14 14:43:36 
  │ └現状、トポロジーの処理(閉回路、節点)が... 山中和義 2008/08/14 14:51:37 
  │  └節点方程式を使用されては 島村1243 2008/08/16 07:15:46  (修正2回)
  │   └これですね、シミュレータが計算しているの... 山中和義 2008/08/16 13:15:20  (修正1回)
  │    └つづき 山中和義 2008/08/16 13:16:16  (修正1回)
  │     └出口の電位を0[V]にするには 島村1243 2008/08/16 22:33:58 
  │      └電流源を加味する部分を変更してください。 山中和義 2008/08/17 06:46:24 
  │       └出来ました。 島村1243 2008/08/17 07:51:57  (修正1回)
  │        └試験問題チェック用に改造 島村1243 2008/08/17 17:17:27  (修正1回)
  !直流電気回路の計算-閉路電流法の行列解法 山中和義 2008/08/17 22:00:39  (修正1回)
  │└電源が複数の場合 島村1243 2008/08/19 09:43:13 
  │ └このように設定してください。 山中和義 2008/08/19 11:57:37 
  │  └正しい結果が出ました 島村1243 2008/08/19 14:16:20  (修正2回)
  │   └行列計算の説明 山中和義 2008/08/19 17:54:10  (修正1回)
  │    ├感謝します 島村1243 2008/08/19 18:12:30 
  │    └任意の抵抗辺に起電力も含む 島村1243 2008/08/20 10:54:20 
  電圧源を含む節点電位法 山中和義 2008/08/22 09:24:52 
   └つづき 山中和義 2008/08/22 09:25:40 
    └入力が簡単で使い易い 島村1243 2008/08/23 15:10:41 

  合成抵抗の計算−ブリッジ回路 山中和義 2008/08/10 11:46:01  (修正1回)  ツリーへ
合成抵抗の計算−ブリッジ回路  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/10 11:46:01 ** この記事は1回修正されてます
十進BASICでは、連立方程式が簡単に解けます。
電卓、ノート代わりに、法則、計算法などをプログラミングしてみてください。


!ブリッジ回路の合成抵抗 a-b端子間
!
!    /│\
!   R1 │ R2
!a_/  R5  \_b
!  \  │  /
!   R3 │ R4
!    \│/

LET R1=30
LET R2=50
LET R3=45
LET R4=75
LET R5=15



!枝路電流法 - 連立方程式を解く
DIM A(0 TO 5,0 TO 5),x(0 TO 5),b(0 TO 5) !Ax=b
MAT A=ZER
MAT b=ZER

LET V0=10 !仮の電圧

!キルヒホッフの電圧則
LET A(0,3)=R3 !R3*I3+R4*I4=V0 下部分の閉回路
LET A(0,4)=R4
LET b(0)=V0

LET A(1,1)=R1 !R1*I1-R3*I3+R5*I5=0 左△部分
LET A(1,3)=-R3
LET A(1,5)=R5

LET A(2,2)=R2 !R2*I2-R4*I4-R5*I5=0 右△部分
LET A(2,4)=-R4
LET A(2,5)=-R5

!キルヒホッフの電流則
LET A(3,0)=1 !I0=I1+I3 左の節点
LET A(3,1)=-1
LET A(3,3)=-1

LET A(4,0)=1 !I0=I2+I4 右
LET A(4,2)=-1
LET A(4,4)=-1

LET A(5,1)=1 !I1=I2+I5 上
LET A(5,2)=-1
LET A(5,5)=-1

DIM Ai(6,6)
MAT Ai=INV(A)
MAT x=Ai*b !枝路電流を求める

!MAT PRINT x
PRINT V0/x(0) !合成抵抗R0=V0/i0




!ループ電流法 - 連立方程式を解く
DIM R(0 TO 2,0 TO 2),i(0 TO 2),v(0 TO 2) !Ri=v
MAT R=ZER
MAT v=ZER

LET V0=10 !仮の電圧

!下部分の閉回路 (R3+R4)*I0-R3*I1-R4*I2=V0
LET R(0,0)=R3+R4 !I0が流れる抵抗の和
LET R(0,1)=-R3 !I1が流れる抵抗の和
LET R(0,2)=-R4 !I2が流れる抵抗の和
LET v(0)=V0 !起電力の和

LET R(1,0)=-R3 !左△部分 -R3*I0+(R1+R5+R3)*I1-R5*I2=0
LET R(1,1)=R1+R5+R3
LET R(1,2)=-R5

LET R(2,0)=-R4 !右△部分 -R4*I0-R5*I1+(R2+R4+R5)*I2=0
LET R(2,1)=-R5
LET R(2,2)=R2+R4+R5

DIM Ri(3,3)
MAT Ri=INV(R)
MAT i=Ri*v !ループ電流を求める

!MAT PRINT i
PRINT V0/i(0) !合成抵抗R0=V0/i0


END
  別解(Δ-Y変換による) 山中和義 2008/08/10 11:49:37   ツリーへ
Re: 合成抵抗の計算−ブリッジ回路  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/10 11:49:37
別解(Δ-Y変換による)



!ブリッジ回路の合成抵抗 a-b端子間
!
!    /│\
!   R1 │ R2
!a_/  R5  \_b
!  \  │  /
!   R3 │ R4
!    \│/

LET R1=30
LET R2=50
LET R3=45
LET R4=75
LET R5=15


IF R1*R4=R2*R3 THEN
PRINT "平衡状態"

!┌R1─R2┐ 開放
!┤   ├
!└R3─R4┘
PRINT Parallel(R1+R2,R3+R4)

!┌R1┐┌R2┐ 短絡
!┤ ├┤ ├
!└R3┘└R4┘
PRINT Parallel(R1,R3)+Parallel(R2,R4)
END IF


!左の△部分にΔ-Y変換を行う。
!     /\
!    Rb  R2
!_Ra_/    \_
!   \    /
!    Rc  R4
!     \/
CALL Delta2Star(R1,R5,R3, Ra,Rb,Rc) !Δ-Y変換
PRINT Ra;Rb;Rc

LET R0=Ra+Parallel(Rb+R2,Rc+R4) !合成抵抗
PRINT R0




!下位ルーチン

!DEF Parallel(R1,R2)=1/(1/R1+1/R2) !並列接続 ※逆数の和の逆数
DEF Parallel(R1,R2)=R1*R2/(R1+R2) !並列接続 ※和分の積
DEF Parallel3(R1,R2,R3)=1/(1/R1+1/R2+1/R3) !並列接続 ※必要に応じて


!    c         c
!   /\        │
!  Rca  Rbc      Rc
! /    \      │
!a───Rab──b     /\
!           Ra  Rb
!          a/    \b
SUB Delta2Star(Rab,Rbc,Rca, Ra,Rb,Rc) !Δ-Y変換
LET Rabc=Rab+Rbc+Rca
LET Ra=Rca*Rab/Rabc
LET Rb=Rab*Rbc/Rabc
LET Rc=Rbc*Rca/Rabc
END SUB
SUB Star2Delta(Ra,Rb,Rc, Rab,Rbc,Rca) !Y-Δ変換
LET Rabc=Ra*Rb+Rb*Rc+Rc*Ra
LET Rab=Rabc/Rc
LET Rbc=Rabc/Ra
LET Rca=Rabc/Rb
END SUB

END
  合成抵抗の計算−ラダー回路 山中和義 2008/08/10 13:58:21   ツリーへ
Re: 合成抵抗の計算−ブリッジ回路  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/10 13:58:21
合成抵抗の計算−ラダー回路


!ラダー回路(はしご回路)の合成抵抗 a-b端子間

!a─R1┬R3┬R5┬ … ┬Rn┬─┬ …
!   R2 R4 R6  Rn-1 Rn+1
!b──┴─┴─┴   ┴─┴─┴
!

DEF Parallel(R1,R2)=1/(1/R1+1/R2) !並列接続

LET M=3 !段数

DIM R(M*2) !抵抗値
DATA 5,10,5,10,5,10
MAT READ R


FUNCTION Ladder(M,R(), k) !合成抵抗を求める
LET R1=R(2*k-1)
LET R2=R(2*k)
IF k=M THEN !右端なら
! ─R1┐
!   R2
! ──┘
LET Rk=R1+R2 !直列
ELSE !k段目
! ─R1┬─┐
!Rk  R2 Rk+1
! ──┴─┘
LET Rk=R1+Parallel(R2,Ladder(M,R, k+1)) !再帰呼出し
END IF
PRINT k;"段目";Rk
LET Ladder=Rk
END FUNCTION


PRINT Ladder(M,R, 1) !左端から





!別解 繰り返しによる

LET R1=R(2*M-1) !右端から
LET R2=R(2*M)
! ─R1┐
!   R2
! ──┘
LET Rk=R1+R2 !直列
PRINT M;"段目";Rk

FOR k=M-1 TO 1 STEP -1 !左端へ
LET R1=R(2*k-1)
LET R2=R(2*k)
! ─R1┬─┐
!Rk  R2 Rk+1
! ──┴─┘
LET Rk=R1+Parallel(R2,Rk) !k段目
PRINT k;"段目";Rk
NEXT k


END
  合成抵抗の計算-立方体状 山中和義 2008/08/13 10:06:41   ツリーへ
Re: 合成抵抗の計算−ブリッジ回路  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/13 10:06:41
合成抵抗の計算 - 立方体状


!立方体状の合成抵抗 A-G端子間

OPTION ARITHMETIC RATIONAL

!  D・──・C
!  /│ / │
!A・──・B │ 各稜線に抵抗が1つ
! │ h・│─・G
! │/ │/
!E・──・F

!A-G間 5/6


LET N=12 !各枝路電流の数
DIM R(0 TO N,0 TO N),i(0 TO N),v(0 TO N) !連立方程式 Ri=v
MAT R=ZER
MAT v=ZER

LET V0=1 !仮の電圧

!2次元で表現すると
! H ─────── G
! │\ D  C /│
! │ ・──・ │
! │ │  │ │
! │ ・──・ │
! │/ A  B \│
! E ─────── F

DATA 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 !電圧-ABCG
LET v(0)=V0

DATA 0, 1, 1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0 !閉回路ABCD
DATA 0,-1, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0, 0 !閉回路AEFB
DATA 0, 0,-1, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0 !閉回路BFGC
DATA 0, 0, 0, 1, 0, 0, 0, 1,-1, 0, 0,-1, 0 !閉回路CGHD
DATA 0, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0, 0,-1 !閉回路DHEA

!    →
! H・  11  ・G
!   8  →  7   D→H、C→G
!   D・ 3 ・C
!↑12 ↑4  2↑ 10↑
!   A・ 1 ・B
!   5  →  6   A→E、B→F
! E・  9   ・F
!    →

DATA 1,-1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0 !節点A I0=I1+I4+I5
DATA 0, 1,-1, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0 !節点B I1=I2+I6
DATA 0, 0, 1, 1, 0, 0, 0,-1, 0, 0, 0, 0, 0 !節点C I2+I3=I7
DATA 0, 0, 0,-1, 1, 0, 0, 0,-1, 0, 0, 0, 0 !節点D I4=I3+I8
DATA 0, 0, 0, 0, 0, 1, 0, 0, 0,-1, 0, 0,-1 !節点E I5=I9+I12
DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,-1, 0, 0 !節点F I6+I9=I10
DATA -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0 !節点G I7+I10+I11=I0
!DATA 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 1 !節点H I8+I12=I11

MAT READ R


DIM Ri(0 TO N,0 TO N) !連立方程式を解く
MAT Ri=INV(R)
MAT i=Ri*v
MAT PRINT i !各枝路電流を表示する

PRINT V0/i(0) !合成抵抗 R0=V0/I0

END
  │└A−B間、A−C間の場合 山中和義 2008/08/13 10:11:27   ツリーへ
Re: 合成抵抗の計算-立方体状  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/13 10:11:27
A−B間、A−C間の場合

連立方程式を組み立てる部分のみ(差し替えコード)を掲載します。


●A-B間 7/12

DATA 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 !電圧-AB
LET v(0)=V0

DATA 0, 1, 1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0 !閉回路ABCD
DATA 0,-1, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0, 0 !閉回路AEFB
DATA 0, 0,-1, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0 !閉回路BFGC
DATA 0, 0, 0, 1, 0, 0, 0, 1,-1, 0, 0,-1, 0 !閉回路CGHD
DATA 0, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0, 0,-1 !閉回路DHEA

DATA 1,-1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0 !節点A I0=I1+I4+I5
DATA -1, 1,-1, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0 !節点B I1=I2+I6+I0
DATA 0, 0, 1, 1, 0, 0, 0,-1, 0, 0, 0, 0, 0 !節点C I2+I3=I7
DATA 0, 0, 0,-1, 1, 0, 0, 0,-1, 0, 0, 0, 0 !節点D I4=I3+I8
DATA 0, 0, 0, 0, 0, 1, 0, 0, 0,-1, 0, 0,-1 !節点E I5=I9+I12
DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,-1, 0, 0 !節点F I6+I9=I10
DATA 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0 !節点G I7+I10+I11=0
!DATA 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 1 !節点H I8+I12=I11




●A-C間 3/4

DATA 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 !電圧-ABC
LET v(0)=V0

DATA 0, 1, 1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0 !閉回路ABCD
DATA 0,-1, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0, 0 !閉回路AEFB
DATA 0, 0,-1, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0 !閉回路BFGC
DATA 0, 0, 0, 1, 0, 0, 0, 1,-1, 0, 0,-1, 0 !閉回路CGHD
DATA 0, 0, 0, 0, 1,-1, 0, 0, 1, 0, 0, 0,-1 !閉回路DHEA

DATA 1,-1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0 !節点A I0=I1+I4+I5
DATA 0, 1,-1, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0 !節点B I1=I2+I6
DATA -1, 0, 1, 1, 0, 0, 0,-1, 0, 0, 0, 0, 0 !節点C I2+I3=I7+I0
DATA 0, 0, 0,-1, 1, 0, 0, 0,-1, 0, 0, 0, 0 !節点D I4=I3+I8
DATA 0, 0, 0, 0, 0, 1, 0, 0, 0,-1, 0, 0,-1 !節点E I5=I9+I12
DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,-1, 0, 0 !節点F I6+I9=I10
DATA 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0 !節点G I7+I10+I11=0
!DATA 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 1 !節点H I8+I12=I11

  !合成抵抗の計算-簡易回路図シミュレーショ... 山中和義 2008/08/14 14:42:47   ツリーへ
Re: 合成抵抗の計算−ブリッジ回路  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/14 14:42:47
!合成抵抗の計算 - 簡易回路図シミュレーション

OPTION ARITHMETIC RATIONAL

LET xmax=5 !表示領域 ※
LET ymax=5
SET WINDOW -1,xmax,-1,ymax
DRAW grid


SUB DisplayElement(el$,ev,nd1,nd2) !素子を表示する
LET x1=MOD(nd1,xmax) !起点位置
LET y1=INT((nd1)/ymax)
LET x2=MOD(nd2,xmax) !終点位置
LET y2=INT((nd2)/ymax)

PLOT LINES: x1,y1; x2,y2 !結線

SET TEXT background "opaque"
SET TEXT JUSTIFY "center","half"
PLOT TEXT, AT (x1+x2)/2,(y1+y2)/2: el$ !説明書き

DRAW circle WITH SCALE(0.13)*SHIFT(x1,y1) !端子
DRAW circle WITH SCALE(0.13)*SHIFT(x2,y2)
PLOT TEXT, AT x1,y1: STR$(nd1)
PLOT TEXT, AT x2,y2: STR$(nd2)

DRAW disk WITH SCALE(0.05)*SHIFT((x1+2*x2)/3,(y1+2*y2)/3) !枝路電流の向き
END SUB


!---------- ↓↓↓↓↓ ----------

!●回路図
LET N=12 !素子の数

!素子: Rn,Vn,In,Cn,Lm、n:番号 ※2文字目以降は番号
!値:
!端子番号(起点): 0以上の値
!端子番号: 0以上の値

DATA R1,1, 0, 1
DATA R2,1, 1, 2
DATA R3,1, 0, 5
DATA R4,1, 1, 6
DATA R5,1, 2, 7
DATA R6,1, 5, 6
DATA R7,1, 6, 7
DATA R8,1, 5,10
DATA R9,1, 6,11
DATA R10,1, 7,12
DATA R11,1,10,11
DATA R12,1,11,12

!---------- ↑↑↑↑↑ ----------


DIM el$(xmax*ymax),ev(xmax*ymax)
DIM nd1(xmax*ymax),nd2(xmax*ymax)

FOR i=1 TO N !回路を記録する
READ el$(i),ev(i)
READ nd1(i),nd2(i)
IF nd1(i)>nd2(i) THEN swap nd1(i),nd2(i) !nd1<nd2
NEXT i

FOR i=1 TO N !回路を表示する
CALL DisplayElement(el$(i),ev(i),nd1(i),nd2(i))
NEXT i

!STOP !表示が正しいならこの行を「注釈」として、以降のプログラムを実行させる

  │└つづき 山中和義 2008/08/14 14:43:36   ツリーへ
Re: !合成抵抗の計算-簡易回路図シミュレーショ...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/14 14:43:36
つづき


DIM A(0 TO N,0 TO N),x(0 TO N),b(0 TO N) !連立方程式 Ax=b
MAT A=ZER
MAT b=ZER

LET V0=1 !仮の電圧

LET f=0 !式の番号

!---------- ↓↓↓↓↓ ----------

!●キルヒホッフの電圧則
LET b(f)=-V0 !電圧をかけた回路 ※-1:終端
DATA 0,1,6,7,12,-1
CALL KVL(f) !※fは+1される

DATA 0,5,6,1,-1 !下左部分の閉回路 ※-1:終端
CALL KVL(f)
DATA 1,6,7,2,-1 !下右
CALL KVL(f)
DATA 5,10,11,6,-1 !上左
CALL KVL(f)
DATA 6,11,12,7,-1 !上右
CALL KVL(f)


!●キルヒホッフの電流則
LET A(f,0)=1 !電圧をかけた節点の+側
CALL KCL(f,0)
LET A(f,0)=-1 !−側
CALL KCL(f,12)

CALL KCL(f,1) !残りの節点
CALL KCL(f,2)
CALL KCL(f,5)
CALL KCL(f,6)
CALL KCL(f,7)
CALL KCL(f,10)
!CALL KCL(f,11)

!---------- ↑↑↑↑↑ ----------


DIM Ai(0 TO N,0 TO N) !連立方程式を解く
MAT Ai=INV(A)
MAT x=Ai*b
MAT PRINT x !各枝路電流を表示する

PRINT "合成抵抗=";V0/x(0) !R0=V0/I0



SUB KVL(f) !キルヒホッフの電圧則 KVL(Kirchhoff's Voltage Law)
DIM lp(100) !閉回路を構成する節点

LET lpN=0 !閉回路を構成する節点の数
DO
LET lpN=lpN+1
READ lp(lpN)
LOOP UNTIL lp(lpN)<0
LET lpN=lpN-1
IF lpN>2 THEN LET lp(lpN+1)=lp(1) !3点以上なら始端へ

FOR k=1 TO lpN !閉回路の各辺で
FOR i=1 TO N
LET t1=nd1(i) !接続を確認する
LET t2=nd2(i)
IF (lp(k)=t1 AND lp(k+1)=t2) OR (lp(k)=t2 AND lp(k+1)=t1) THEN
LET t=VAL(el$(i)(2:LEN(el$(i)))) !番号の取得
IF t1=lp(k) THEN !枝路電流の向きを考慮して
LET A(f,t)=SGN(t1-t2)*ev(i) !Rn*In
ELSE
LET A(f,t)=SGN(t2-t1)*ev(i)
END IF
END IF
NEXT i
NEXT k

LET f=f+1 !更新
END SUB

SUB KCL(f,nd) !キルヒホッフの電流則 KCL(Kirchhoff's Current Law)
FOR i=1 TO N
LET t1=nd1(i) !接続を確認する
LET t2=nd2(i)
IF t1=nd OR t2=nd THEN
LET t=VAL(el$(i)(2:LEN(el$(i)))) !番号の取得
IF t1=nd THEN !枝路電流の向きを考慮して
LET A(f,t)=SGN(t1-t2) !In
ELSE
LET A(f,t)=SGN(t2-t1)
END IF
END IF
NEXT i
LET f=f+1 !更新
END SUB


END
  │ └現状、トポロジーの処理(閉回路、節点)が... 山中和義 2008/08/14 14:51:37   ツリーへ
Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/14 14:51:37
現状、トポロジーの処理(閉回路、節点)が手動ですが、
連立方程式を組み立てる(係数を羅列する)際の入力ミスがかなり減ります。

閉回路の判断が可能なら、シミュレータのようになるのですが、、、



立方体状の接続の場合(差し替え)


!●回路図
!  D・──・C
!  /│ / │
!A・──・B │ 各稜線に抵抗が1つ
! │ h・│─・G
! │/ │/
!E・──・F

!A-G間 5/6
!A-B間 7/12
!A-C間 3/4

LET N=12 !素子の数

!素子: Rn,Vn,In,Cn,Lm、n:番号 ※2文字目以降は番号
!値:
!端子番号(起点): 0以上の値
!端子番号: 0以上の値

DATA R1,1, 6, 7
DATA R2,1, 7,12
DATA R3,1,12,11
DATA R4,1,11, 6

DATA R5,1, 6, 0
DATA R6,1, 7, 3
DATA R7,1,12,18
DATA R8,1,11,15

DATA R9,1, 0, 3
DATA R10,1, 3,18
DATA R11,1,18,15
DATA R12,1,15, 0






A-B間

!●キルヒホッフの電圧則
LET b(f)=-V0 !電圧をかけた回路 ※-1:終端
DATA 6,7,-1 !A-B
CALL KVL(f) !※fは+1される

DATA 6,7,3,0,-1 !下部分の閉回路 ※-1:終端
CALL KVL(f)
DATA 7,12,18,3,-1 !右
CALL KVL(f)
DATA 12,11,15,18,-1 !上
CALL KVL(f)
DATA 11,6,0,15,-1 !左
CALL KVL(f)
DATA 6,11,12,7,-1 !中
CALL KVL(f)


!●キルヒホッフの電流則
LET A(f,0)=1 !電圧をかけた節点の+側
CALL KCL(f,6) !A

LET A(f,0)=-1 !−側
CALL KCL(f,7) !B

CALL KCL(f,18) !G
CALL KCL(f,12) !C

CALL KCL(f,0) !残りの節点
CALL KCL(f,3)
CALL KCL(f,11)
!CALL KCL(f,15)





A-G間

!●キルヒホッフの電圧則
LET b(f)=-V0 !電圧をかけた回路 ※-1:終端
DATA 6,7,12,18,-1 !A-G
CALL KVL(f) !※fは+1される

DATA 6,7,3,0,-1 !下部分の閉回路 ※-1:終端
CALL KVL(f)
DATA 7,12,18,3,-1 !右
CALL KVL(f)
DATA 12,11,15,18,-1 !上
CALL KVL(f)
DATA 11,6,0,15,-1 !左
CALL KVL(f)
DATA 6,11,12,7,-1 !中
CALL KVL(f)


!●キルヒホッフの電流則
LET A(f,0)=1 !電圧をかけた節点の+側
CALL KCL(f,6) !A

LET A(f,0)=-1 !−側
CALL KCL(f,18) !G

CALL KCL(f,7) !B
CALL KCL(f,12) !C

CALL KCL(f,0) !残りの節点
CALL KCL(f,3)
CALL KCL(f,11)
!CALL KCL(f,15)
  │  └節点方程式を使用されては 島村1243 2008/08/16 07:15:46  (修正2回)  ツリーへ
Re: 現状、トポロジーの処理(閉回路、節点)が...  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/16 07:15:46 ** この記事は2回修正されてます
節点方程式を使用されては

山中さんの作品、いつも興味深く読ませて頂いております。

>現状、トポロジーの処理(閉回路、節点)が手動ですが、
>連立方程式を組み立てる(係数を羅列する)際の入力ミスがかなり減ります。

上記の対策として、下記の方法(キルヒホッフの第二法則を使わない)は如何でしょうか?
【方法例】
(1)共通接地ライン(大地)を節点番号0(特に記入しない)とする。
(2)節点番号iの電位Viは対地電位とする(例えばV1=10と言う場合、節点1の対地電位が10[V]と読む)。
(3)節点i-k間の抵抗はRikで表す(Rik=Rkiである)。
(4)RikのアドミタンスをYik=1/Rikで表す。i-k間に抵抗が接続されていない場合はYik=0とプログラムで設定
する。
(5)すべての節点iと大地間には抵抗が接続されていない(絶縁されている(対地間アドミタンス=0という意味)とし、入力は不要とする。
(6)指定された1個の節点iと対地間には電池E[V]が接続されとする(i=1とするとV1=E)。
(7)指定された他の1個の節点iと対地間は電線で短絡されたものとし、その節点の対地電位は0とする(i=2とするとV2=0)。

以上の前提で節点数3個の方程式例を示す。条件は
節点1は電池E[V]が接続されている。つまりV1=E。
節点2は対地電位が0つまり、大地に対して短絡されている。つまりV2=0
節点3は対地に対して浮いている。つまりI3=0。
電流は大地側から節点1、2に対して流れ込む方向を「正」と扱う。

キルヒホッフの第一法則とオームの法則を使うと、各節点で
I1=Y12(V1-V2)+Y13(V1-V3)
I2=Y21(V2-V1)+Y23(V2-V3)
I3=Y31(V3-V1)+Y32(V3-V2)
ただしV1=E、V2=0、I3=0
が成立する。これを整理すると(1)式が作れる。

|I1| |Y12+Y13 , -Y12 , -Y13 | |V1|
|I2|=|-Y21 , Y21+Y23, -Y23 |x|V2| (1)
|I3| |-Y13 , -Y32 , Y31+Y32| |V3|

V1=E,V2=0,I3=0だから、(1)式は未知数がI1,I2,V3となって
解ける筈。
これを解いて節点1-2間の合成抵抗=E/I1で得られる。

この方法だと、閉回路の条件式(キルヒホッフの第2法則)を使用しないので、データ入力は
(ア)抵抗で接続された節点番号i,kとその抵抗値Rik[Ω]。
(イ)合成抵抗を測定したい2個の節点番号の指定
のみで済みます。しかも、節点間抵抗は、格子状に限定する必要も無く、自由度が広くなります。

注意:前記で(2)式を書きましたが、行列に纏める表現が誤っていましたので削除しました。
お詫びして訂正します。


(1)式をプログラムで導く事が面倒ですが、山中さんのプログラムテクニックを拝見すると
さほどの労力にはならないのではないか、と勝手に(ご勘弁願います)思っています。
  │   └これですね、シミュレータが計算しているの... 山中和義 2008/08/16 13:15:20  (修正1回)  ツリーへ
Re: 節点方程式を使用されては  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/16 13:15:20 ** この記事は1回修正されてます
これですね、シミュレータが計算しているのは!
アドバイス、ありがとうございます。

こちらなら連立方程式の組み立ては、グラフ理論の隣接行列で解決できるので、スッキリします。


節点方程式は、前出の作図を流用しているため、作図領域分の節点数にしています。(冗長ですが)



!合成抵抗の計算 - 簡易回路図シミュレーション(節点方程式)

!・ループ、多重辺は記述できない。(単純グラフ)


OPTION ARITHMETIC RATIONAL !分数表示

LET xmax=5 !表示領域 ※
LET ymax=5
SET WINDOW -1,xmax,-1,ymax
DRAW grid


SUB DisplayElement(el$,ev,nd1,nd2) !素子を表示する
LET x1=MOD(nd1,xmax) !起点位置
LET y1=INT((nd1)/ymax)
LET x2=MOD(nd2,xmax) !終点位置
LET y2=INT((nd2)/ymax)

PLOT LINES: x1,y1; x2,y2 !結線

SET TEXT background "opaque"
SET TEXT JUSTIFY "center","half"
PLOT TEXT, AT (x1+x2)/2,(y1+y2)/2: el$ !説明書き

DRAW circle WITH SCALE(0.13)*SHIFT(x1,y1) !端子
DRAW circle WITH SCALE(0.13)*SHIFT(x2,y2)
PLOT TEXT, AT x1,y1: STR$(nd1)
PLOT TEXT, AT x2,y2: STR$(nd2)
END SUB


!---------- ↓↓↓↓↓ ----------

!●回路図
LET N=12 !素子の数

!素子: Rn,Vn,In,Cn,Lm、n:番号(連番) ※2文字目以降は番号
!値:
!端子番号(起点): 0以上の値 ※節点
!端子番号: 0以上の値 ※節点

DATA R1,1, 0, 1
DATA R2,1, 1, 2
DATA R3,1, 0, 5
DATA R4,1, 1, 6
DATA R5,1, 2, 7
DATA R6,1, 5, 6
DATA R7,1, 6, 7
DATA R8,1, 5,10
DATA R9,1, 6,11
DATA R10,1, 7,12
DATA R11,1,10,11
DATA R12,1,11,12

!---------- ↑↑↑↑↑ ----------


DIM M(0 TO xmax*ymax-1,0 TO xmax*ymax-1) !隣接行列

FOR i=1 TO N !回路を記録する
READ el$,ev
READ nd1,nd2

CALL DisplayElement(el$,ev,nd1,nd2) !回路を表示する

LET M(nd1,nd2)=1/ev !無向グラフ ※成分はアドミタンス
LET M(nd2,nd1)=1/ev
NEXT i


!STOP !表示が正しいならこの行を「注釈」として、以降のプログラムを実行させる

  │    └つづき 山中和義 2008/08/16 13:16:16  (修正1回)  ツリーへ
Re: これですね、シミュレータが計算しているの...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/16 13:16:16 ** この記事は1回修正されてます
つづき




DIM A(0 TO xmax*ymax-1,0 TO xmax*ymax-1),x(0 TO xmax*ymax-1),b(0 TO xmax*ymax-1) !連立方程式 Ax=b
MAT A=ZER
MAT b=ZER

LET It=1 !電流源
LET Gt=1

!●キルヒホッフの電流則より、節点方程式を組み立てる

!対角成分の計算 ※節点に接続された素子(アドミタンス)の和
DIM d(0 TO xmax*ymax-1)
MAT d=CON
MAT d=M*d !内積
FOR i=0 TO xmax*ymax-1 !mat A=(d)*I
LET A(i,i)=d(i)
IF d(i)=0 THEN LET A(i,i)=1 !結線されていない節点
NEXT i

!その他の成分 ※節点に接続された素子(アドミタンス)に-1をかけたものの和
MAT A=A-M


!---------- ↓↓↓↓↓ ----------

LET Probe1=0 !計測する節点番号 ※+端子
LET Probe2=12 !※−端子

!---------- ↑↑↑↑↑ ----------


LET A(Probe1,Probe1)=A(Probe1,Probe1)+Gt !電流源を加味する
LET b(Probe1)=It

LET b(Probe2)=-It



DIM Ai(0 TO xmax*ymax-1,0 TO xmax*ymax-1) !連立方程式を解く
MAT Ai=INV(A)
MAT x=Ai*b
MAT PRINT x; !各節点の電位を表示する

PRINT "合成抵抗=";(x(Probe1)-x(Probe2))/It !R0=V0/I0


END
  │     └出口の電位を0[V]にするには 島村1243 2008/08/16 22:33:58   ツリーへ
Re: つづき  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/16 22:33:58
出口の電位を0[V]にするには

山中さん、runさせて頂きました。素晴らしいですね。
ただ、一つ勝手な希望が有ります。

現在のプログラムでは、電流注入点(節点番号0)の電位が基準0[V]で、他の電位はそれよりも低い値(負値)
として表示されますが、出口(節点番号12)の電位を基準0[V]として、注入点電位やその他の電位を正値に
計算させる事は出来ないでしょうか?
その様に出来るなら、「大地に対して浮いている12番節点に大地側から正の電流を注入したのだから、12番節点
の対地電位は正値になるはず、と言う電気の理屈が分かり易くなると思います。

試しに電流源の変数値ItやRtを負値にしてみたのですが、注入点電位は0[V]で変わらず、他の節点電位が正値
になってしまいダメでした。
  │      └電流源を加味する部分を変更してください。 山中和義 2008/08/17 06:46:24   ツリーへ
Re: 出口の電位を0[V]にするには  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/17 06:46:24
電流源を加味する部分を変更してください。

LET b(Probe1)=It !電流源を加味する

LET b(Probe2)=-It
LET A(Probe2,Probe2)=A(Probe2,Probe2)-Gt

とするとよいでしょう。


また、最後の合成抵抗を表示している部分は、電位は0ですから

PRINT "合成抵抗=";x(Probe1)/It !R0=V0/I0

としてもいいことになります。
  │       └出来ました。 島村1243 2008/08/17 07:51:57  (修正1回)  ツリーへ
Re: 電流源を加味する部分を変更してください。  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/17 07:51:57 ** この記事は1回修正されてます
出来ました。

早速のご教示、有難うございました。
電流源を加味する節点をprobe2番に変更し
A(probe2,probe2)=A(probe2,probe2)-Gt
として目的を達成しました。
  │        └試験問題チェック用に改造 島村1243 2008/08/17 17:17:27  (修正1回)  ツリーへ
Re: 出来ました。  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/17 17:17:27 ** この記事は1回修正されてます
試験問題チェック用に改造

!電気の試験等で出題される抵抗回路の合成計算問題の正解チェックに簡単に使えるよう、
!山中さんの原版から作図処理を除いてシンプルにしてみました。

OPTION ARITHMETIC RATIONAL !分数表示

!---------- ↓↓↓データの入力はここから↓↓ ----------
nmax=9!節点総数

!DATA(4項目)の記入要領
!抵抗素子名:(例 Rn-m)
!値:抵抗値[Ω]
!節点番号(起点): 0以上の値 ※節点
!節点番号: 0以上の値 ※節点
DATA R0-1,1, 0, 1
DATA R0-3,1, 0, 3
DATA R1-2,1, 1, 2
DATA R1-4,1, 1, 4
DATA R2-5,1, 2, 5
DATA R3-4,1, 3, 4
DATA R3-6,1, 3, 6
DATA R4-5,1, 4, 5
DATA R4-7,1, 4, 7
DATA R5-8,1, 5, 8
DATA R6-7,1, 6, 7
DATA R7-8,1, 7, 8

LET N=12 !上記で記入した抵抗素子DATAの総数
LET Probe1=0 !計測する節点番号 ※+端子
LET Probe2=8 !計測する節点番号 ※接地端子
!---------- ↑↑↑入力はここまで↑↑ ----------

DIM M(0 TO nmax-1,0 TO nmax-1) !隣接行列
FOR i=1 TO N !回路を記録する
READ el$,ev
READ nd1,nd2
LET M(nd1,nd2)=1/ev !無向グラフ ※成分はアドミタンス
LET M(nd2,nd1)=1/ev
NEXT i

!連立方程式 Ax=bを作成
DIM A(0 TO nmax-1,0 TO nmax-1),x(0 TO nmax-1),b(0 TO nmax-1)
MAT A=ZER
MAT b=ZER
LET It=1 !合成抵抗を測定する為に、節点番号(probe1)に外部から強制的に流す電流値[A]
LET Gt=1 !節点番号(probe2)を対地0電位にするためのダミー値(大きさは任意)

!キルヒホッフの電流則より、節点方程式を組み立てる
!対角成分の計算 ※節点に接続された素子(アドミタンス)の和
DIM d(0 TO nmax-1)
MAT d=CON
MAT d=M*d !内積
FOR i=0 TO nmax-1 !mat A=(d)*I
LET A(i,i)=d(i)
IF d(i)=0 THEN LET A(i,i)=1 !結線されていない節点
NEXT i

!その他の成分 ※節点に接続された素子(アドミタンス)に-1をかけたものの和
MAT A=A-M

LET A(Probe2,Probe2)=A(Probe2,Probe2)-Gt !電流源を加味する
LET b(Probe1)=It
LET b(Probe2)=-It

DIM Ai(0 TO nmax-1,0 TO nmax-1) !連立方程式を解く
MAT Ai=INV(A)
MAT x=Ai*b

print "節点";probe2;"を大地に接地し、大地を基準にして節点";probe1;"に"
print It;"[A]を流し込んだ時の、各節点対地電位[V]計算値"
print
for k=0 to nmax-1
print "V";k;"=";x(k) !MAT PRINT x; !各節点の電位を表示する
next
print

PRINT "節点";Probe1;"-";Probe2;"間の合成抵抗=";(x(Probe1)-x(Probe2))/It;"[Ω]" !R0=V0/I0

END




  !直流電気回路の計算-閉路電流法の行列解法 山中和義 2008/08/17 22:00:39  (修正1回)  ツリーへ
Re: 合成抵抗の計算−ブリッジ回路  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/17 22:00:39 ** この記事は1回修正されてます
!直流電気回路の計算 - 閉路電流法の行列解法

OPTION ARITHMETIC RATIONAL !分数表示

!●回路図

!  ┌R11┬R12┬─ b
!  R8 R9 R10
!  ├R6┼R7┤
!  R3 R4 R5  R=1Ω、a-b端子に6V
!a ─┴R1┴R2┘
!
! 枝路電流:水平は右へ、垂直は上へと仮定する

!---------- ↓↓↓↓↓ ----------
LET N=12 !素子の数 ※電圧源を除く
LET Ns=1 !電圧源の数
!---------- ↑↑↑↑↑ ----------
LET NN=N+Ns


DIM z(NN,NN) !抵抗行列
MAT z=ZER
!---------- ↓↓↓↓↓ ----------
DATA 1,1,1,1,1,1,1,1,1,1,1,1 !R1,R2,R3,…,R12
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO N !対角線に配置する
READ z(k,k)
NEXT k


DIM s(NN,1) !電圧源
MAT s=ZER
!---------- ↓↓↓↓↓ ----------
DATA 6 !V0
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO Ns
READ s(N+k,1)
NEXT k


!---------- ↓↓↓↓↓ ---------- ※枝電流iのループ電流Iに対する関係
LET L=5 !閉路の数
DATA -1,0,1,-1,0,1,0,0,0,0,0,0,0 !下左
DATA 0,-1,0,1,-1,0,1,0,0,0,0,0,0 !下右
DATA 0,0,0,0,0,-1,0,1,-1,0,1,0,0 !上左
DATA 0,0,0,0,0,0,-1,0,1,-1,0,1,0 !上右
DATA 1,1,0,0,1,0,0,0,0,1,0,0,1 !電圧源
!---------- ↑↑↑↑↑ ----------
DIM H(L,NN) !閉路行列
MAT READ H

DIM Ht(NN,L) !H^t
MAT Ht=TRN(H)


DIM R(L,L) !閉路抵抗行列
DIM tmp(L,NN)
MAT tmp=H*z
MAT R=tmp*Ht !R=H*z*H^t

DIM Ri(L,L) !R^-1
MAT Ri=INV(R)


DIM i(NN,1) !各素子に流れる枝路電流
MAT i=H*s !i=H^t*R^-1*H*s
MAT i=Ri*i
MAT i=Ht*i
MAT PRINT i


DIM u(NN,1) !各素子にかかる電圧
MAT u=z*i
MAT PRINT u


PRINT "合成抵抗=";s(NN,1)/i(NN,1) !R0=V0/I0

END
  │└電源が複数の場合 島村1243 2008/08/19 09:43:13   ツリーへ
Re: !直流電気回路の計算-閉路電流法の行列解法  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/19 09:43:13
電源が複数の場合

行列の応用でこういう事まで出来るのかと驚嘆しています。
「電圧源」を扱える様に見受けられましたので、回路網に任意の起電力を含む回路計算が出来るのかも、と思い
テストしてみました。
テストは、起電力1個を単独の1辺と扱い、下記回路図でDATA入力しましたが、結果はNOでした。
行列の計算ロジックが理解出来ないので自分で改造が出来ない状態ですが、これが可能になると、汎用回路網計算
プログラムとして、非常に有用になります。

OPTION ARITHMETIC RATIONAL !分数表示
!●回路図
!a┬--R1--┬---R2-─-b  R1=1[Ω],R2=2[Ω]
! | | |
! | R3 | R3=3[Ω]
! | | |
! ┴--E4--|c--E5----┘ E4=4[V],E5=5[V]

! 枝路電流:水平は右へ、垂直は上へと仮定する
! 電圧源:電池V4は+極が右向き、Eは+極が左向きとする

!---------- ↓↓↓↓↓ ----------
LET N=3 !素子の数 ※電圧源を除く
LET Ns=2 !電圧源の数
!---------- ↑↑↑↑↑ ----------
LET NN=N+Ns

DIM z(NN,NN) !抵抗行列
MAT z=ZER
!---------- ↓↓↓↓↓ ----------
DATA 1,2,3 !R1,R2,R3
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO N !対角線に配置する
READ z(k,k)
NEXT k

DIM s(NN,1) !電圧源
MAT s=ZER
!---------- ↓↓↓↓↓ ----------
DATA 0,0,0,4,5 !E4,E5
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO Ns
READ s(N+k,1)
NEXT k

!---------- ↓↓↓↓↓ ---------- ※枝電流iのループ電流Iに対する関係
LET L=3 !閉路の数
DATA 1,0,-1,-1,0 !左半分
DATA 0,1,1,0,1 !右半分
DATA 1,1,0,-1,1 !外周り
!---------- ↑↑↑↑↑ ----------
DIM H(L,NN) !閉路行列
MAT READ H

DIM Ht(NN,L) !H^t
MAT Ht=TRN(H)

DIM R(L,L) !閉路抵抗行列
DIM tmp(L,NN)
MAT tmp=H*z
MAT R=tmp*Ht !R=H*z*H^t

DIM Ri(L,L) !R^-1
MAT Ri=INV(R)

DIM i(NN,1) !各素子に流れる枝路電流
MAT i=H*s !i=H^t*R^-1*H*s
MAT i=Ri*i
MAT i=Ht*i
MAT PRINT i

DIM u(NN,1) !各素子にかかる電圧
MAT u=z*i
MAT PRINT u

!PRINT "合成抵抗=";s(NN,1)/i(NN,1) !R0=V0/I0

END
  │ └このように設定してください。 山中和義 2008/08/19 11:57:37   ツリーへ
Re: 電源が複数の場合  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/19 11:57:37
このように設定してください。


!●回路図
!   d
!a┬R1┬R2┬b  R1=1[Ω]、R2=2[Ω]
! │ R3 │  R3=3[Ω]
! └E4┼e5┘  E4=4[V] +極は右、e5=5[V] +極は左
!   c

!枝路電流:水平は右へ、垂直は上へと仮定する

!---------- ↓↓↓↓↓ ----------
LET N=3 !素子の数 ※電圧源を除く
LET Ns=2 !電圧源の数
!---------- ↑↑↑↑↑ ----------
LET NN=N+Ns

DIM z(NN,NN) !抵抗行列
MAT z=ZER
!---------- ↓↓↓↓↓ ----------
DATA 1,2,3 !R1,R2,R3
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO N !対角線に配置する
READ z(k,k)
NEXT k



DIM s(NN,1) !電圧源
MAT s=ZER
!---------- ↓↓↓↓↓ ----------
!※電圧源は1辺ですから、抵抗のある辺は0となるので、電圧源のみ入力する。

DATA 4,5 !E4,e5
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO Ns
READ s(N+k,1)
NEXT k



!---------- ↓↓↓↓↓ ----------
!※辺の数は5、節点の数は4より、閉路の数(面)は2となる。5-(4-1)=2
LET L=2 !閉路の数

!※枝路電流iのループ電流Iに対する関係。 符号を表すので、1,0,-1のいずれか。
DATA 1,0,-1, -1,0 !左半分
DATA 0,1,1, 0,1 !右半分
!---------- ↑↑↑↑↑ ----------
DIM H(L,NN) !閉路行列
MAT READ H


(以下略)




現状手動のため、「閉路」と「その関係式」の入力が注意が必要となります。
回路図からの自動入力を実現したいものです。(調査中)
  │  └正しい結果が出ました 島村1243 2008/08/19 14:16:20  (修正2回)  ツリーへ
Re: このように設定してください。  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/19 14:16:20 ** この記事は2回修正されてます
正しい結果が出ました

このプログラムでは、「抵抗辺から若い番号付けを行い、電源辺の番号付けは、最後の抵抗辺番号の続きとする」と
いう点が、閉回路行列DATAを作成する時に注意する点だと言う事が理解(カンジニアです)出来ました。

>現状手動のため、「閉路」と「その関係式」の入力が注意が必要となります。
>回路図からの自動入力を実現したいものです。(調査中)

自動入力が出来れば凄いですが、このBASIC画面で回路図を作成しなければ、このプログラムが動作しなくなると、
このプログラムを利用する人の手間の方が何倍も大変になるだろうと想像します。
特に、少し離れた2個の節点間に抵抗辺が有る回路網を扱う様な場合は、BASIC画面の回路図を作るのも大変だろう
し、その図を読み取るプログラムはそれこそ大変なのだろうと思います。

私は現場の電気実務者ですが、紙に電気回路網を書いて抵抗値や起電力の辺番号付けを行ってH行列を入力する事は
(注意して入力する必要はありますが)さほどの手間には感じません。キルヒホッフの第2法則で回路方程式を
作って連立方程式を解く手間の方がもの凄い手間ですので、今回ご教示頂いた複数電源のプログラムで十分有り
難いです(参考意見です)。

なお、直流回路網の電圧・電流分布計算のみでなく、複素数インピーダンスを使った交流回路網の電圧・電流
計算に使いたいと考えています。
  │   └行列計算の説明 山中和義 2008/08/19 17:54:10  (修正1回)  ツリーへ
Re: 正しい結果が出ました  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/19 17:54:10 ** この記事は1回修正されてます
行列計算の説明

網目電流ベクトルをI、各素子の枝路電流ベクトルをiとすると
閉路における電流は、キルヒホッフの電流則より
i=H^t*I 式(1)
と表現できる。ここで、H^tは閉路行列Hの転置行列とする。


  ┌R2┐
┌R1┤ ├┐
│ └R3┘│
└─V4──┘

R1-R3-V4(網目電流I1)、R2-R3の閉路(網目電流I2)から
  i1 i2 i3 i4
H=┌1 0 1 1┐閉路1
 └0 1 -1 0┘閉路2
※枝路電流と網目電流が同じ向きは1、逆向きは−1、無関係は0として各成分を求める。

各素子の枝路電流は
┌i1┐=┌1 0┐┌I1┐
│i2│ │0 1│└I2┘
│i3│ │1 -1│
└i4┘ └1 0┘
   =┌I1  ┐
    │I2  │
    │I1-I2│
    └I1  ┘
(終り)


各素子にかかる電圧ベクトルをuとすると
オームの法則より
u=z*i 式(2)
=z*(H^t*I)
と表現できる。ここで、zは抵抗行列とする。


z=┌R1 0 0 0┐
 │ 0 R2 0 0│
 │ 0 0 R3 0│
 └ 0 0 0 0┘
※素子の番号は1からの連番とする。 順に対角線上に配置する。
(終り)


また、閉路における電圧は、キルヒホッフの電圧則より
H*u=H*s 式(3)
と表現できる。ここで、sは電圧源ベクトルとする。


s=┌ 0┐
 │ 0│
 │ 0│
 └V4┘
※素子の番号は1からの連番で、電圧源はそれに続く。

H*u=┌1 0 1 1┐┌u1┐=┌u1+u2+u4┐
  └0 1 -1 0┘│u2│ └u2-u3  ┘
        │u3│
        └u4┘

H*s=┌1 0 1 1┐┌ 0┐=┌V4┐
  └0 1 -1 0┘│ 0│ └ 0┘
        │ 0│
        └V4┘
(終り)


この左辺は
H*u=H*(z*H^t*I)=(H*z*H^t)*I=R*I
となる。ここで、H*z*H^t=R(閉路抵抗行列)とする。
よって、R*I=H*s(=右辺)
Rの逆行列をR^-1とすると、I=R^-1*H*s


R=H*z*H^t=┌1 0 1 1┐┌R1 0 0 0┐┌1 0┐=┌1 0 1 1┐┌R1  0┐=┌R1+R3 -R3┐
     └0 1 -1 0┘│ 0 R2 0 0││0 1│ └0 1 -1 0┘│ 0 R2│ └-R3 R2+R3┘
           │ 0 0 R3 0││1 -1│       │R3 -R3│
           └ 0 0 0 0┘└1 0┘       └ 0  0┘
ところで
H*u=R*I=┌R1+R3 -R3┐┌I1┐
    └-R3 R2+R3┘└I2┘
H*s=┌V4┐
  └ 0┘
となるから、R*I=H*sは網目電流法で組み立てた連立方程式になる。
したがって、Rは網目電流Iの係数を意味する。
(終り)


したがって、枝路電流iは式(1)より
i=H^t*I
=H^t*(R^-1*H*s)


各素子にかかる電圧は
このiを式(2)に代入して、求められる。
  │    ├感謝します 島村1243 2008/08/19 18:12:30   ツリーへ
Re: 行列計算の説明  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/19 18:12:30
感謝します

山中さん、貴重なお時間を割いてのご教示感謝します。
電圧・電流の一般関係を表す行列式
[V]=[E]-[Z][I] , [V]:端子電圧、[E]:電源電圧、[Z]:抵抗、[I]:電流
との対応が、どの様になっているのかが理解できなかったのですが
これを読ませて頂いて勉強したいと思います。
  │    └任意の抵抗辺に起電力も含む 島村1243 2008/08/20 10:54:20   ツリーへ
Re: 行列計算の説明  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/20 10:54:20
任意の抵抗辺に起電力も含む

山中さんにご教示頂いた行列計算の説明書を読むと、1個の辺要素に
起電力と抵抗の両者を含む場合も計算出来る事が理解できました。

山中さん定義の「閉回路行列」を使った回路網計算法は、まさに、内部
抵抗を持つ(持たなくても良い)電圧源を、回路網の任意の辺に複数含
む場合の電圧・電流分布をも計算出来る汎用可能な素晴らしいプログラ
ムでした。

山中さんは、抵抗回路網の合成抵抗を求める事を主目的としていた
(推測です)ので電源は1個しか必要なく、そのため、電圧0の入力
手間を省くために抵抗辺と電源辺を別扱いにし、抵抗辺の番号を優先的
に付けてから電源辺の番号付けをする方式だった様です。

各辺の「抵抗値と電圧値」を全て入力させるようにすれば前記の汎用化
が可能になりますので、下記の様にコードを一部変更させて頂きました。
この結果電源専用辺を設ける前回の方法(5辺)に対し、変更版では3
辺になりますので、最も入力を間違い易い閉回路行列のデータ入力数を
減らせる効果も出ました。
<変更箇所>
(1)NNとNsを全てNに変更
(2)各辺の抵抗素子電圧ではなく、端子間(節点間)電圧を表示させた。

!●例題の回路図
!a┬--┬--┬  R1=1[Ω],R2=2[Ω],R3=3[Ω]
! R1 R3 R2  
! | | |
! E1 | E2 E1=4[V]:+極は上向き、E2=5[V]:+極は上向き
!└---┼--┘  
!   b
!枝路電流の正方向:水平は右へ、垂直は上へと仮定する

option arithmetic rational
!---------- ↓↓↓↓↓ ----------
LET N=3 !辺の総数 
!---------- ↑↑↑↑↑ ----------

DIM z(N,N) !抵抗行列
MAT z=ZER
!---------- ↓↓↓↓↓ ----------
DATA 1,2,3 !R1,R2,R3
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO N !対角行列を自動作成
READ z(k,k)
NEXT k

DIM s(N,1) !電圧源(電池起電力)行列
MAT s=ZER
!---------- ↓↓↓↓↓ ----------
!※電池起電力は、仮定した枝路電流の正方向と電池の+側
!向きが逆の場合、「−」を付ける事。
DATA 4,5,0 !E1,E2,E3
!---------- ↑↑↑↑↑ ----------
FOR k=1 TO N
READ s(k,1)
NEXT k

!---------- ↓↓↓↓↓ 閉回路行列作成----------
!※辺の数は3、節点の数は2より、閉路の数(面)は3-(2-1)=2となる。
LET L=2 !閉路の数設定
!※枝路電流iのループ電流Iに対する関係。
!1=同方向,0=無関係,-1=逆向き,のいずれか。
DATA 1,0,-1 !左半分ループ
DATA 0,-1,1 !右半分ループ
!---------- ↑↑↑↑↑ ----------
DIM H(L,N) !閉回路行列
MAT READ H

DIM Ht(N,L) !H^t
MAT Ht=TRN(H)

DIM R(L,L) !閉回路抵抗行列
DIM tmp(L,N)
MAT tmp=H*z
MAT R=tmp*Ht !R=H*z*H^t

DIM Ri(L,L) !R^-1
MAT Ri=INV(R)

DIM i(N,1) !各素子に流れる枝路電流
MAT i=H*s !i=H^t*R^-1*H*s
MAT i=Ri*i
MAT i=Ht*i

print "各辺の電流計算結果一覧"
FOR k=0 TO N-1
IF MOD(k,5)=0 AND K>0 THEN PRINT
PRINT "i(";k+1;")=";i(k+1,1);", ";
NEXT K
PRINT
PRINT

DIM u(N,1) !各素子辺の端子電圧
MAT u=z*i
MAT u=s-u
print "各辺の端子電圧計算結果一覧"
FOR k=0 TO N-1
IF MOD(k,5)=0 AND k>0 THEN PRINT
PRINT "v(";k+1;")=";u(k+1,1);", ";
NEXT K

END
  電圧源を含む節点電位法 山中和義 2008/08/22 09:24:52   ツリーへ
Re: 合成抵抗の計算−ブリッジ回路  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/22 09:24:52
電圧源を含む節点電位法


!電気回路シミュレーション(節点電位法)

!・回路図のグラフ(節点、素子辺)を描く
!・各節点の電位を表示する
!・各素子への電流、電位を表示する

!OPTION ARITHMETIC RATIONAL !分数表示

LET xmax=5 !表示領域 ※
LET ymax=5
SET WINDOW -1,xmax,-1,ymax
DRAW grid


SET TEXT background "opaque" !文字の表示属性
SET TEXT JUSTIFY "center","half"

SUB DisplayElement(el$,ev,nd1,nd2,dr$,ofs) !素子を表示する
LET x1=MOD(nd1,xmax) !起点位置
LET y1=INT((nd1)/ymax)
LET x2=MOD(nd2,xmax) !終点位置
LET y2=INT((nd2)/ymax)

IF UCASE$(dr$)="V" THEN !垂直線
LET xo=x1+ofs
PLOT LINES: x1,y1; xo,y1 !起点への足
PLOT LINES: xo,y2; x2,y2 !終点への足
PLOT LINES: xo,y1; xo,y2

LET xm=xo !中央へ
LET ym=(y1+y2)/2
PLOT TEXT, AT xm+0.05,ym: el$ !説明書き

DRAW disk WITH SCALE(0.05)*SHIFT(xo,(y1+2*y2)/3) !枝路電流の向き

ELSEIF UCASE$(dr$)="H" THEN !水平線
LET yo=y1+ofs
PLOT LINES: x1,y1; x1,yo !起点への足
PLOT LINES: x2,yo; x2,y2 !終点への足
PLOT LINES: x1,yo; x2,yo

LET xm=(x1+x2)/2 !中央へ
LET ym=yo
PLOT TEXT, AT xm,ym: el$ !説明書き

DRAW disk WITH SCALE(0.05)*SHIFT((x1+2*x2)/3,yo) !枝路電流の向き

ELSE !斜め線
PLOT LINES: x1,y1; x2,y2

LET xm=(x1+x2)/2 !中央へ
LET ym=(y1+y2)/2
PLOT TEXT, AT xm,ym: el$ !説明書き

DRAW disk WITH SCALE(0.05)*SHIFT((x1+2*x2)/3,(y1+2*y2)/3) !枝路電流の向き

END IF

DRAW circle WITH SCALE(0.13)*SHIFT(x1,y1) !端子
DRAW circle WITH SCALE(0.13)*SHIFT(x2,y2)
PLOT TEXT, AT x1,y1: STR$(nd1)
PLOT TEXT, AT x2,y2: STR$(nd2)
END SUB


!---------- ↓↓↓↓↓ ----------

!●回路図
!┌R1┬R3┐
!V4 R3 V5
!└─┴─┘

!素子: Rn,Vn,In、n:番号(連番) ※2文字目以降は番号
!値:
!端子番号(起点): 0以上の値 ※節点
!端子番号: 0以上の値 ※節点
!方向: H(水平)、V(垂直)、以外は斜め
!位置: 起点からの引き出される足の長さ

LET N=4 !素子の数 ※電圧源を除く
100 DATA R1,6,11,6,v,0 !6[Ω]、枝路電流は11→6と仮定する
DATA R2,12,11,12,x,0
DATA R3,8,12,6,v,1
DATA I4,9,6,11,v,-1 !9[A]、向き6→11

!※電圧源の番号は1からの連番
LET Ns=1 !電圧源の数
DATA V1,36,12,6,v,0 !36[V]、端子6:+極

LET GND=6 !※アース

!---------- ↑↑↑↑↑ ----------

   └つづき 山中和義 2008/08/22 09:25:40   ツリーへ
Re: 電圧源を含む節点電位法  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/08/22 09:25:40
つづき


LET NN=(xmax*ymax-1)+Ns

!●キルヒホッフの電流則より、節点方程式を組み立てる
DIM A(0 TO NN,0 TO NN),x(0 TO NN),b(0 TO NN) !連立方程式 Ax=b
MAT A=ZER
MAT b=ZER

FOR i=1 TO N+Ns !回路を記録する
READ el$,ev
READ nd1,nd2
READ dr$,ofs

CALL DisplayElement(el$,ev,nd1,nd2,dr$,ofs) !回路を表示する


!連立方程式を組み立てる
! ┌  │  ┐┌ ┐ ┌ ┐
! │G │±1││V │=│I │
!───┼─────────
! │±1│-Zp││Ip│ │Ep│
! └  │  ┘└ ┘ └ ┘

SELECT CASE UCASE$(el$(1:1)) !素子に応じて
CASE "V" !電圧源なら
LET p=VAL(el$(2:LEN(el$)))+(xmax*ymax-1) !番号を得る
LET A(nd1,p)=A(nd1,p)-1 !電流Ipが節点iから節点jへ流れたとして、(Vi-Vj)-Ip*Zp=Ep
LET A(p,nd1)=A(p,nd1)-1
LET A(nd2,p)=A(nd2,p)+1
LET A(p,nd2)=A(p,nd2)+1
LET A(p,p)=A(p,p)+0 !内部抵抗Zpは0とする
LET b(p)=b(p)+ev !起電力

CASE "I" !電流源なら
LET b(nd1)=b(nd1)-ev
LET b(nd2)=b(nd2)+ev

CASE ELSE !素子なら
LET Gij=1/ev
!対角成分 ※節点に接続された素子(アドミタンス)の和
LET A(nd1,nd1)=A(nd1,nd1)+Gij
LET A(nd2,nd2)=A(nd2,nd2)+Gij
!その他の成分 ※節点に接続された素子(アドミタンス)に-1をかけたものの和
LET A(nd1,nd2)=A(nd1,nd2)-Gij
LET A(nd2,nd1)=A(nd2,nd1)-Gij

END SELECT
NEXT i

DIM d(0 TO xmax*ymax-1) !節点の有無フラグ
MAT d=ZER
FOR i=0 TO xmax*ymax-1 !結線されていない節点 1*Vi=0
LET d(i)=A(i,i)
IF A(i,i)=0 THEN LET A(i,i)=1
NEXT i
LET A(GND,GND)=0 !電位を0とする

MAT PRINT A;
MAT PRINT b;


!STOP !表示が正しいならこの行を「注釈」として、以降のプログラムを実行させる



DIM Ai(0 TO NN,0 TO NN) !連立方程式を解く
MAT Ai=INV(A)
MAT x=Ai*b


FOR i=0 TO xmax*ymax-1 !各節点の電位を表示する
IF d(i)<>0 THEN PRINT "節点";STR$(i);":";x(i);"[V]"
NEXT i
PRINT

RESTORE 100
FOR i=1 TO N !各素子に流れる電流を表示する
READ el$,ev
READ nd1,nd2
READ dr$,ofs

IF UCASE$(el$(1:1))="I" THEN !電流源なら
PRINT el$;":";ev;"[A]",x(nd2)-x(nd1);"[V]"
ELSE
PRINT el$;":";(x(nd1)-x(nd2))/ev;"[A]",x(nd1)-x(nd2);"[V]"
END IF
NEXT i
FOR i=1 TO Ns !電圧源に流れる電流を表示する
READ el$,ev
READ nd1,nd2
READ dr$,ofs

PRINT el$;":";x((xmax*ymax-1)+i);"[A]",b((xmax*ymax-1)+i);"[V]"
NEXT i


END
    └入力が簡単で使い易い 島村1243 2008/08/23 15:10:41   ツリーへ
Re: つづき  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/08/23 15:10:41
入力が簡単で使い易い

数理的なテクニックとしては、閉路行列を使う方式の方が、座標変換の考え方が導入されていて(昨今の現場で
は、ベクトル制御などという座標変換の応用が大流行なので)数学的に興味が高いのですが、大きな回路網にな
ると閉路行列データをミスなしで入力するのが難しいですね。

こちらの作品は、節点間要素データを入力するだけなので、十分な注意を必要とする閉回路データ入力が不要で
ミスし難く、実務には使い易いですね。しかも電流源まで対象に含めているので、かゆいところに手が届く思いです。

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。