オンオフ動作のある回路をオイラー法で解析したい

このQ&Aのポイント
  • オンオフ動作のある回路をC言語を用いたオイラー法で解析する方法を相談したい。
  • オンオフ動作のある回路を解析するために、オイラー法を使用してC言語でプログラムを書いていますが、満足な結果が得られません。
  • オンオフ動作の回路を解析するためには、周期的にオンとオフの切り替わりを考慮しながらオイラー法を適用するプログラムを書く必要があります。どのようにプログラムを改善すればよいでしょうか。
回答を見る
  • ベストアンサー

オンオフ動作のある回路をオイラー法で解析したい

昇降圧チョッパ回路を,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しか表示されず,きちんと格納されていないのか,とにかく満足な結果が得られません。 こうした周期的にオンオフの切り替わる回路をオイラー法で解析するときには,どのようなプログラムを書けばいいのでしょうか。 方針は合っているのでしょうか。 単純な,例えばコンデンサの放電などの解析はできます。 一応オイラー法の原理なども理解しているつもりではあります。 よかったら相談に乗ってください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.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) { としてください。

jackal777
質問者

お礼

まさにここが間違えていました!! 最も基本的なところを忘れていました。 && で,きちんとデータが出て, シミュレータと同じ波形を描くことができました。 自分では気付きにくいところ,本当に助かりました。 ありがとうございます。

その他の回答 (1)

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

確認です。 >これで解析しても全部printfでは0しか表示されず,きちんと格納されていないのか,とにかく満足な結果が得られません。 printf()はどこに入れていて、どの値を表示していますか? >n = (int)( t/T );     //int型にキャスト intにキャストした場合、整数値しかとれませんが問題はありませんか? 質問内で使用しているすべての変数の型は? 実行時の「T」の値は? ifの条件式の優先順位に問題はありませんか? 複合条件の場合、優先して確認する式には()をつけておく方がいいです。

jackal777
質問者

お礼

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

関連するQ&A

  • 電磁気学のRC回路を数値解析で

    実験で、電磁気学のRC回路において スイッチを入れた後コンデンサーの両端の電圧(V)を求めるのに 時間間隔を0,5msとして0,0msから5,0msまで オイラー法とルンゲクッタ法で求めるのですが(表計算を使って) RC回路の意味も分かってなくて どのように求めたらいいのでしょうか? RC回路が分からないと解けないのでしょうか?

  • 数値解析についての質問です。お願いします

    以下の問題をプログラム、あるいはエクセルを用いて解きたいのですがどのように解いたらよいのかわかりません。お願いします dx/dt=1/2(1-x),x(0)=0.1の解を以下の方法で求めよ 1、オイラー法を用いて求めよ。時間刻みhを0.5、時間範囲を0<=t<=20とする。解析値、解析解、相対誤差を表にまとめよ。数値解、解析解の時間的変化をグラフで示せ(解析解)= 1/1+9e^-0.5t 2、オイラー法をルンゲクッタ法に変え同条件で解け

  • RLC回路 過渡解析

    直流電源-スイッチ-抵抗-コイル-コンデンサが直列につながれていて 直流電源5V 抵抗1Ω コイル1H コンデンサ1F t<0 のときスイッチOFF コンデンサ電圧v(t)=0 回路に電流は流れていない t=0でスイッチON t>0の時のコンデンサ電圧v(t)を教えてください。

  • リレーによるパルス発生回路

    ある装置の制御のため、2つのパルスを発生する回路を、機械リレーで組む事になりました。パルスといっても、必要なのは無電圧の短絡信号で、パルス発生のトリガーが、機械リレーのため、パルス発生も機械リレーで組みたいと思います。パルスの幅は、100msを確保するため、H3Yをつかって2つのパルスを発生するまではうまくいったのですが、トリガーがONの状態のまま続いたとき、再びパルスを発生し、繰り返してしまいました。 現在は、H3Yを3個とリレーを3個使って、 200ms-ON→200ms-OFF→200ms-ON→OFFのパルス発生をしていますが、2つ目のパルスがOFFしたときに、トリガーがONのままであると、再び、200ms-ONから繰り返している状況です。 そこでご相談ですが、パルスの発生から含め、良い方法を教えていただけないでしょうか。 ポイントは、 1.機械式リレー(MY)を使用 2.パルスは2つ 3.元入力が続いていても、パルスは2つで終了 です。 現在考えている回路では、上記のパルス発生に、さらにリレー3つを追加すれば出来そうですが、もっとシンプルに出来ないかと思っています。 ベテランの方々の良い知恵で、パルス発生から含めた回路でよろしくお願いします。

  • オイラー法

    区間[0,10]においてh=0.01としオイラー法を用いてとけ。また誤差も出せ。 y'=3x^2-x^3-x^6+(2x^3+1)y-y^2 y(0)=0.5 なんですけどa=3くらいから値がおかしくなりa=10の時には誤差ですぎます。誤差がでないようにするにはどこを直せばいいのか教えてください。 おねがいします。 #include<stdio.h> #include<math.h> double h=0.01; double x0=0.5; main(void) { int a; double euler(int a); double gosa; for(a=1;a<=10;a++) gosa=shin(a)-euler(a); printf("%d %f %f\n",a,euler(a),gosa); } double shin(double a) { double y; y=a*a*a+1.0/(1.0+exp(-a)); return y; } double f(double t,double x){ double y; y = 3.0*t*t-t*t*t-t*t*t*t*t*t+(2.0*t*t*t+1.0)*x-x*x; return y; } /* Euler Function */ double euler(int a){// x0:Initial Value double T,nx,x; // Initial Value x = x0; // Euler Method for(T = 0.0;T < a;T += h){ nx = x + h*f(T,x); x = nx; }

  • オイラーの公式による波の解析について

    オイラーの公式と実世界の波の扱い方がイマイチピンときません。 電磁気、量子物理などで、オイラーの公式を使った解析がでてくるので 少し困っております。少し数学と物理に詳しいかた、教えていただけませんか。 ・・・・・・・・・・・・・・・・・・・・・・・基礎は大丈夫だと・・・・・・・・・・・・・・・・・・・・・・ オイラーの公式 ある波があったとしたら y=exp(ix)=cosx+jsinx これはcosxとsinxの冪級数展開によって証明できることもやって数学 的な土台は大丈夫だと思うのですが さて本題ですが、 物理などでは電子や光子は波の性質と物質の性質をもち、 波としてみる場合 入射波と反射波の干渉による定常状態 が主に問題になるわけです。 例えば量子で言えば、波動方程式の解は ψ={C1exp(ikx)+C2exp(-ikx)}exp(iωt) C1,C2は積分定数 みたいな式が出てきて、 答えがisin(kx)とか出てきたらこの波はどういう波として解釈 するべきなのでしょうか? 逆にcos(kx)という波がでてきたらどう解釈すればいいのか。 それに関連して、別の視点からの質問もしたいと思います。 波を扱うとき、オイラーで波を表すときに、実数部だけを取って 考えたり虚数部だけを取って考えたりする時があります。これも上と 関連がある場合は合わせて教えていただけるとありがたいです。 (オイラーの定理は色々な使い方が工学上の計算であるようなので、  ごっちゃになっているかもしれないので聞いてみました。)

  • 伝達マトリックス法を用いた振動解析

    中空円筒管の両端を固定した場合の振動解析を行っており,伝達マトリクスを算出し,固有値解析を行いたいと考えています. しかし,伝達マトリクスの算出法がおかしいのか,途中の伝達マトリクスの行列式の値を算出したときに発散してしまいます.何か間違っている可能性があるので, 以下の記載において,間違いがあればご指摘願います. (注:xは円筒管の長軸の長さ, Zは変位と力を示す状態量,Uは円筒管の動特性を表す係数マトリクス,Tは伝達マトリクスです.またx_iは任意の接点,x_Nとx_0はそれぞれ短部の接点です.) 円筒管の運動方程式により(1)が導かれます. d/dx{Z(x_i)}={U}{Z(x_i)}・・・・(1) さらに中空円筒管の軸方向の伝達マトリクスは(2)式のように表されます. {Z(x_i)}={T(x_i-1)}{Z(x_i-1)}・・(2) (2)式を(1)式に代入すると d/dx{T(x_i-1)}={U}{T(x_i-1)} ・・(3) ここで,(3)式においてオイラー法(もっとも簡単であるため)を用いて離散化すると ({T(x_i)}- {T(x_i-1)})/dx={U}{T(x_i-1)} 整理すると {T(x_i)}= {T(x_i-1)}+dx{U}{T(x_i-1)} ・・(4) ここで(4)式で示す各節点における{T(x_i)}を初期値{T(x_0)}={単位行列}として順々に計算により求める. 一方,伝達マトリクスはいくつかの要素が連続的に結合されている系であることから {Z(x_N)}= {T(x_N)} {T(x_N-1)} ・・・・{T(x_1)} {T(x_0)}{Z(x_0)} ・・(5) {T(x)}={T(x_N)} {T(x_N-1)} ・・・・{T(x_1)} {T(x_0)}・・(6)とおくと {Z(x_N)}= {T(x)}{Z(x_0)} ・・(7) 円筒間の両端x_N,x_0における境界条件の基に{T(x)}の行列式が0になるような,各固有振動数を求めればよい. そのために(4)式で求めた{T(x_i)}を(6)式に代入して求めて,(7)式において任意の境界条件が成り立つ行列式を算出すればよいと考えていますが,何か考え方に間違いがあればご指摘願いたいと思います.

  • ダイオードの並列回路でわからないことがあります。

    電子回路について勉強しているのですが、ダイオードの並列回路でわからないことがあります。 この回路ではなぜ3つの電圧のうち一番高い電圧が右の抵抗にかかるのですか? 電子回路に詳しい方、この回路について(特にそれぞれのダイオードの部分)解説していただけませんか? 一番電圧が高いV1がつながっているところのD1がONになればそのほかのD2、D3はOFFとなり電流は流れないそうですが では、なぜ一番電圧が高いV1を基準に考えるのでしょうか? 「D2→ON、D3→OFF、D1→OFF」や「D1→ON、D2→OFF、D3→OFF」はなぜありえないのでしょうか? 実はYahoo知恵袋でも質問させていただいたのですか、あまり回答が返ってこないので、こちらでも質問しました。 どなたか説明できる方回答お願いします。

  • 等価回路について

    等価回路について 自分は学校で電子回路について講義を受けました そこではhパラメータを使って回路の解析をしていました もう少し回路について学びたいと思い 「アナログ電子回路」 藤井信生 を購入したのですが、その本ではほぼT形等価回路で解析しています ナレータ・ノレータモデルというのも詳しくわかりません 説明をお願いします。 実際、T形等価回路のほうが学習していく上ではよいのでしょうか? 講義で使った教科書は 「電子回路」 桜庭一郎 です。

  • Octaveでのオイラー法とルンゲクッタ法について

    講義ノートを見ながら数値解析ソフトOctaveの操作を勉強しています。 読んでいる講義ノートにオイラー法とルンゲ・クッタ法でf''(x)+f'(x)+x=0の微分方程式を解く箇所があるのですが、書いている通りに打ち込むとx=0の直線になってしまいます。lsodeで解くとうまくいくのですが。学び始めたばかりの初心者でまったく分からないので、、どうすればいいか教えてください。以下が講義ノートに書いてあったプログラムです。xdot2,euler,rk4は定義された関数で、rk4eulerがメインプログラムです。 % xdot2.m function xdot2 = xdot2(x,t) xdot2=[x(2) -x(2)-x(1)]; % euler.m function x=euler(F,x,t) [m n]=size(t); %t のサイズ(=ステップ数)を抽出 for k=1:m-1 %tのサイズ-1回繰り返す。 tau=t(k+1)-t(k); x(k+1,:)=x(k,:)+tau.*feval(F,x(k,:),t(k)); %上の式がオイラー法の公式 end % rk4.m function x=rk4(F,x,t) [m n]=size(t); for k=1:m-1 %t のサイズ-1 だけステップを繰り返す。 tau = t(k+1)-t(k); %刻み幅 F1=feval(F,x(k,:),t(k)); F2=feval(F,x(k,:)+1/2*tau.*F1,t(k)+1/2*tau); F3=feval(F,x(k,:)+1/2*tau.*F2,t(k)+1/2*tau); F4=feval(F,x(k,:)+tau*F3,t(k)+tau); x(k+1,:)= x(k,:)+tau/6*(F1 +2*F2 +2*F3 +F4); %以上が4次のRK法の公式 end %rk4euler.m %オイラー、RK、lsode の比較 t=[0:0.2:10]’; x0=[0 1]; %定義域、初期値の定義 R1=euler('xdot2',x0,t); x1=R1(:,1); %オイラー法 R2= rk4('xdot2',x0,t); x2=R2(:,1); %RK 法 R3=lsode('xdot2',x0,t); x3=R3(:,1); %lsode plot(t,x1,'rx-.',t,x2,'bx',t,x3,'ko'); xlabel('t'); ylabel('x'); legend('Euler','RK4','lsode'); title('rk4euler1.m');

専門家に質問してみよう