交流電的一般解
是 1 乘 n 矩陣, 和 是 n 乘 n 矩陣,交流電路總是一開始長這樣:
以複數來表達是某個 :
如果可以做某些行運算之後讓 的某一行為 0 ( 不可逆),代表某些狀態是其他狀態的組合。把這些不獨立的狀態都代換掉之後,重新新整理微分方程或者如果可以做某些行運算(等式兩邊右乘矩陣是做行運算,等式兩邊左乘矩陣是做列運算)之後讓 變成單位矩陣,產生一個新的 和 的微分方程:
以 做變數變換,只專注去掉 的部分表達的狀態,則:
原 微分方程式就變成 的常微分方程式:
所以(參見 數學線性微分方程知識 中提到的數學)它的解是:
所以
程式可以畫出隨著時間進展的 或 ,(如果 最後趨近 0) 最後穩定狀態以 表達是 ,以 表達是 ,對應的實部就是各迴路的電壓或電流數值。
例一
RCL電路, 是電容器的電量, 的電容器的電壓, 是電流, 是電阻的電壓, 是電流的微分, 是電感器的電壓, 是交流電源電壓最大值:
寫成矩陣:
長的是這個樣子
與使用複數表示阻抗的關係
接續例一的 RCL電路,它的 微分方程式是:
最後穩定狀態是:
如果進一步簡化狀態變數,專注在電流,把牽涉電感的狀態變數除以 ,牽涉電容電量的狀態變數乘以
,則這時候電流狀態變數對應的矩陣的數值就是用複數表示的阻抗。定義 狀態:
變成 的常微分方程式。穩定狀態是:
因為 ,此時同一個電流的相關 狀態值都一樣;
所以,
如果只對最終穩定狀態感興趣,可以用 狀態去直接寫聯立線性方程式,此時因為電流的任一階積分或任一階微分的量 (電容器是電流的的一階積分電子元件,電感器是電流的一階微分電子元件,目前市面上並沒有電流其他階積分或微分的電子元件) 都以同一個狀態數值表示,矩陣的大小會變小,假設這個電路有 s 個迴路,變成解 的線性聯立方程式問題。其中 為 s 乘 s 矩陣, 和 為 1 乘 s 矩陣, 的組成是以複數表示的阻抗, 的組成是除掉 之後複數表示的電壓。 矩陣會是對稱矩陣;一個電阻是 歐姆,每個迴路看到的電阻都是 歐姆,一個電容器是 法拉,每個迴路看到的電容都是 法拉。要特別注意的是多隻腳的電感器。迴路 1 有一個電感器電感值是 亨利,迴路 2 有一個電感器電感值是 亨利,如果這兩個電感器有共用線圈或是共用磁場鐵棒,則在沿迴路 1 寫電壓的時候,迴路 2 電流對迴路 1 貢獻的電壓數字的電感係數不是 ,而是 ,稱之為感應電感,理論數值為 亨利。電感數值和線線圈個數的平方成正比,通常線圈個數也和電感器的長度成正比 (電感器的製作方法是絕緣漆銅線纏繞著一個鐵棒,所以鐵棒長度和線圈數成正比),所以電感數值和長度的平方成正比。當這兩個電感器只有兩隻腳,不同迴路看到的電感都是 所以感應電感 還是 ,情況就變得像電阻或電容一樣;換個說法,在計算一個迴路的電壓的時候,另一個迴路的電流在電阻或電容或只有兩隻腳的電感貢獻的電壓和原本的電阻或電容或電感一樣,多隻腳的電感器 (或是電路板因為 layout 不良,距離太靠近的兩個兩隻腳電感線圈) 因為磁場互相影響的緣故情況比較特別,另一個迴路的電流在這個多腳電感器貢獻的電壓是用電感理論值 來計算。
例二
這邊有二個迴路,迴路 1 的電流是 迴路 2 的電流是 ,這個三隻腳電感器在迴路 1 ( AB ) 是 亨利,在迴路 2 的電感器( CB ) 長度只有一半是 亨利,所以 ,LOAD 是個電暖爐電阻是 。此時迴路 1 和迴路 2 的壓降數學式不是:
而是:
直接寫成 方程式,設最終解 :
所以
要知道到底電流如何隨著時間穩定到最終的週期電流:
擴展到複數表示:
注意到 不可逆:
array
只能是 不能亂選,原本微分方程式在代換之後變成:
也就是:
由上面提過的一般解:
這裡 是上面找到的最終解,但是 在這個例子並沒有趨近 0 ,所以說這句話 "設最終解 " 或類似的話的時候邏輯上要小心。其實在這個例子裡從最原始微分方程就可以看到數學上 加上任何常數都還是解。 其實因為實際的電路總是有小小的電阻,所以最終來自初始值 的貢獻都會隨著時間逐漸消失,這也是直接求最終解是實際上合理的原因。
功率
電壓乘電流就是功率瓦數也就是每秒鐘花掉的焦耳數。當電壓和電流符號相反的時候這個數字是負的,意思是還回去電源的功率。直流電的時候,零功率必定表示沒有電壓或沒有電流,所以沒有提供任何能量殺不了人。交流電的時候,因為電壓和電流時時刻刻在變,所以一般家電用品標示的功率是平均功率的概念,因此 0 平均功率可能還是會殺人,因為某個瞬間的功率會是很大的數字。
假設電壓是 ,電流是 ,之間的相位角度相差 ,則在時刻 的瞬間功率是 ,這個瞬間功率介於 和 之間,積分一個周期再除以一個週期得到的平均功率是 。負載複數就是電壓複數乘以電流複數,當負載複數沒有虛部的時候,電壓複數和電流複數之間的角度 或是 。雖然電壓或電流各自都很大,但是當電壓電流角度相差 90 度的時候平均功率是 0。交流電的時候所謂的平均電壓或平均電流也是一個週期平均的概念,但是如果只是原本數字的平均因為一直在 0 上下震盪所以是零,所以平均的定義是平方的平均再取平方根;積分 和 一個周期再除以一個週期再取平方根是 和 ,三用電表測量的 rms 交流電壓數字就是這個數字,於是平均功率就成為是平均電壓乘上平均電流再乘上 。平均交流電壓或電流沒有負的數字,有時候圖上故意寫上負號是為了表達角度相差 180 度。所以口語說交流電壓 120 伏特,其實瞬間電壓可以有 伏特或 伏特,這是在示波器上可以看的波浪圖形的最高點或最低點。同樣是 40 安培的保險絲,交流電保險絲也比直流電保險絲強壯,把交流電保險絲拿來當直流電保險絲用,該燒斷的時候可能沒燒斷。一個交流電家電消耗的平均功率不大,但是瞬間功率和瞬間電流可以很大。
例三
總共四個迴路,線路 0 是一個 240 伏特交流電壓源 和有三隻腳的主線圈導引出二個 120 伏特電源,迴路 0 和迴路 1 和迴路 2 共用電感器的鐵棒,迴路 1 和迴路 2 是二個導引出的 120 伏特各自接上負載,迴路 3 是 240 伏特電壓源直接接上負載提供給需要 240 伏特的電器,整條線圈導線有小小的電阻 。電阻值和導線長度成正比,不像電感。四個迴路的壓降方程式是:
例如如果 只是電阻:
沒得選, 。行運算,第一行乘上 加到第二和第三行:
所以
和 被決定:
方程式:
還是長這個樣子
直接找最終狀態。設最終解 ,對應的 方程式是:
解出來(藉由 Mathematica™ 幫忙)是:
總電流是 把這個數值寫成 ,總瓦數是 。當沒接上負載的時候,等同於 和 和 是無限大,這時候 。如果線圈電阻幾乎是零則 幾乎是90度, 幾乎是 。
或者使用 gnu scientific library 程式庫和 C 語言內建的複數計算功能,以下這個程式是解這個電路:
#include <stdio.h>
#include <complex.h>
#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>
#include <gsl/gsl_linalg.h>
#define LOOP_NUM 4
void currentSum(char* la, gsl_complex xx) {
printf("%s: %f%+fI size %f theta %f\n", la, crealf(xx), cimagf(xx), gsl_complex_abs(xx) / M_SQRT2, gsl_complex_arg(xx));
}
void loopData(char* la, gsl_complex voltage, gsl_complex current) {
double the = gsl_complex_arg(current) - gsl_complex_arg(voltage);
double vs = gsl_complex_abs(voltage) / M_SQRT2;
double is = gsl_complex_abs(current) / M_SQRT2;
printf("%s: voltage %f%+fI size %f current %f%+fI size %f theta %f watt %f\n", la, crealf(voltage), cimagf(voltage), vs, crealf(current), cimagf(current), is, the, vs * is * cos(the));
}
int main(void) {
gsl_complex iw = 2 * M_PI * 60 * I;
gsl_complex v = 240 * M_SQRT2 * gsl_complex_exp(I * 0);
gsl_complex load1 = 1.0e+1 + 1.1e+0 * I;
gsl_complex load2 = 2.0e+1 - 1.2e+2 * I;
gsl_complex load3 = 8.0e-1 + 1.3e+1 * I;
double coil_R = 1.0e-2;
double coil_L = 1.945;
/* only upper triangle and diagonal are used for saving keystrokes labor */
gsl_complex a_data[] = {
coil_R + coil_L * iw, -coil_R /2 -coil_L /2 * iw, -coil_R/2 -coil_L /2 * iw, 0,
0, load1 + coil_R /2 + coil_L /4 * iw, coil_L /4 * iw, 0,
0, 0, load2 + coil_R/2 + coil_L /4 * iw, 0,
0, 0, 0, load3
};
int i, j;
for (i=0; i\<LOOP_NUM; i++) {
for (j=i+1; j\<LOOP_NUM; j++) {
a_data[LOOP_NUM * j +i] = a_data[LOOP_NUM * i +j];
}
}
/* solve A x = b */
gsl_matrix_complex_view A = gsl_matrix_complex_view_array(a_data, LOOP_NUM, LOOP_NUM);
gsl_complex b_data[] = { v, 0, 0, v };
gsl_vector_complex_view b = gsl_vector_complex_view_array(b_data, LOOP_NUM);
gsl_vector_complex *x = gsl_vector_complex_alloc (LOOP_NUM);
int s;
gsl_permutation * p = gsl_permutation_alloc (LOOP_NUM);
gsl_linalg_complex_LU_decomp (&A.matrix, p, &s);
if ((s=gsl_linalg_complex_LU_solve (&A.matrix, p, &b.vector, x)) ) {
printf("weird! not invertible %d\n", s);
exit -1;
}
/* show result */
currentSum("I0+I3", GSL_VECTOR_COMPLEX(x, 0)+GSL_VECTOR_COMPLEX(x, 3));
currentSum("I0-I1", GSL_VECTOR_COMPLEX(x, 0)-GSL_VECTOR_COMPLEX(x, 1));
currentSum("I0-I2", GSL_VECTOR_COMPLEX(x, 0)-GSL_VECTOR_COMPLEX(x, 2));
currentSum("I1-I2", GSL_VECTOR_COMPLEX(x, 1)-GSL_VECTOR_COMPLEX(x, 2));
loopData("source", v, GSL_VECTOR_COMPLEX(x, 0)+GSL_VECTOR_COMPLEX(x, 3));
loopData("loop 1", load1 * GSL_VECTOR_COMPLEX(x, 1), GSL_VECTOR_COMPLEX(x, 1));
loopData("loop 2", load2 * GSL_VECTOR_COMPLEX(x, 2), GSL_VECTOR_COMPLEX(x, 2));
loopData("loop 3", load3 * GSL_VECTOR_COMPLEX(x, 3), GSL_VECTOR_COMPLEX(x, 3));
return 0;
}
|