12.2 電気回路網に関するキルヒホッフの法則による解法 2
多元連立
1 次方程式の工学的応用についての例を 2 つ示す.1 つは
ブリッジ
T 型回路,も
う
1 つはホーイストンブリッジ回路である.
示された回路図と与えられた回路定数からキ
ルヒホッフの法則を使って多元連立
1 次方程式を導出する.その式のパラメータを前述の
プログラムに反映させてシミュレーションを行う.
12.2.0 キルヒホッフの法則
電気回路網において,回路のある点に流れる電流,素子にかかる電圧や抵抗値(インピ
ーダンス)はキルヒホッフの法則を使って求めることができる.法則は
2 つある.
第
1 法則: 回路の分岐点において,流入する電流は流出する電流に等しい
I
1I
3I
1+ I
2= I
3+ I
4(1)
I
2I
4第
2 法則: 閉回路において,起電力の和は電圧降下の和に等しい
閉回路
abca の起電力の和と電圧降下の和は次のとおり.
R
1E
1R
3-
||
+起電力の和:
E
1+ ( - E
2) a I
1b
I
3c
I
2電圧降下の和:
R
1I
1+ R
3I
3+ R
2( - I
2)
||
+R
2E
2つまり
E
1+ ( - E
2) = R
1I
1+ R
3I
3+ R
2( - I
2)
(2)
ただし電流の向きを破線の矢印方向としている.
2 つの法則から得た式を連立して回路の解
析を行う.
12.2.1 ブリッジ T 型回路
この回路は減衰器として使用される.減衰器は強い強度を持つ電気信号(オーディオや
無線の信号など)を適切な大きさに弱める装置である.例えば
TV の電波が強い地域では正
常に信号を受信できない.そのようなところでは信号の強度を減衰器で弱めて受信するこ
とになる.またこの回路はインピーダンスのマッチングにも使用される.
下の図において,
RL は可変抵抗器である.これを調節することにより,電流 I1,I2 を小
さく(減衰)することができる.I1,I2 および I3 の向きを図の矢印の向きとする.また電
圧
E=10V,抵抗 R1=20Ω,R2=50Ω,R3=30Ω,R4=15Ω とする.抵抗 RL を 5Ω 刻みで 0 か
ら
100Ω 変化させたとき,I1,I2 および RL の端子電圧 VL がどのように変化するのか,そ
れらを計算で求め,減衰器の機能を確認する.
Fig. 1. ブリッジ T 型回路.
キルヒホッフの法則から,次の連立方程式が得られる.
(式は上から順に
I1,I2 および I3
の向きについての起電力の和となっている.
)
{
(R1 + R2)I1 − R1 × I2 − R2 × I3 = E
−R1 × I1 + (R1 + R3 + R4)I2 − R3 × I3 = 0
−R2 × I1 − R3 × I2 + (R2 + R3 + RL)I3 = 0
VL=I3×RL である.
/* Gauss elimination method */ /* 2012/10/05 */
//make procedure: gcc 12_2_1_GEM.c -o 12_2_1_GEM -lm #include <stdio.h>
#include <math.h>
#define NUMBER_OF_DATA 3 /* Number of undetermined coefficient:3元連立方程式なので3*/ #define NUNBER_OF_CF 11 /* Number of coefficient term */
#define TURN 20 /* 繰り返しの回数(0,5,…,100Ω) */ #define R1 20 /*R1の抵抗値 (Ω)*/ #define R2 50 /* R2の抵抗値(Ω)*/ #define R3 30 /* R3の抵抗値(Ω)*/ #define R4 15 /* R4の抵抗値(Ω)*/ #define E 10 /* 電池の起電力(V) */ double RL=0; double data[NUNBER_OF_CF][NUNBER_OF_CF+1];
int GEM(); /* Definition of GEM */
void show_procedure(); /* Definition of show_procedure */
int n = (int)NUMBER_OF_DATA; int turn=(int)TURN;
double epsilon=1e-18; /* Minimum value of pivot */
double x[NUNBER_OF_CF]; /* Solutions will set: x1, x2, ..., xn */
double RLandIandVL[TURN][NUMBER_OF_DATA+2]; /* RL, I1, I2, I3, VL are set */
void FileOut() // *** データをファイルへ出力する関数 ***
{
FILE *fp; // ファイルポインタの宣言
int count; // カウンタ
char FILENAME[30]; // FILENAME;ファイル名が入る変数
strcpy(FILENAME,"data.txt"); // ファイル名を決定する
fp=fopen(FILENAME,"w"); // ファイルを開く
if(fp==NULL){ printf("Error, A file can't open!\n"); } // ファイルが生成できなければエラーの表示をする
for(count=1; count<=turn; count++){ //データのファイルへの出力
fprintf(fp,"%d %f %f %f %f %f\n",count, RLandIandVL[count][0], RLandIandVL[count][1],
RLandIandVL[count][2], RLandIandVL[count][3], RLandIandVL[count][4]);
} //RLandIandVL[][0]:RL, R…L[][1]:I1, R…L[][2]: I2, R…L[][3]: I3, R…L[][4]: VLがセットされる
fclose(fp); // ファイルを閉じる }
int main() {
int count, i;
int n=(int)NUMBER_OF_DATA; /* Number of undetermined coefficient */ int pivot; /* */
for(count=1; count<=turn; count++) {//data[][]には3元連立1次方程式の成分,RとEがセットされる data[0][0] = R1+R2; data[0][1] = -R1; data[0][2] = -R2; data[0][3] = E; /* a11, ..., a1n, b1 */ data[1][0] =-R1; data[1][1] = R1+R3+R4; data[1][2]= -R3; data[1][3] = 0; /* a21, ..., a2n, b2 */ data[2][0] =-R2; data[2][1]=-R3; data[2][2] = R2+R3+RL; data[2][3] = 0; /* an1, ..., ann, bn */ pivot = GEM();
if(pivot == 1)
printf("tunr %d, RL=%f, I1=%f, I2=%f, I3=%f, VL=%f\n", count, RL, x[0], x[1], x[2], (x[2]*RL)); else { printf("This process was stopped, because a pivot is to small.\n"); }
RLandIandVL[count][0]=RL;RLandIandVL[count][1]=x[0]; RLandIandVL[count][2]=x[1]; RLandIandVL[count][3]=x[2]; RLandIandVL[count][4]=(x[2]*RL); RL += 5; } FileOut(); i=getchar(); return 0; }
GEM のコードについては項目 12.1 を参照のこと.
実行結果
プログラムを実行すると,ファイル
data.txt が生成される.このデータファイルから
Microsoft EXEL,Sma4 for Windows(フリー)や GNU PLOT(フリー)などを使って
グラフが作成できる.下はその例である.
Fig. 2. I1, I2 and VL vs. RL.
RL が増加すると,I1 と I2 が減衰している.ブリッジ T 型回路は減衰器であることが確認
できる.
0
20
40
60
80
0
0.5
1
I1
I2
VL
RL(Ω)
I1,
I2(A)
(×
10)
VL(V)
12.2.2 ホイートストンブリッジ回路
この回路は未知の抵抗(あるいはインピーダンス)を精密に測定するために使用される.
例えば歪ゲージの測定で使用されている.(この測定では材料の歪や応力が分かる.)また
微小な電位差の検出や様々な電気量を測定するために多く使用されている.
下の回路において,I0 が流れないとき,ブリッジがバランスしているという.今,電流
I1 および I2 の向きを図の矢印の向きとし,電圧 E = 10V ,抵抗 R1 = 5Ω,R3 = 4Ω,R4 =
6Ω,R0 = 0.5Ω とする.抵抗 R2 を 0.5Ω 刻みで 0 から 10Ω 変化させたとき,検流計 G に
流れる電流
I0 がどのように変化するのか,それらを計算で求め,ホイートストンブリッジ
の機能を確認する.
Fig. 3. ホーイストンブリッジ回路.
キルヒホッフの法則から,次の連立方程式が得られる.
(式は上から順に
I1,I2,I3 の向き
についての起電力の和となっている.)
{
(R1 + R2 + R0)I1 − R0 × I2 − R2 × I3 = 0
−R0 × I1 + (R3 + R4 + R0)I2 − R4 × I3 = 0
−R2 × I1 − R4 × I2 + (R2 + R4)I3 = E
I0 は I0 = I1 - I2 である.これらの関係から未知の抵抗 R2 を求める.
/* Gauss elimination method */ /* 2012/10/05 */
// make procedure: gcc 12_2_2_GEM.c -o 12_2_2_GEM -lm #include <stdio.h>
#include <math.h>
#define NUMBER_OF_DATA 3 /* Number of undetermined coefficient */
#define NUNBER_OF_CF 11 /* Number of coefficient term */
#define TURN 20 /* Turn of iteration */
#define R0 0.5 /* resistance value */
#define R1 5 /* resistance value */
#define R3 4 /* resistance value */
#define R4 6 /* resistance value */
#define E 10 /* voltage value */
double R2=0;
double data[NUNBER_OF_CF][NUNBER_OF_CF+1];
int GEM(); /* Definition of GEM */ void show_procedure(); /* Definition of show_procedure */
int n = (int)NUMBER_OF_DATA; int turn=(int)TURN;
double epsilon=1e-18; /* Minimum value of pivot */ double x[NUNBER_OF_CF]; /* Solutions will set: x1, x2, ..., xn */
double RLandIandVL[TURN][NUMBER_OF_DATA+2]; /* RL, I1, I2, I3, VL are set */
void FileOut() // *** dataのファイル出力 ***
{
FILE *fp; // ファイルポインタの宣言
int count; // カウンタ
char FILENAME[30]; // FILENAME;ファイル名が入る変数
strcpy(FILENAME,"data.txt"); // ファイル名を決定する
fp=fopen(FILENAME,"w"); // ファイルを開く
if(fp==NULL){ printf("Error, A file can't open!\n"); } // ファイルが生成できなければエラーの表示をする
for(count=1; count<=turn; count++){ // 行に沿った(原子位置に対する)種々のデータの出力
fprintf(fp,"%d %f %f %f %f %f\n",count, RLandIandVL[count][0], RLandIandVL[count][1],
RLandIandVL[count][2], RLandIandVL[count][3], RLandIandVL[count][4]); } fclose(fp); // ファイルを閉じる } int main() { int count, i;
int n=(int)NUMBER_OF_DATA; /* Number of undetermined coefficient */ int pivot; /* */
for(count=1; count<=turn+1; count++) {
data[0][0] = R1+R2+R0; data[0][1] = -R0; data[0][2] = -R2; data[0][3] = 0; /* a11, a12, ..., a1n, b1 */
data[1][0] = -R0; data[1][1] = R3+R4+R0; data[1][2] = -R4; data[1][3] = 0; /* a21, a22, ..., a2n, b2 */
data[2][0] = -R2; data[2][1] = -R4; data[2][2] = R2+R4; data[2][3] = E; /* an1, an2, ..., ann, bn */
pivot = GEM(); if(pivot == 1)
printf("tunr %d, R2=%f, I1=%f, I2=%f, I3=%f, I0=%f\n", count, R2, x[0], x[1], x[2], (x[0]-x[1]));
else { printf("This process was stopped, because a pivot is to small.\n"); }
RLandIandVL[count][0]= R2; RLandIandVL[count][1]= x[0]; RLandIandVL[count][2]=x[1]; RLandIandVL[count][3]=x[2]; RLandIandVL[count][4]=(x[0]-x[1]); R2 += 0.5; } } FileOut(); i=getchar(); return 0; }