// PROGRAM rc // 交流電圧源の接続された RC 回路のシミュレーション #include "TrueBASIC.h" #include "csgraphics.h" #define V(V0,omega,t) ((V0)*cos((omega)*(t))) int main(); void initial(double *Q, double *R, double *tau, double *V0, double *omega, double *tmax, double *t, double *dt); void set_up_windows(int IC1_, int IC2_, double V0, double tmax); void scope(double *Q, double *I, double R, double tau, double V0, double omega, double t, double dt); void source_voltage(int IC1_, double V0, double omega, double t); void output_voltage(int IC2_, double I, double R, double t); int main() { int IC1_ = 1, IC2_ = 2; double I, Q, R, V0, dt, omega, t, tau, tmax; GWopen(0); initial(&Q, &R, &tau, &V0, &omega, &tmax, &t, &dt); set_up_windows(IC1_, IC2_, V0, tmax); source_voltage(IC1_, V0, omega, t); output_voltage(IC2_, I, R, t); while(t <= tmax) { scope(&Q, &I, R, tau, V0, omega, t, dt); t += dt; source_voltage(IC1_, V0, omega, t); output_voltage(IC2_, I, R, t); } GWquit(); return 0; } void initial(double *Q, double *R, double *tau, double *V0, double *omega, double *tmax, double *t, double *dt) { double C, f, period; char Stmp1_[_LBUFF_]; (*t) = 0; (*V0) = 1; // 外部電圧の振幅 printf("external voltage frequency (Hertz) = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", &f); (*omega) = 2*pi*f; // 角振動数 printf("resistance (ohms) = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", R); printf("capacitance (farads) = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", &C); printf("time step dt = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", dt); (*Q) = 0; (*tau) = (*R)*C; // 緩和時間 period = 1/f; // 外部振動数の周期 if(period > (*tau)) (*tmax) = 2*period; else (*tmax) = 2*(*tau); } void set_up_windows(int IC1_, int IC2_, double V0, double tmax) { double Vmin, tmin; GWvport(0.0f, 0.0f, GWaspect(1), 0.5f); tmin = 0; Vmin = -V0; draw_axes((float)tmin, (float)tmax, (float)Vmin, (float)V0); GWputtxt((float)tmin, (float)(V0), "source voltage"); GWsavevp(IC1_); GWvport(0.0f, 0.5f, GWaspect(1), 1.0f); draw_axes((float)tmin, (float)tmax, (float)Vmin, (float)V0); GWputtxt((float)tmin, (float)(V0), "voltage drop across resistor"); GWsavevp(IC2_); } void scope(double *Q, double *I, double R, double tau, double V0, double omega, double t, double dt) { // 電圧降下の計算 (*I) = V(V0, omega, t)/R - (*Q)/tau; (*Q) += (*I)*dt; } void source_voltage(int IC1_, double V0, double omega, double t) { static float x = -100.0f, y = -100.0f; GWselvp(IC1_); GWsetpen(BLUE, -1, -1, -1); GWmove2(x, y); x = (float)(t); y = (float)(V(V0, omega, t)); GWline2(x, y); } void output_voltage(int IC2_, double I, double R, double t) // 抵抗器の電圧降下 { static float x = -100.0f, y = -100.0f; GWselvp(IC2_); GWsetpen(RED, -1, -1, -1); GWmove2(x, y); x = (float)(t); y = (float)(I*R); GWline2(x, y); }