エクセルでif関数を使って簡易シミュレーションを実現!

エクセルで扱える関数でもっとも使えるもののひとつにif関数があります。

if関数については、これまで以下の記事で解説しました。

参照記事1『エクセルでif関数を使う方法!重要な論理式4パターンを解説!』

参照記事2『エクセルでif関数を使う方法!分岐先の値の組み方5選を解説』

これらの記事の中で、if関数を扱うことでワークシート上で行えることが格段にアップしますよということを書いてきました。

何を実現するかは工夫次第でいくらでも可能性がありますが、本記事では『エクセルでif関数を使って電気回路系の簡易シミュレーションを実現する方法』について解説してみたいと思います。

特に、高校物理の電気回路系の問題や大学の理工系での電気系科目の理解を進めるのに役立つ内容ですが、本記事をもとに様々な分野へも展開できると思いますので、たくさんの方の参考になれば幸いです。

1.シミュレーションとは

こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。

まずは本記事でいうシミュレーション、シミュレータについて定義しておきます。

本記事でいうシミュレーションとは「模擬実験」というような意味合いです。

シミュレータはそれを行うツールを指します。

現象等を【モデル(数式など)】などに起こして、それをシミュレータ上で【条件】に合わせて再現させるイメージしてください。

簡単な例でいうと、「■個のりんごを●人の子どもたちで分け合う」という状況があるとします。

一人当たりのりんごの個数は■÷●という数式で表されますよね。

これが【モデル】です。

■が6個であったり12個であっtり、●が2人であったり3人であったり、これが【条件】です。

例えば「12個のりんごを3人で分け合う」ことをシミュレーションすると、4個ずつが平等でしょう、という答えが得られるわけですね。

2.今回の簡易シミュレーションで対象とするもの

今回は、複雑なシミュレーションができますよ、という例を示すため、電気回路系の問題を題材にしてみます。

対象回路は以下です。

整流回路といって、コンセントなどの交流電源を直流電源に変換する役割をしています。

スマホを思い出してもらうとよいですが、コンセントからUSB端子を介して充電しますよね。

スマホの充電器の場合はもっと複雑な回路ですが、その仲間の回路だと思ってください。

もう少し詳しく知りたい方は以下のキーワードで探してみてくださいね。

キーワード:ダイオード整流、全波整流、平滑コンデンサ、平滑キャパシタ、ACDCコンバータ

今回は、この整流回路の各部の電圧(赤字)や電流(青字)を計算して、グラフに波形を表示させるというシミュレーションを行います。

3.シミュレーションの全容

先にシミュレーションツールとしての最終形をお見せしますね。

下の画像がシミュレーションの画面になります。

左上の青線で囲った「■入力欄(条件入力)」という箇所と、中央当たりの緑線で囲った「■出力欄(各部電圧、電流)」という箇所、右上の「■回路図」という箇所に分かれています。

下半分にあるグラフは「■出力欄(各部電圧、電流)」の計算結果にもとづいて、電圧・電流の各波形を示しています。

「■入力欄(条件入力)」の青いセルで【条件】を入力・変更すると、■出力欄(各部電圧、電流)」に入力された【モデル(数式)】の計算結果が変わるとともに、グラフの波形も変わるという仕組みになっています。

4.条件入力の考え方

各部を詳しく見ていきますね。

「■入力欄(条件入力)」では「■出力欄(各部電圧、電流)」の【モデル(数式)】で扱う定数等を用意します。

時間変化を求めるので、まずは初期時刻と時間刻みを設けました。

次に電源の条件として、電源電圧の実効値と周波数を設定できるようにしています。

ちなみに東日本であれば100V/50Hz、西日本であれば100V/60Hzが通常となりますよね。

それらの数値とリンクしています。

電源角周波数ω0は電源周波数f0の2π(πは円周率のパイです)倍となります。

式ではω0=2*PI()*f0ですね。

これは入力欄で計算させています。

最後に回路関係の定数として、負荷に当たる抵抗値と、平滑回路(コンデンサ)のキャパシタンス値、平滑回路(コンデンサ)に初めに充電されている電圧を設定できるようにしています。

負荷(抵抗値)が大きければ負荷に流れる電流は小さくなります。

キャパシタンス値が大きければ、より滑らかな直流電圧が得られます。

