sanguisorba が 2021年05月07日13時43分31秒 に編集
初版
タイトルの変更
Wolfram Engine + Jupyter notebookで回路解析 (Windows)
タグの変更
Wolfram
回路
本文の変更
Wolfram Mathematicaを個人で使うには高額すぎる。 そこで、無料で使えるWolfram EngineとJupyter notebookを使ってMathematica相当の環境を作ろうという話。 大学でWolfram Mathematicaのライセンスが無償配布されているという方はこの記事を見る必要ありません。 ちなみに、単純に回路解析をしたい場合はWolfram Alphaでも同じ事ができます。 https://www.wolframalpha.com/ ++後半の回路解析が間違っていたらコメントください++ ## 前書き Q.どういうときにWolfram言語を使うの? A.こういう回路を解析する時に使う。これを微積で計算するのは面倒くさい。 ![](https://camo.elchika.com/26e7d19790ed04e0087c1ee6c9b2532ef8720466/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f36383465393363322d666365642d343861322d383334612d393537373262636266306331/) 回路シミュレータによるとこのような出力電圧となるらしい。 ![1V 1000Hz](https://camo.elchika.com/9e1e178029c479884dc6f7ae6157da7d7fcb64e2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f32396361346438352d613431342d343933392d383537362d613063366661373731386635/) ![1V 7958Hz](https://camo.elchika.com/75c493b2347e383a5ad18e63539f54920746e4bc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f63666439386231612d376232652d343139352d613836302d653163393462323661396461/) ## Wolfram Engine 導入 大まかな流れ * ここから本体をダウンロード&インストール https://www.wolfram.com/engine/index.ja.php * Wolfram IDを作ってアクティベート(ダウンロード画面で次のステップとして書いてある事をするだけ) これは大した作業じゃない。 ## Anaconda 導入 Jupyter notebookを用いるにはPythonの導入が必要ですが、Pythonを使った事がない人には敷居が高いです。 そこで今回はAnaconda Individual パッケージを使用します。このPythonパッケージにはJupyter notebookが予め内蔵されています。 プラットフォームに合わせてダウンロードしてください https://www.anaconda.com/products/individual これをインストーラの指示に従って入れてください。 **・All Users でインストール** ・Add Anaconda 3 to the system PATH environment variable のチェックは不要です。 ## プラグイン導入 このサイトから右上の緑色のCodeボタンを押してDownload Zipでダウンロードしてください。 https://github.com/WolframResearch/WolframLanguageForJupyter 解凍すると、WolframLanguageForJupyter-masterというフォルダの中にごちゃごちゃといろいろ入ってます。 このフォルダをそのままAnacondaのフォルダに移します。All Usersの場合、デフォルトのインストール先は C:\ProgramData\Anaconda3 その後、Anaconda promptを起動して以下のコマンドを入力します **CD C:\ProgramData\Anaconda3\WolframLanguageForJupyter-master .\configure-jupyter.wls add** その後、 jupyter kernelspec list とコマンドを入力して、Available kernelsの中に"wolframlanguage"があれば成功です。 一回コマンドプロンプトを閉じて、改めてAnaconda 3 > Jupyter NotebookでJupyterを起動しましょう。 ## 基本操作 Jupyter NotebookはWebベースのアプリケーションなので起動するとコマンドプロンプトと同時にブラウザが起動して、そこにJupyterの画面が表示されます。 右上のNewタブにWolfram Languageがあればちゃんと追加できています。これを選択しましょう。 ![キャプションを入力できます](https://camo.elchika.com/422222c2a5233b6f59f9740fb26338dd2b430c0e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f33306431623733322d323934382d346464302d396431622d363631306463656233643364/) すると次のような画面が表示されます。 ![キャプションを入力できます](https://camo.elchika.com/34fbc2e73d09422adc49b56098d82700c68e4f10/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f35653861316335612d306562312d343933392d623861312d616431323062663532633761/) In [] : のテキストボックスにWolfram言語を入力します。 例えば5+2を計算したい場合、5+2と入力して上のRunを押す。 例えば不定積分を行いたい場合は [Integrate](https://reference.wolfram.com/language/ref/Integrate.html)[Cos[x],x]と入力してRunを押す。 ※[Wolram言語では三角関数の頭文字は大文字です。](https://reference.wolfram.com/language/guide/TrigonometricFunctions.html) そうすると次のように出力されます。 ![キャプションを入力できます](https://camo.elchika.com/b80fa0dd0c029ef80bbf6bfd7023e859cbafc8ac/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f39316635333136372d386665352d343738382d616461352d653738393538643433323333/) これがWolframです。 ++Wolfram言語については次のドキュメントを参照。 https://reference.wolfram.com/language/++ ## 前書きで書いた回路を分析する ![コレ](https://camo.elchika.com/26e7d19790ed04e0087c1ee6c9b2532ef8720466/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f36383465393363322d666365642d343861322d383334612d393537373262636266306331/) 今回は周波数特性をx軸に周波数、y軸に振幅比としてグラフに出力する事を目標とします。 Wolfram言語で回路解析をする場合はラプラス変換を用いて計算を行います。 そのため、回路方程式を**ラプラス変換によるs関数表記**に変える必要があります。 回路を学習したことある人であれば、この3つの式は知っていると思います。 $$V=RI$$ $$V=\frac{1}{C} \int I dt$$ $$V=L\frac{dI}{dt}$$ s関数では、微分と積分を次のように表現します $$\frac{1}{s}= \int dt$$ $$s=\frac{d}{dt}$$ 従って、コイルとコンデンサの電圧と電流の関係式を次のように書き換えます。 $$\mathcal{L}[V]=\frac{1}{sC}\mathcal{L}[I]$$ $$\mathcal{L}[V]=sL\mathcal{L}[I]$$ これを基に回路方程式を立てます。 尚、ラプラス変換の記号は $\mathcal {L}$、逆ラプラス変換の記号は $\mathcal {L}^{-1}$で表されます。 入力側の電流は $$\mathcal{L}[u(t)]=r\mathcal{L}[I]+\frac{1}{sC}\mathcal{L}[I]=\frac{sCr+1}{sC}\mathcal{L}[I]$$ $$\mathcal{L}[I]=\frac{sC}{sCr+1} \mathcal{L}[u(t)]$$ 出力側の電流は $$\mathcal{L}[y(t)]=R\mathcal{L}[I]$$ $$\mathcal{L}[I]=\frac{1}{R}\mathcal{L}[y(t)]$$ 入力電流と反転出力電流が等しいと仮定して $$\frac{sC}{sCr+1}\mathcal{L}[u(t)]+\frac{1}{R}\mathcal{L}[y(t)]=0$$ $$\mathcal{L}[y(t)]=-R\frac{sC}{sCr+1}\mathcal{L}[u(t)]$$ 一つ注意点として、**入力電圧もラプラス変換をする必要があります。** ラプラス変換表から求めるのがセオリーですが、せっかくなのでWolframを用いて計算をしてみましょう。 [LaplaceTransform](https://reference.wolfram.com/language/ref/LaplaceTransform.html)の構文は ``` LaplaceTransform [**関数**, t, s] ``` です。中身の関数は時間tに関する表記となるように計算します。直流の場合は直流電圧をそのまま代入します。 以下は実行例です。($cos(\omega t), 5, e^{-at}, 5cos(\omega t)$) ![キャプションを入力できます](https://camo.elchika.com/c360f671e7335f8d6700f872f6d2cf0f4295af95/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f39373861626165342d383664362d343137362d393730632d383466313866386265646233/) 前書きで載せたシミュレーションの入力電圧は交流1Vなので$1\times cos(\omega t)$のラプラス変換した値である $$\mathcal{L}[u(t)]=\frac{s}{s^2+\omega ^2}$$ が入力電圧となります。ゆえに、 $$\mathcal{L}[y(t)]=-R\frac{sC}{sCr+1}\mathcal{L}[u(t)]=-R\frac{sC}{sCr+1} \frac{s}{s^2+\omega ^2}$$ となります。 先程、ラプラス変換を行ったので今度は**逆**ラプラス変換を行います。 さらに素子値を代入しても良いですが、この状態で**逆**ラプラス変換を行う事もできます。 [InverseLaplaceTransform](https://reference.wolfram.com/language/ref/InverseLaplaceTransform.html)の構文は ``` InverseLaplaceTransform [**関数**, s, t] ``` です。sとtが逆になります。具体的にはこんな感じ。 ``` In [16] : InverseLaplaceTransform [-R*(s*C/(1+s*C*r))*(s/(s^2+ω^2)),s,t] ``` ![キャプションを入力できます](https://camo.elchika.com/57bcf5acbf77fec2e0d5cac05b45c23bc2aa230f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f65363037633265662d333266612d346464662d623161332d306664303338303035383235/) ちなみに、本家のWolfram Mathematicaで計算してもこんな感じ。 ![キャプションを入力できます](https://camo.elchika.com/fcfc6acdf714906eab196a4f451c2be70664d307/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f37613833653262362d656535302d343362372d396661652d383965363136653366373962/) わかりやすく書くと、 $$y(t)=\frac{CR\omega sin (\omega t) - C^2rR \omega ^2 cos (\omega t)}{C^2 r^2 \omega ^2 +1}-\frac{R}{r(C^2r^2 \omega ^2+1)} e^{- \frac{t}{Cr}}$$ これが入力電圧cosωtに対しての出力電圧です。ただし定常状態ではexp項がほぼ0となるので $$y(t)=\frac{CR\omega sin (\omega t) - C^2rR \omega ^2 cos (\omega t)}{C^2 r^2 \omega ^2 +1}$$ となります。 さっきの素子値を代入するとこんな感じになります。 $r=200\Omega$, $R=100\Omega$, $C=100\times10^{-9}F$ ``` In [17] : InverseLaplaceTransform [-100*(s*10^(-7)/(1+s*10^(-7)*200))*(s/(s^2+ω^2)),s,t] ``` ![キャプションを入力できます](https://camo.elchika.com/dfa78c007ce228bd0fa825fbe128afb601b9ef46/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f35393231633364662d393436322d346432362d613965332d353062343165633838633431/) 定常状態とすると、 $$y(t)=\frac {50000\omega sin (\omega t)-\omega ^2 cos (\omega t)}{5 000 000 000 + 2 \omega ^2}$$ ただし、 $$\omega = 2 \pi f$$ これで振幅を求めてみます。[NMaxValue](https://reference.wolfram.com/language/ref/NMaxValue.html)で求めました。 ![キャプションを入力できます](https://camo.elchika.com/21ef23ebc36ece1983c5051a26fda828b32ac6db/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f61663938393834622d323066352d346530352d616434302d326635366435366565656436/) 1000Hzの時62.34mV、7958Hzの時353.56mVとなりました。 回路シミュレータでの値と比べてどうでしょう? 概ね一致しているのではないでしょうか。 カットオフ周波数は $$f=\frac{1}{2 \pi fCr}$$ です。シミュレーションで用いた素子値を代入すると7957.747となります。 この回路の最大振幅は$\frac{R}{r}=\frac{100}{200}=0.5$です。 OPアンプでのカットオフ周波数は最大利得-3dBであり、振幅で表すと振幅Aに対して$\frac{A}{\sqrt{2}}$です。 よさげな計算結果が得られましたが、どうでしょう。 また、高周波になるにつれて最大振幅比の0.5,つまり500mVに近づきます。 ``` In [34] : NMaxValue[(50000*(2*π*1000)*Sin[2*π*1000*t]-(2*π*1000)^2*Cos[2*π*1000*t])/(5000000000+2*(2*π*1000)^2),t] Out[34] : 0.0623416 In [35] : NMaxValue[(50000*(2*π*7958)*Sin[2*π*7958*t]-(2*π*7958)^2*Cos[2*π*7958*t])/(5000000000+2*(2*π*7958)^2),t] Out[35] : 0.353559 In [39] : NMaxValue[(50000*(2*π*7957.747)*Sin[2*π*7957.747*t]-(2*π*7957.747)^2*Cos[2*π*7957.747*t])/(5000000000+2*(2*π*7957.747)^2),t] Out[39] : 0.353553 In [38] : 0.5/2^(0.5) Out[38] : 0.353553 In [41] : NMaxValue[(50000*(2*π*50000)*Sin[2*π*50000*t]-(2*π*50000)^2*Cos[2*π*50000*t])/(5000000000+2*(2*π*50000)^2),t] Out[41] : 0.493785 In [42] : NMaxValue[(50000*(2*π*100000)*Sin[2*π*100000*t]-(2*π*100000)^2*Cos[2*π*100000*t])/(5000000000+2*(2*π*100000)^2),t] Out[42] : 0.498424 In [43] : NMaxValue[(50000*(2*π*200000)*Sin[2*π*200000*t]-(2*π*200000)^2*Cos[2*π*200000*t])/(5000000000+2*(2*π*200000)^2),t] Out[43] : 0.499605 ``` 周波数と振幅比(最大値)をプロットすると、次のようになります。今回は[Plot](https://reference.wolfram.com/language/ref/Plot.html)を用います。 ![キャプションを入力できます](https://camo.elchika.com/aba455ad238866653c3584a9e00e0c11131f070d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f34663039313035642d373265632d346238642d393634322d663934383132663339343363/) 入力はω-> 2πx, t -> yとして ``` In [51] : Plot [NMaxValue[(50000*2*π*x*Sin[2*π*x*y]-(2*π*x)^2*Cos[2*π*x*y])/(5000000000+2*(2*π*x)^2),y],{x,1,50000}, PlotRange ->{{0,50000},{0,0.5}}] ``` Plot内部で[PlotRange](https://reference.wolfram.com/language/ref/PlotRange.html)を指定してやらないとy軸の表示域が変な事になります。 ## 前書きで書いた回路の出力電圧をラプラス変換無しで解く方法 ![コレ](https://camo.elchika.com/26e7d19790ed04e0087c1ee6c9b2532ef8720466/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f36383465393363322d666365642d343861322d383334612d393537373262636266306331/) 今回提示した回路はコンピュータを使わないと解けないほど複雑という訳ではないです。ただ計算が面倒なだけ。 まず前提として覚えておかなければならない式 $$V=RI$$ $$V=\frac{1}{C} \int I dt$$ $$V=L\frac{dI}{dt}$$ これだけを用いて回路方程式を立てます。 まず入力電圧を決める必要があります。シミュレーションと同じ1Vの正弦波$cos (\omega t)$とします。 入力側の電流は $$rI+\frac{1}{C}\int I dt=cos(\omega t)$$ 電荷に関する式に変換して微分方程式を解くと、(ここが面倒くさい) $$\frac{dQ}{dt}+\frac{Q}{Cr}=\frac{cos(\omega t)}{r}$$ 今回は未定係数法で求めます。 通常係数は$c_1, c_2 ...$という感じに表しますが、コンデンサと被るので$b$で表記すると $$Q=b_1e^{-\frac{t}{Cr}}+b_2 cos (\omega t)+b_3 sin (\omega t)$$ $b_2$, $b_3$は特解を代入すればよい。 $$\frac{d[b_2 cos (\omega t)+b_3 sin (\omega t)]}{dt}+\frac{b_2 cos (\omega t)+b_3 sin (\omega t)}{Cr}=\frac{cos(\omega t)}{r}$$ $$[-b_2 \omega sin (\omega t)+b_3 \omega cos (\omega t)]+\frac{b_2 cos (\omega t)+b_3 sin (\omega t)}{Cr}=\frac{cos(\omega t)}{r}$$ ここからできる連立方程式 $$-b_2 \omega+\frac{b_3}{Cr}=0$$ $$b_3 \omega+\frac{b_2}{Cr}=\frac{1}{r}$$ これを解いて $$b_2=\frac{C}{\omega ^2 C^2 r^2+1}$$ $$b_3=\frac{\omega C^2r}{\omega ^2 C^2 r^2+1}$$ だから、 $$Q=b_1e^{-\frac{t}{Cr}}+\frac{C}{\omega ^2 C^2 r^2+1}cos (\omega t)+\frac{\omega C^2r}{\omega ^2 C^2 r^2+1}sin (\omega t)$$ $b_1$はt=0におけるコンデンサの電荷の初期値はQ=0だから $$0=b_1+\frac{C}{\omega ^2 C^2 r^2+1}$$ $$b_1=-\frac{C}{\omega ^2 C^2 r^2+1}$$ よって $$Q=-\frac{C}{\omega ^2 C^2 r^2+1}e^{-\frac{t}{Cr}}+\frac{C}{\omega ^2 C^2 r^2+1}cos (\omega t)+\frac{\omega C^2r}{\omega ^2 C^2 r^2+1}sin (\omega t)$$ あとは電荷を微分すれば電流になるので $$I=\frac{dQ}{dt}=\frac{\omega ^2 C^2 r cos (\omega t) - \omega C sin (\omega t)}{\omega^2 C^2 r^2 +1} + \frac{1}{\omega^2 C^2 r^2 +1} \frac{1}{r}e^{-\frac{t}{Cr}}$$ 出力側の電流は $$y(t)=RI$$ $$I=\frac{y(t)}{R}$$ 入力電流と反転出力電流が等しいと仮定して $$\frac{\omega ^2 C^2 r cos (\omega t) - \omega C sin (\omega t)}{\omega^2 C^2 r^2 +1} + \frac{1}{\omega^2 C^2 r^2 +1} \frac{1}{r}e^{-\frac{t}{Cr}}+\frac{y(t)}{R}=0$$ $$y(t)=\frac{-\omega ^2 C^2 r Rcos (\omega t) + \omega C Rsin (\omega t)}{\omega^2 C^2 r^2 +1} - \frac{1}{\omega^2 C^2 r^2 +1} \frac{R}{r}e^{-\frac{t}{Cr}}$$ これは先程の逆ラプラス変換で求めたものと一致しています。 $$y(t)=\frac{CR\omega sin (\omega t) - C^2rR \omega ^2 cos (\omega t)}{C^2 r^2 \omega ^2 +1}-\frac{R}{r(C^2r^2 \omega ^2+1)} e^{- \frac{t}{Cr}}$$ ++ラプラス変換に頼らない回路計算がしたい方は、こちらをご参照ください。 技術者のための高等数学1 常微分方程式++