プロが教える店舗&オフィスのセキュリティ対策術

昇降圧チョッパ回路を,C言語を用いたオイラー法で解析しようとしています。
スイッチオン時にはオンの回路方程式を,スイッチオフ時にはオフの回路方程式を使います。

まずは自分の方針を聞いてください。

1周期(T[ms]:スイッチング周波数1/T[kHz])分の波形をn回回して,
十分長い時間解析し,定常状態になるまで見極めたいです。

オン時間をデューティ比d(d<1)を用いて表せば,
オン時間はd*T[ms]
オフ時間はT(1-d)[ms]
になると思います。

そこで,以下のようなif文を考えました。
1周期を考えるときの時間軸をt1として,

if (0 <= t1 < d*T){
   オンの式;
}
else {
   オフの式;
}

これに,全体の時間軸tでforループを組み合わせると,

for (t=0 ; t<=10 ; t+=h) {   //h:刻み幅
   n = (int)( t/T );     //int型にキャスト
   t1 = t - ( (double)n * T ); //double型にキャスト

   if (0 <= t1 < d*T){
      オンの式;
   }
   else {
      オフの式;
   }
}
return 0;

時間0~10秒まで刻み幅hで回し,しかもオンのときとオフのときを分岐しながら回ってくれればと期待しましたが,
これで解析しても全部printfでは0しか表示されず,きちんと格納されていないのか,とにかく満足な結果が得られません。

こうした周期的にオンオフの切り替わる回路をオイラー法で解析するときには,どのようなプログラムを書けばいいのでしょうか。
方針は合っているのでしょうか。

単純な,例えばコンデンサの放電などの解析はできます。
一応オイラー法の原理なども理解しているつもりではあります。

よかったら相談に乗ってください。
よろしくお願いします。

A 回答 (2件)

>    if (0 <= t1 < d*T) {


この式は間違えてます。C言語ではこういう表記はできません。
こう表記すると、「(0 <= t1) < d*T」と評価されますので、
「0 <= t1」を評価した結果(0 or 1)と d*T を比較することなってしまいます。

t1が0とd*Tの範囲内かどうかを調べるのなら、
>    if (0 <= t1 && t1 < d*T) {
としてください。
    • good
    • 0
この回答へのお礼

まさにここが間違えていました!!
最も基本的なところを忘れていました。

&& で,きちんとデータが出て,
シミュレータと同じ波形を描くことができました。

自分では気付きにくいところ,本当に助かりました。
ありがとうございます。

お礼日時:2008/06/25 22:45

確認です。



>これで解析しても全部printfでは0しか表示されず,きちんと格納されていないのか,とにかく満足な結果が得られません。
printf()はどこに入れていて、どの値を表示していますか?

>n = (int)( t/T );     //int型にキャスト
intにキャストした場合、整数値しかとれませんが問題はありませんか?

質問内で使用しているすべての変数の型は?

実行時の「T」の値は?

ifの条件式の優先順位に問題はありませんか? 複合条件の場合、優先して確認する式には()をつけておく方がいいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

うっかり,if文の中の範囲を書き間違えていました。
if (0 <= t1 < d*T) →if (0 <= t1 && t1 < d*T)
としたら直って,無事データを得ることができました。

お礼日時:2008/06/25 22:47

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