この箇所では、計算に使う定数を入力欄だけで変更できるようにしている点がポイントです。

5.モデル(数式)の考え方

5.1 時刻

「■出力欄(各部電圧、電流)」の箇所が、このシミュレーションの肝となる数式が入力されています。

今回は電圧や電流の時間変化をシミュレーションしたいので、まずは「時刻」という列を設定しました。

初期値は「■入力欄(条件入力)」の初期時刻t0に従うので、F3セルはC2セルを参照しています(画像では0秒)。

F4セル以降は時間刻みtstepで増加していくので、F3+C3というように上のセルに足していきます。

ここで、C2セル、C3セルは絶対参照とすることがポイントです。

単位の違いにも注意して式を入力しましょう。

(F3セルの式)=C$2
(F4セルの式)=F3+C$3*10^-3
(F5セルの式)=F4+C$3*10^-3  
※F5以降はF4セルのオートフィルやコピペでOK

5.2 電源電圧

次にG列には電源電圧を設定しました。

電源電圧は√(2)*V0*sin(ω0*t)という式で表されます。

√(2)はエクセルではSQRT(2)と記述します。

V0は電源電圧実効値として「■入力欄(条件入力)」で設定してあります(ここでは100V)ので、ここを参照するようにします。

ω0は電源角周波数として「■入力欄(条件入力)」で設定してあります(314.16rad/s)ので、ここを参照するようにします。

時刻tは前節で作成したF列のことですので、対応するF列のセルを参照するようにします。

(G3セルの式)=SQRT(2)*C$5*sin(C$7*F3)
(G4セルの式)=SQRT(2)*C$5*sin(C$7*F4)
(G5セルの式)=SQRT(2)*C$5*sin(C$7*F5) 
※G4セル以降はG3セルのオートフィルやコピペでOK

5.3 全波整流電圧

次にH列には全波整流電圧という数式を設定しました。

電気回路に詳しくない方はイメージがわかないかもしれませんが、電源電圧(正弦波)の絶対値を取ったような波形となる電圧です。

したがって、電源電圧のG列を参照して作成します。

せっかくですので、if関数を使って、以下のような式を設定しています。

(H3セルの式)=IF(G3>=0,G3,-G3)
(H4セルの式)=IF(G4>=0,G4,-G4)
(H5セルの式)=IF(G5>=0,G5,-G5)
※H4セル以降はH3セルのオートフィルやコピペでOK

絶対値を求めるので、以下のようにABS関数を使ってもよいです。

(H3セルの式)=ABS(G3)
(H4セルの式)=ABS(G4)
(H5セルの式)=ABS(G5)
※H4セル以降はH3セルのオートフィルやコピペでOK

5.5 出力電圧

次にI列に出力電圧を設定しました。

物理的には、H列の全波整流電圧をコンデンサで平滑した電圧になります。

時刻が0のときにすでにコンデンサに充電されている場合も考えられるので、I3セルでは「■入力欄(条件入力)」の初期電圧Vo0を参照します。

I4セル以降は場合分けが必要となります。

if関数の出番ですね。

今回扱う整流回路においては、出力電圧はコンデンサの両端電圧と同義ですので、全波整流電圧がコンデンサの両端電圧より大きいときは全波整流電圧がそのまま出力され、そうでない場合(全波整流電圧がコンデンサの両端電圧より小さい場合)は前の電圧値から時定数τ=RCで決まる分量で減少します。

そこで、if関数で全波整流電圧とコンデンサの両端電圧(出力電圧)との比較をして、それぞれの式を立てています。

(I3セルの式)=C$11
(I4セルの式)=IF(H4>=I3,H4,I3*EXP(-(F4-F3)/(C$9*C$10*10^-6)))
(I5セルの式)=IF(H5>=I4,H5,I4*EXP(-(F5-F4)/(C$9*C$10*10^-6)))
※I5セル以降はI4セルのオートフィルやコピペでOK

5.6 コンデンサ電流

ここまでで各部の電圧に関するモデル(数式)を用意できました。

次に用意するのは電流のモデル(数式)になります。

コンデンサは、充電と放電を行う要素です。

充電される場合と放電する場合の式をif関数で場合分けする必要があるのです。

充電となるのは、全波整流電圧より出力電圧(≓コンデンサの両端電圧)が大きい場合です。

