公開日:2019/11/23
title.png

8th Season


#8-5 Mathematicaを使ってみよう

 今回は、何も工作しません、何のプログラムも組みません。
 Raspberry Pi ZeroWにインストールしたRaspbianですが、NOOBSというインストールパッケージでインストールすると、Mathematicaと言う、とっても強力なツールもインストールされています。
 これを使わない手は無いのです。

 回路やプログラムの設計には、思いの他、代数計算が付いて回ります。Mathematicaを使いこなせたら、そのような予備計算が楽になり、今後のDIYを豊かにしてくれるでしょう。

Mathematicaとの出会い

 大学生の頃だったか、社会人になって間もない頃だったか、とんと昔のことで、正確には覚えていませんが、Mathematicaを使った時の衝撃だけは、覚えています(30年近く昔の話)。
 当時、個人で購入するのは到底無理なほど高価なソフトウェアで、どこかのマシンにインストールしてあったのを「ちょこっと使わせてもらった」程度のことですが、「えっ?こんなこともできるの?」と、驚いた記憶は鮮明に残っています。
 なのに、なのに!です。Raspberry PiのRaspbianにインストールされたMathematicaは、「無料」で使えます(個人の非商用利用に限る。詳しくは、下のリンクからライセンス条件をご覧ください)。なんという事でしょう。

  WolframとRaspberry Pi (別ウインドウが開きます)

 と、言うことで、「当時使っていた自宅のPCにインストールして、バリバリ使っていた」みたいな、パワーユーザでは無く、初心者に毛が生えたくらいの者です。しかも、使ったことがあるのは数10年前なので、ドキュメントを確認して思い出しながら、となるのですが、Pi ZeroWでMathematicaを使ってみたいと思います。

Mathematicaを起動する

 Pi ZeroWの電源を投入して、Raspbianが起動したら、「ラズベリーアイコン ⇒ プログラミング ⇒ Mathematica」を起動します。起動はだいぶ鈍いです。ARM11 @1GHzだし、そこは我慢して待ってください。
 暫くすると、真っ白なウインドウが開きます(下図)。

ar85_math0.png

 これが白紙の「Wolframノートブック」です。Mathematicaは、「Wolfram言語」に基づいて動作するツールです。
 もう一枚、ドキュメントやコミュニティのWebサイトへ誘導するウインドウが開きますが、Pi ZeroWでWebブラウズは破壊的に鈍いので、このウインドウは閉じてしまいましょう。

 Wolfram言語のリファレンスや、チュートリアルなどにアクセス可能なWebサイトは、以下の場所にあります。PCのWebブラウザでアクセスした方が速いので、以下から訪ねてみてください。

  Wolfram公式サイト(別ウインドウが開きます)

 公式HPなので、PC版などの購入価格も、探せば見つかります。
 RaspbianのMathematicaは、「無料」で使用できるので、PC(Windows等)で動作させようとは思いませんが、興味ある方は調べてみてください。


 さて、ここからです。どうしましょう?筆者は「パワーユーザ」ではないので、チュートリアルとか、出来ないんですよ〜。
 公式HPのチュートリアルは、以下の様に辿ってください。

 チュートリアルや基本的な操作方法などは、公式HPにお任せして、早速、具体的な応用例をご覧に入れたいと思います。ただし、リファレンスを参照しながらの、よちよち歩きなので、広い心でご覧くださいませ。

シュミットトリガ入力のパラメータ計算

 「#8-3 シュミットトリガ入力バッファを設計する」にて、シュミットトリガ入力インバータを、オペアンプLM358を使って設計したのですが、この時の代数計算が中々ハードだったのです。紙とボールペンでゴリゴリと解く(手計算する)羽目になったのですが、実は、3〜4回計算し直しています。

 こんな、繰り返し……。辛かった。
 現役(大学生)を離れて、早幾年……。脳みそも、だいぶくたびれて来ているし、そりゃぁ、計算能力だってガタ落ちですよ。

ar85_sheet.jpg

