※ ChatGPTを利用し、要約された質問です(原文:RLC回路をプログラミングで計算すると発散する件)
RLC回路をプログラミングで計算すると発散する件
このQ&Aのポイント
RLC直列回路の動きを細かく解析してみようと思い、プログラミングで計算してみましたが、値が増加し続けてしまい、早い段階で発散してしまいます。
回路方程式をプログラムに落とし込む方法に問題があるのか、それとも特別な追加処理が必要なのか、解決方法を知りたいです。
RLC回路のシミュレーションをする際に発散を防ぐためのアプローチを教えていただけると幸いです。
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();
}
このソースを実際に動かしてみると、どんどん値が増加していき、早い段階で±∞に発散してしまいます。。
プログラミングでシミュレーションをするには、何か特別に追加処理が必要になるのでしょうか。
解決方法をご存知の方おりましたら、よろしくお願いいたします。
お礼
回答ありがとうございます。 dtを1/2倍にすると、正しく計算する事ができました! 次は、小さいサンプリングレートでもちゃんと動くようなソースを研究してみます。 ありがとうございました