その場合、キャパシタンス値Cと、コンデンサに印加される全波整流電圧の時間微分から、iC = C*ΔV/Δt と計算されます。

時間微分は、(今の値 - 前の値)/(今の時刻 - 前の時刻)と考えることができますので、例えばJ4セルでは、(今の全波整流電圧 - 前の全波整流電圧)/(今の時刻 - 前の時刻)という式で表現しました。

このような微分表現は、初期値設定が難しく、今回は暫定的にJ3セルを0としています。

シミュレータとしては要改善の点です。

(J3セルの式)=0(暫定で0としましたが、シミュレータとしては要改善です。。)
(J4セルの式)=IF(H3-I3>=0,C$10*10^-6*(H4-H3)/(F4-F3),-K3)
(J5セルの式)=IF(H4-I4>=0,C$10*10^-6*(H5-H4)/(F5-F4),-K4)
※J5セル以降はJ4セルのオートフィルやコピペでOK

5.7 負荷電流

K列では負荷電流を求めます。

今回の回路においては抵抗負荷の設定となっています。

またコンデンサによって平滑された電圧が出力される(負荷に印加される)ことになります。

そのため、直流の考え方でよいのです。

オームの法則(I=V/R)を思い出しましょう。

(K3セルの式)=I3/C$9
(K4セルの式)=I4/C$9
(K5セルの式)=I5/C$9
※K4セル以降はK3セルのオートフィルやコピペでOK

5.8 電源電流

「■出力欄(各部電圧、電流)」としては最後になりますが、L列では電源電流を求めました。

電源電流はコンデンサ電流と負荷電流の和になります(キルヒホッフの法則)。

(L3セルの式)=J3+K3
(L4セルの式)=J4+K4
(L5セルの式)=J5+K5
※L4セル以降はL3セルのオートフィルやコピペでOK

6.計算量に関して

第5章では今回のシミュレーションの肝となる【モデル(数式)】を見てきました。

これまでのように数式を解いて、セルに入力することでシミュレーションツール(シミュレータ)として使用できるように構築してきたわけですが、計算量はどのくらいにすればよいのでしょうか?

今回お見せしたシミュレーションにおいては、3行目~2003行目にかけて【モデル(数式)】を入力しました。

時間刻みtstepを0.01ms(ミリ秒)とする場合、0.02s(秒)の区間を計算させていることになります。

シミュレーションにおいてこの刻みと全体のシミュレーション時間はとても重要な要素です。

時間刻みが大きすぎると波として捉えることができません(サンプルが荒くなります)。

全体のシミュレーション時間は時間変化を見るために適切な値があるはずです。

例えば今回の例では50Hzの商用電源を対象にしていましたので、0.02s(=20ミリ秒)で一周期となるんですね。

何を確認したいかをよく考えて設定してみましょう。

7.出力される波形に関して

第5章では、計算式と合わせて波形も紹介しました。

今回のような時間に対する波形を表示させるには【散布図】が適しています。

散布図では、【系列名】、【系列Xの値】、【系列Yの値】を設定します。

【系列名】は省略可能ですが、他担当者や後で作業する自分のために設定しておくのがよいです。

下の画像ではG2セルが相当しますね。

【系列Xの値】は横軸に相当しますので、F列に作成した時刻を選択します。

この例では3行目~2003行目までというように計算させたすべての範囲を選択するとよいです。

表示範囲はグラフの機能で必要な箇所だけに変更できるためです。

【系列Yの値】は縦軸に相当しますので、G~L列に作成した各計算結果を選択します。

こちらも3行目~2003行目までというように計算させたすべての範囲を選択するとよいですね。

8.まとめ

本記事では『エクセルでif関数を使って電気回路系の簡易シミュレーションを実現する方法』について解説しましたが、いかがでしたか?

高校物理から電気系の勉強をしてきましたが、なかなか自分で視覚化できず苦労した覚えがあります。

本格的な回路シミュレータがなくても、数式を導出できれば、今回のようにエクセルで実現することができるので、電気の理解を進めるのに活躍するかと思います。

また今回は電気回路を対象にしましたが、そうでなくても構いません。

数学の公式(例えば三角関数の加法定理など)を視覚化する、といったような使い方をしてもよいと思います。

if関数でできることが拡がるというところから、簡易的なシミュレーションも作っれちゃうよ、という記事でした。

参考にしてみてくださいね。