※見えている面だけでなく、その逆面にも計算してます……。所謂「裏紙」を使っているのですが、印刷面の余白も一部使っている、ということです。

 字は汚いは、これ(↑)では、計算間違う訳です。

 と、言うことで、Mathematica、使いましょ。
 計算手順については、「#8-3 シュミットトリガ入力バッファを設計する」を復習してくださいね。では、ここから、シュミットトリガ入力のパラメータを決定するために手計算した、代数計算を検算してみます。

 まず、シュミットトリガ入力インバータ回路から、キルヒホフとオームの法則で立てた式:

  I3=I1+I2
  Vp=Vo−I1×R1……(1)
  Vp=Vcc−I2×R2……(2)
  Vp=I3×R3……(3)

 これをI3について解くのが、第一ステップでした(I1とI2が未知数)。

 まずは、必要な数式をエントリして準備します。真っ白なノートブックに以下の様に打ち込んで、SHIFT+ENTERキーを打ち込みます。最終的にI3について解きたいので、I2=I3−I1を代入して、I2を消去しておきます。

  i2 = i3 - i1

 Mathematicaでは、単なるENTERキーを押しても、式が改行されるだけで動作しないので、評価(実行)する時は、SHIFT+ENTERキーを押します。

※白紙の段階では、テキスト入力用カーソルは表示されていないのですが、「+」マークに水平線のある場所が、現在の入力位置です。式の入力を始めると、普通にテキスト入力用カーソルが登場しますので、構わず打ち込んでください。

 残りの数式も打ち込むと、以下の様になります。

ar85_math1.png

 薄い字でIn[ ]とか、Out[ ]とか見えていますが、Mathematicaのノートブックは全てこの形式で、入力した式In[ ]に対する出力が、Out[ ]の所に出てくる形式になっています。
 「i1 r1」の様に、空白を空けて変数を並べると、掛け算になります。「i1*r1」の様に演算子を記入してもOKです。vp2を定義したところのOut[ ]に注目していただくと、早速、「i2」が「(-i1 + i3)」に置き換えられていることが解ります。

 計算を続けます。今度は、(1)(2)式を接続してI1について解きます。以下の様に打ち込んで、SHIFT+ENTERです。

  Solve[vp1==vp2, i1]

 Solve[expr, vars]と言う書式で、方程式exprを変数varsについて解きます。

ar85_math2.png

※なお、Mathematicaの予約語は、頭文字が大文字になっているため、ユーザが使用する変数などは、小文字で書くことが多い様です。

 同様に、(1)(3)式を接続して、I1について解きます。

ar85_math3.png

 今計算した2つのI1についての式を接続して、今度はI3について解きます。

ar85_math4.png

 2つのI1の式を手動で結合するの、大変そうに見えますか?分数みたいになっているし。でも、そんなでもありません。I1について解かせたOut[ ]の必要な部分をマウスでなぞって、分数も丸ごと選択し、コピー&ペーストできますので。

※もし、分数部分を手入力する場合には、「(-i3*r3+vo)/r1」の様に、演算子を用いて、C言語に近い記法で入力することも可能です。

 さて、「#8-3 シュミットトリガ入力バッファを設計する」で、手計算して解いた式(以下式)と、結果は一致しました。

  I3=(R2×Vo+R1×Vcc)/(R1×R2+R2×R3+R3×R1)

 ここまでの検算は終了(合格)です。

 本当は、最初に立てた4つの式を全部与えたら、勝手に解いてほしい所だったのですが……。多分、筆者が使いこなせていないせいですね。少し回りくどく、「式の変形」だけをMathematicaにやらせて、解き方は、自分で考えてしまいました……。

※ともあれ、筆者の計算と一致したのは良かったです。苦労が報われた?イヤ?初めからMathematicaを使っていたら、そもそも苦労しなかったのでは??

Vtp,Vtm,ΔVtの式を求める

 「#8-3 シュミットトリガ入力バッファを設計する」の計算は、まだまだ続きます。I3が求まったら、その式を使ってI3hが求まり、そのI3hを使ってVtpが求まるのでしたね?I3hは、I3の式に於いて、VoにVohを代入した式となるので、ここでI3を、引数にVoを引く関数として定義しておきます。

ar85_math5.png

 すぐに、I3lも必要になるので、その時にも使えます。

