超多機能電卓としても使えるPython、面倒な計算を手軽に実行

Pythonが普及することでプログラミングが身近になってきた。Pythonプログラミングを利用して数学を学んだり楽しんだりしていこう。

(3)超多機能電卓として使う

数学で計算は欠かせませんが、時に煩わしいものでもあります。そのようなときは、電卓を使ってもよいでしょう。Pythonの数式処理ライブラリである「SymPy」を使うと、因数分解や微分積分、方程式の解の計算などを簡単に行えます。言わば、Pythonが“超多機能電卓”になるのです。

SymPyはAnaconda Distributionに含まれるので、すぐに利用できます。早速、図11の紫で塗りつぶされた領域の面積を求めてみましょう。

図11●前回のリスト10の実行結果
図11●前回のリスト10の実行結果
[画像のクリックで拡大表示]

まず、「y = x2 + 2x - 3」と「y = -x + 1」の交点のx座標を求めます。これは、「-x + 1 = x2 + 2x - 3」の2次方程式を解けばわかりますから、SymPyを使ってリスト11のようなプログラムを作ります。実行すると、「[-4, 1]」と表示され、2つある交点のx座標が-4と1であることがわかりました。

リスト11●2次方程式「-x + 1 = x² + 2x - 3」を解くプログラム
リスト11●2次方程式「-x + 1 = x² + 2x - 3」を解くプログラム
[画像のクリックで拡大表示]

これで図12の定積分で面積がわかるので、リスト12のようなプログラムを作ります。実行結果は「125/6」(6分の125)です。これが紫で塗りつぶされた領域の面積です。

図12●ここで行う定積分
図12●ここで行う定積分
[画像のクリックで拡大表示]
リスト12●定積分のプログラム
リスト12●定積分のプログラム
[画像のクリックで拡大表示]

リスト11とリスト12は最後の1行以外全く同じですから、まとめて解説しましょう。まず、冒頭でSymPyをインポートしたら、「symbols関数」を使って、数式で使う変数を定義しています。

[画像のクリックで拡大表示]

これでxの数式を記述できるようになりました。

次に、このxを使って、「y = x2 + 2x - 3」と「y = -x + 1」の数式を作成しています。

[画像のクリックで拡大表示]

続いて、「-x + 1 = x2 + 2x - 3」の2次方程式を次のように作成しています。

[画像のクリックで拡大表示]

このfを「solve関数」に与えて、解を求めています。

[画像のクリックで拡大表示]

その後、この解(-4と1)と「integrate関数」を使って定積分を行っています。

[画像のクリックで拡大表示]

ちなみに、fに格納した数式は「display関数」を使うと、キレイに表示できます。

[画像のクリックで拡大表示]

コードの実行結果は図13になります。

図13●実行結果。キレイな数式が表示された。なお、数式は自動的に整理されている
図13●実行結果。キレイな数式が表示された。なお、数式は自動的に整理されている
[画像のクリックで拡大表示]

「latex関数」を使うと、図13のキレイな数式のLaTeXのコマンドを表示できます。

[画像のクリックで拡大表示]

実行結果は「- x^{2} -3x + 4」になります。

さらに、「plot関数」を使うと、fに格納した数式のグラフを描画できます。

[画像のクリックで拡大表示]

実行結果は図14です。

図14●実行結果。fに格納した数式のグラフを描画
図14●実行結果。fに格納した数式のグラフを描画
[画像のクリックで拡大表示]

バーゼル問題をSymPyで計算する

SymPyを使う大きなメリットの一つは、分数を分数のまま扱えることです。例えば、素のPythonで10分の1+10分の1+10分の1の計算を行うと、結果は分数にならないだけではなく、誤差も生じてしまいます(print関数のコードの下に実行結果を表示しています)。

[画像のクリックで拡大表示]

一方、10分の1をSymPyの「Rationalクラス」を使って表現すると、計算結果は分数のまま表示されます。誤差もありません。

[画像のクリックで拡大表示]

また、SymPyでは、文字を文字のまま扱う代数学的な計算を行えます。例えば、「オイラーの等式」(図15)を素のPythonで計算すると、次のようになります。

[画像のクリックで拡大表示]
図15●オイラーの等式
図15●オイラーの等式
[画像のクリックで拡大表示]

ちょっとわかりにくいのですが、計算結果は-1の近似値になっています。

では、SymPyだとどうなるでしょうか。

[画像のクリックで拡大表示]

計算結果はキレイに-1になります。これはSymPyが、e(ネイピア数)やi(虚数)、π(円周率)を、sympy.E、sympy.I、sympy.piで代数学的に扱って計算できるからです。素のPythonの方の計算で使っているmath.eやmath.piは、無理数であるeやpiの近似値に過ぎません。近似値を使って数値計算しているので、結果も近似値になってしまうのです。

SymPyでは「sympy.oo」で無限大も扱えます。先ほど、コンピュータでは無限大を扱えないと書きましたが、SymPyだと代数学的に扱えます。

このsympy.ooを使うと、バーゼル問題を代数学的に計算できます。

[画像のクリックで拡大表示]

計算結果はキレイに「pi**2/6」になりました。利用している「summation関数」はΣ(総和)の計算を行う関数です。


以上、3つの視点で、数学を学習する際のプログラミングの活用法を紹介しました。数学とプログラミングを行き来することで相乗効果が生まれ、両方のスキルを高めていくことができるのではないかと思います。

Pocket
LINEで送る