// RL直列交流回路の電圧・電流のシミュレーションと // オシロスコープ(oscilloscope)的なグラフ表示 // コンパイル:$ cc osc.c -std=c99 -lm -o osc // 実行例: // $ ./osc // $ ./osc 1 // $ ./osc > osc.txt; ./osc.plot osc.txt #include #include "cx.h" #define GMAX 20 // グラフ表示の最大振幅 void plot(double t, double v, double i, double max, int graph) { printf("%6.3f\t%6.2f\t%6.2f\t", t, v, i); if (graph) { int pv = (int)(GMAX*v/max); int pi = (int)(GMAX*i/max); for (int k = -GMAX; k <= GMAX; k++) { int c; if (k == pi) c = 'I'; else if (k == pv) c = 'V'; else if (k == 0) c = '.'; else c = ' '; putchar(c); } } putchar('\n'); } int main(int argc, char *argv[]) { int graph = 0; // グラフ表示フラグ if (argc > 1) graph = 1; // コマンド引数あり → グラフ表示へ double v0 = 10.0; // 電圧振幅 V_0 [V] double f = 50.0; // 周波数 f [Hz] double r = 50.0; // 抵抗 R [Ω] double l = 10.0; // インダクタンス L [H] double w = Pi2*f; // 角周波数 Cx z = (r + J*w*l)/1000.0; // インピーダンス [kΩ] double dt = 1.0/f/20.0; // 刻み時間 double tmax = 2.0/f; // 表示時間 printf("t[s]\tv(t)[V]\ti(t)[mA]\n"); for (double t = 0.0; t < tmax; t += dt) { // 時刻 t [s] Cx v = v0*ExpJ(w*t); // 電圧フェーザ v(t) [V] Cx i = v/z; // 電流フェーザ i(t) [mA] plot(t, creal(v), creal(i), v0, graph); } return (0); }