ar85_math6.png

 ここで一気に、R1=k×R2、R3=j×R2の関係式を使って、自由度を2(jとk)に下げてしまいました。Simplify[ ]は、与えられた式を、最も簡単な式に簡略化します。これも、手計算の結果(以下式)と一致しました。

  Vtp=(Voh+k×Vcc)×j/(k+j+j×k)
  Vtm=(Vol+k×Vcc)×j/(k+j+j×k)
  ΔVt=(Voh−Vol)×j/(k+j+j×k)

パラメータjとkを求める

 いよいよ、大詰め。ここから2元2連立方程式を解きます。ここが、手計算に於いて最も「やり直し」が発生した難所です。

ar85_math7.png

 「難所」とか言ったところで、Mathematicaにとっては一撃でした。
 前節で使用した同じSolve[ ]なのですが、「&&」で区切って、複数の方程式を渡すことで、連立方程式を解かせることができます。「{j,k}」と言う記述はリストと言う形式で、「連立方程式をjとkについて解きなさい」という意味になります。
 手計算した時には、Vol≒0であることを前提としました。Mathematicaの方には、まだVolが残っていますので、Simplify[ ]に「vol==0」の仮定を追加して簡略化させました。ここで使った「%」と言う記号は、直前の「Out[ ]の結果を使う」ことを指定する記号です。

 ここで、jについては、手計算の結果(以下式)と一致しました。

  j=Voh×Vtm/(Voh×Vcc−Voh×Vtm−ΔVt×Vcc)

 kの方はと言うと、手計算ではjを残したままにしておいた(以下式)のに対して、Mathematicaの方は、ちゃんとjを消去してくれているので、直接比較できませんでした。

  k=j×(Voh−ΔVt)/(ΔVt×(1+j)) …… 手計算では、jを残してあった

 そこで、手計算のk式にj式を代入して、検算してみました。

ar85_math8.png

 手計算のk2にj2を代入して、整頓させたところ、さっきMathematicaが解いたkの式と一致しました。kの方も検算合格です。

※見ました?k2式には、分母と分子にj2が居て、j2自体も結構複雑な分数式です。これを代入して、簡略化しようと思いますか?手計算で?……思いません!サクッとやってくれるMathematicaって、すごくないですか?

 必要な計算が終了したら、ノートブックを保存しておくことができます。後で結果を確認したり、計算を追加したり、手直ししたりすることができます。これで、手計算によるイタレーションが大幅に減ることでしょう\(1^−^;)/。使いこなせていない部分は、これから少しづつ使い込んで、マスタして行きたいと思います。

応用問題(課題)

 実際に回路を組んでみて気が付いたのですが、基準に使った抵抗値R2のところ、「オペアンプ出力からのフィードバックパスに入っている、R1を基準に決めた方が良かったかもしれない」、等と思ってしまいました。「#8-3 シュミットトリガ入力バッファを設計する」の「後日のアップデート」で修正した様に、フィードバックパスの抵抗値(R1)を基準に回路定数を変更したいケースが多いと思います。
 手計算だった時には、「計算し直す」なんて、全く選択肢にありませんでしたが、Mathematicaなら、それほど難しいことではないでしょう。
 自由度を2に落とすところで、R2=j×R1、R3=k×R1の様に、R1を基準にとって、抵抗値R1,R2,R3を求める式(すなわちjとk)を計算してみてください。……「応用問題」とか言っておきながら、解答は示しませんので、各位の自主課題と言うことで……。


 Wolframの公式HPなどから、応用例やチュートリアル等のサンプルなどをご覧になっていただくと、Mathematicaのポテンシャルは、こんなものではないことにお気づきになるはずです。その点、筆者の使い道と言えば、「代数計算の代行」だけなので、それこそ「勿体ない」のかもしれません(1^▽^💦)。とは言え、タダ(無料)ですし、動かす環境(Pi ZeroW)にしても、2,000円かそこらで入手出来てしまいます(「#7-2 デザートにラズベリーパイはいかが?」を参照)。どんな使い方にせよ、使った者勝ちですよね。


btn_arduino.png

btn_prev.png btn_next.png

home