プロが教えるわが家の防犯対策術!

RLC直列回路の動きを細かく解析してみようと思い、ウェブサイトのサンプルコードを参考にしながら、以下のような実験をしてみました。

コンデンサの両端を出力Voとした場合、回路方程式は次のようになると思います。
 ・ Vi = RI + LdI/dt + (1/C)∫I dt
 ・ Vo = (1/C)∫I dt
変形すると、
 ・ dI = (Vi - Vo - RI)/L × dt
 ・ dVo = (I/C) dt

以上を、以下のソースコードで表現してみました

#define SAMPLE_LATE 44100     //1秒間に44100フレームとしました
float input[SAMPLE_LATE];      //1000Hzのパルス波を代入 (代入処理は略します)
float output[SAMPLE_LATE];      //RLC回路の出力を代入

float R = 10.0;   float L = 0.0001;   float C = 0.0001;      //電子部品の値を定義
float dt = 1.0/44100.0;
float I = 0.0;
float Vo = 0.0;

for(int i=0; i<44100; i++) {      //input[ ] をRLC回路に通してoutput[ ]に出力
I += (input[i]-Vo-R*I)/L*dt;
Vo += I/C*dt;
output[i] = Vo;
}

ofstream OUTF("text.txt");      //output[ ] をファイルに出力
for (int i=0; i<44100; i++){ OUTF << output[i] << endl; }
OUTF.close();
}

このソースを実際に動かしてみると、どんどん値が増加していき、早い段階で±∞に発散してしまいます。。
プログラミングでシミュレーションをするには、何か特別に追加処理が必要になるのでしょうか。
解決方法をご存知の方おりましたら、よろしくお願いいたします。

A 回答 (1件)

計算する時間間隔が不適切だとおかしなことになります.

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
dtを1/2倍にすると、正しく計算する事ができました!
次は、小さいサンプリングレートでもちゃんと動くようなソースを研究してみます。
ありがとうございました

お礼日時:2012/10/20 08:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!