Wolfram Mathematicaを個人で使うには高額すぎる。
そこで、無料で使えるWolfram EngineとJupyter notebookを使ってMathematica相当の環境を作ろうという話。
大学でWolfram Mathematicaのライセンスが無償配布されているという方はこの記事を見る必要ありません。
ちなみに、単純に回路解析をしたい場合はWolfram Alphaでも同じ事ができます。
https://www.wolframalpha.com/
後半の回路解析が間違っていたらコメントください
Q.どういうときにWolfram言語を使うの?
A.こういう回路を解析する時に使う。これを微積で計算するのは面倒くさい。
回路シミュレータによるとこのような出力電圧となるらしい。
大まかな流れ
これは大した作業じゃない。
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があればちゃんと追加できています。これを選択しましょう。
すると次のような画面が表示されます。
In [] : のテキストボックスにWolfram言語を入力します。
例えば5+2を計算したい場合、5+2と入力して上のRunを押す。
例えば不定積分を行いたい場合は Integrate[Cos[x],x]と入力してRunを押す。
※Wolram言語では三角関数の頭文字は大文字です。
そうすると次のように出力されます。
これがWolframです。
Wolfram言語については次のドキュメントを参照。
https://reference.wolfram.com/language/
今回は周波数特性をx軸に周波数、y軸に振幅比としてグラフに出力する事を目標とします。
Wolfram言語で回路解析をする場合はラプラス変換を用いて計算を行います。
そのため、回路方程式をラプラス変換によるs関数表記に変える必要があります。
回路を学習したことある人であれば、この3つの式は知っていると思います。
V=RI
V=C1∫Idt
V=LdtdI
s関数では、微分と積分を次のように表現します
s1=∫dt
s=dtd
従って、コイルとコンデンサの電圧と電流の関係式を次のように書き換えます。
L[V]=sC1L[I]
L[V]=sLL[I]
これを基に回路方程式を立てます。
尚、ラプラス変換の記号は L、逆ラプラス変換の記号は L−1で表されます。
入力側の電流は
L[u(t)]=rL[I]+sC1L[I]=sCsCr+1L[I]
L[I]=sCr+1sCL[u(t)]
出力側の電流は
L[y(t)]=RL[I]
L[I]=R1L[y(t)]
入力電流と反転出力電流が等しいと仮定して
sCr+1sCL[u(t)]+R1L[y(t)]=0
L[y(t)]=−RsCr+1sCL[u(t)]
一つ注意点として、入力電圧もラプラス変換をする必要があります。
ラプラス変換表から求めるのがセオリーですが、せっかくなのでWolframを用いて計算をしてみましょう。
LaplaceTransformの構文は
LaplaceTransform [**関数**, t, s]
です。中身の関数は時間tに関する表記となるように計算します。直流の場合は直流電圧をそのまま代入します。
以下は実行例です。(cos(ωt),5,e−at,5cos(ωt))
前書きで載せたシミュレーションの入力電圧は交流1Vなので1×cos(ωt)のラプラス変換した値である
L[u(t)]=s2+ω2s
が入力電圧となります。ゆえに、
L[y(t)]=−RsCr+1sCL[u(t)]=−RsCr+1sCs2+ω2s
となります。
先程、ラプラス変換を行ったので今度は逆ラプラス変換を行います。
さらに素子値を代入しても良いですが、この状態で逆ラプラス変換を行う事もできます。
InverseLaplaceTransformの構文は
InverseLaplaceTransform [**関数**, s, t]
です。sとtが逆になります。具体的にはこんな感じ。
In [16] : InverseLaplaceTransform [-R*(s*C/(1+s*C*r))*(s/(s^2+ω^2)),s,t]
ちなみに、本家のWolfram Mathematicaで計算してもこんな感じ。
わかりやすく書くと、
y(t)=C2r2ω2+1CRωsin(ωt)−C2rRω2cos(ωt)−r(C2r2ω2+1)Re−Crt
これが入力電圧cosωtに対しての出力電圧です。ただし定常状態ではexp項がほぼ0となるので
y(t)=C2r2ω2+1CRωsin(ωt)−C2rRω2cos(ωt)
となります。
さっきの素子値を代入するとこんな感じになります。
r=200Ω, R=100Ω, C=100×10−9F
In [17] : InverseLaplaceTransform [-100*(s*10^(-7)/(1+s*10^(-7)*200))*(s/(s^2+ω^2)),s,t]
定常状態とすると、
y(t)=5000000000+2ω250000ωsin(ωt)−ω2cos(ωt)
ただし、
ω=2πf
これで振幅を求めてみます。NMaxValueで求めました。
1000Hzの時62.34mV、7958Hzの時353.56mVとなりました。
回路シミュレータでの値と比べてどうでしょう?
概ね一致しているのではないでしょうか。
カットオフ周波数は
f=2πfCr1
です。シミュレーションで用いた素子値を代入すると7957.747となります。
この回路の最大振幅はrR=200100=0.5です。
OPアンプでのカットオフ周波数は最大利得-3dBであり、振幅で表すと振幅Aに対して√2Aです。
よさげな計算結果が得られましたが、どうでしょう。
また、高周波になるにつれて最大振幅比の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を用います。
入力はω-> 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を指定してやらないとy軸の表示域が変な事になります。
今回提示した回路はコンピュータを使わないと解けないほど複雑という訳ではないです。ただ計算が面倒なだけ。
まず前提として覚えておかなければならない式
V=RI
V=C1∫Idt
V=LdtdI
これだけを用いて回路方程式を立てます。
まず入力電圧を決める必要があります。シミュレーションと同じ1Vの正弦波cos(ωt)とします。
入力側の電流は
rI+C1∫Idt=cos(ωt)
電荷に関する式に変換して微分方程式を解くと、(ここが面倒くさい)
dtdQ+CrQ=rcos(ωt)
今回は未定係数法で求めます。
通常係数はc1,c2...という感じに表しますが、コンデンサと被るのでbで表記すると
Q=b1e−Crt+b2cos(ωt)+b3sin(ωt)
b2, b3は特解を代入すればよい。
dtd[b2cos(ωt)+b3sin(ωt)]+Crb2cos(ωt)+b3sin(ωt)=rcos(ωt)
[−b2ωsin(ωt)+b3ωcos(ωt)]+Crb2cos(ωt)+b3sin(ωt)=rcos(ωt)
ここからできる連立方程式
−b2ω+Crb3=0
b3ω+Crb2=r1
これを解いて
b2=ω2C2r2+1C
b3=ω2C2r2+1ωC2r
だから、
Q=b1e−Crt+ω2C2r2+1Ccos(ωt)+ω2C2r2+1ωC2rsin(ωt)
b1はt=0におけるコンデンサの電荷の初期値はQ=0だから
0=b1+ω2C2r2+1C
b1=−ω2C2r2+1C
よって
Q=−ω2C2r2+1Ce−Crt+ω2C2r2+1Ccos(ωt)+ω2C2r2+1ωC2rsin(ωt)
あとは電荷を微分すれば電流になるので
I=dtdQ=ω2C2r2+1ω2C2rcos(ωt)−ωCsin(ωt)+ω2C2r2+11r1e−Crt
出力側の電流は
y(t)=RI
I=Ry(t)
入力電流と反転出力電流が等しいと仮定して
ω2C2r2+1ω2C2rcos(ωt)−ωCsin(ωt)+ω2C2r2+11r1e−Crt+Ry(t)=0
y(t)=ω2C2r2+1−ω2C2rRcos(ωt)+ωCRsin(ωt)−ω2C2r2+11rRe−Crt
これは先程の逆ラプラス変換で求めたものと一致しています。
y(t)=C2r2ω2+1CRωsin(ωt)−C2rRω2cos(ωt)−r(C2r2ω2+1)Re−Crt
ラプラス変換に頼らない回路計算がしたい方は、こちらをご参照ください。
技術者のための高等数学1 常微分方程式
-
sanguisorba
さんが
2021/05/07
に
編集
をしました。
(メッセージ: 初版)
-
sanguisorba
さんが
2021/05/07
に
編集
をしました。
-
sanguisorba
さんが
2022/01/22
に
編集
をしました。
ログインしてコメントを投稿する