コラム 人と星とともにある数学 数学

Pythonで3次方程式を解く|Pythonで数学を学ぼう! 第35回

代数計算ライブラリSymPyのインポート

SymPyのすごさを一言で言い表すならば「数学の玉手箱」です。SymPyにぎっしり詰まった数学をPythonを通して便利に引き出すことができます。

中学・高校の数学で登場した方程式もSymPyにかかれば簡単に解いてくれます。方程式といっても様々な種類があります。n次方程式と微分方程式をとりあげます。

ライブラリ・モジュールのインポートの方法についてあらためてまとめておきます。

インポートの方法その1|import ライブラリ名

SymPyライブラリをインポートするには
>>>  import sympy
とするのが基本です。SymPyライブラリに含まれる関数を使う場合には
>>>  sympy.func()
のようにします。

インポートの方法その2|import ライブラリ名 as 別名

長い名前のライブラリ名の代わりに別名を使うことができます。sympyの場合symやspがよく使われます。
>>>  import sympy as sym
>>>  sym.func()
>>>  import sympy as sp
>>>  sp.func()
のように使います。ただし短縮名を宣言すると、もとのライブラリ名は使えなくなります。

インポートの方法その3|from ライブラリ名 import func1, func2

ライブラリで定義された指定した関数だけを使う場合にこの方法を使います。sympy.func1()、sympy.func2()はsympy.を付けずにfunc1()、func2()として使うことができます。

インポートの方法その4|from ライブラリ名 import *

ライブラリのすべての関数をライブラリ名を省略して使うことができます。
>>>  from sympy import *
>>>  func1()
>>>  func2()
>>>  func3()
*を使ったインポートは多くの関数を使う場合には便利です。しかし、複数のライブラリをインポートした場合には、関数がどのライブラリのものなのかが分からなくなるので注意が必要です。

sympy.solve()で2次方程式3x²-4x+5=0を解く

2次方程式
3x²-4x+5=0
を解いてみましょう。

>>>  import sympy
>>>  x = sympy.Symbol('x')
>>>  sympy.solve(3*x**2-4*x+5)
[2/3 - sqrt(11)*I/3, 2/3 + sqrt(11)*I/3]

3行目は見た通りです。2次方程式の右辺を0にしたときの左辺をsympy.solve()の引数に渡しています。

2行目がポイントです。xを代数xとして使うための設定です。Pythonでは変数xには文か数を代入できますが代数として使うことはできないのでそのための準備が必要になります。

sympy.Symbol()で定義された変数xをシンボリック変数(Symbolic variable)といいます。ライブラリ名SymPyのSymとはSymbolが由来です。

sympy.init_printing()で解の表示を自然数式表示にする

出力された解は分かりづらいです。sympy.init_printing()関数を実行することで出力をきれいな自然数式表示にすることができます。

>>>  import sympy
>>>  sympy.init_printing()
>>>  x = sympy.Symbol('x')
>>>  sympy.solve(3*x**2-4*x+5)

結果は虚数解なので虚数iがついています。

2次方程式ax²+bx+c=0を解く

SymPyは係数がシンボリック変数であっても解くことができます。
2次方程式
ax²+bx+c=0
を解いてみましょう。

a、b、cもシンボリック変数として定義するだけでOKです。
>>>  import sympy
>>>  sympy.init_printing()
>>>  sympy.var('x a b c')
>>>  sympy.solve(a*x**2+b*x+c, x)

多数の変数をシンボリック変数として定義する場合にはsympy.var()が便利です。最初の2次方程式はシンボリック変数がxだけなのでsympy.solve()には解くべき変数を省略できました。この2次方程式ではシンボリック変数が4つあるのでどの変数について解くかを第2引数に渡します。

結果は2次方程式の解の公式そのものです。

3次方程式ax³+bx²+cs+d=0を解く

では3次方程式はどうでしょうか。
3次方程式
ax³+bx²+cs+d=0
を解いてみます。

シンボリック変数を1つ追加するだけでこれまでと同じです。
>>>  import sympy
>>>  sympy.init_printing()
>>>  sympy.var('x a b c d')
>>>  sympy.solve(a*x**3+b*x**2+c*x+d, x)

ただし、コンソール上で出力すると結果が長すぎて自然数式表示でも分かりづらくなります。そこでJupyer Notebookで解いてみます。

3つの解のうち1番目の解全体を見ることができます。これがカルダノの公式です。

このようにSymPyを使えばたった4行のコードで代数方程式を解くことができます。次回は得られた方程式の解を利用する方法を紹介します。

  • この記事を書いた人
  • 最新記事

桜井進(さくらいすすむ)様

1968年山形県生まれ。 サイエンスナビゲーター®。株式会社sakurAi Science Factory 代表取締役CEO。 (略歴) 東京工業大学理学部数学科卒、同大学大学院院社会理工学研究科博士課程中退。 東京理科大学大学院非常勤講師。 理数教育研究所Rimse「算数・数学の自由研究」中央審査委員。 高校数学教科書「数学活用」(啓林館)著者。 公益財団法人 中央教育研究所 理事。 国土地理院研究評価委員会委員。 2000年にサイエンスナビゲーターを名乗り、数学の驚きと感動を伝える講演活動をスタート。東京工業大学世界文明センターフェローを経て現在に至る。 子どもから大人までを対象とした講演会は年間70回以上。 全国で反響を呼び、テレビ・新聞・雑誌など様々なメディアに出演。 著書に『感動する!数学』『わくわく数の世界の大冒険』『面白くて眠れなくなる数学』など50冊以上。 サイエンスナビゲーターは株式会社sakurAi Science Factoryの登録商標です。

あわせて読みたい

-コラム, 人と星とともにある数学, 数学
-