2. 計算はPythonにさせてしまおう

Pythonを用いて計算問題をときながら、「Python 勘」を取り戻していきましょう。

今回は、数学や物理を学ぶときにも「Pythonは便利だな」と思わず感じてしまう SymPy と代数計算を紹介します。

2.1. SymPyとは

SymPy は、Mathematica や Maple の代替を目指して開発が進められている Python の代数計算ライブラリです。

初歩的な数学の問題を解くときに重宝します。

2.1.1. 準備

最初に、SymPy のモジュールをインポートします。

[1]:
from sympy import *

Colab上では、数式をmathjax で表示できるように設定しておくとよいでしょう。

def custom_latex_printer(exp,**options):
    from google.colab.output._publish import javascript
    url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js"
    javascript(url=url)
    return printing.latex(exp,**options)
init_printing(use_latex="mathjax",latex_printer=custom_latex_printer)

2.2. 代数計算とは

代数操作とは、数式を数値として計算することなく、シンボル(代数)の操作として計算することです。

数値計算(従来)

[2]:
x = 1
y = 2
x + y + y + x + x
[2]:
7

代数計算では、変数はシンボルであると宣言します。 すると、変数に数値を代入することなく、シンボルのまま計算されます。

代数計算(SymPy)

[3]:
x = Symbol('x')
y = Symbol('y')

x + y + y + x + x
[3]:
$\displaystyle 3 x + 2 y$

xyも代数式なので、代入されたzも代数式となります。

[4]:
z = x + y + y + x + x
z
[4]:
$\displaystyle 3 x + 2 y$

また、代数式に対するPythonの演算は、代数操作となります。

[5]:
z ** 2
[5]:
$\displaystyle \left(3 x + 2 y\right)^{2}$

2.2.1. 関数や定数

三角関数、 𝜋 などは、SymPyからインポートされたものを用います。

[6]:
sin(pi/3)
[6]:
$\displaystyle \frac{\sqrt{3}}{2}$

2.2.2. 数値解の求め方

数値解を求めたいときは、float()を用います。

[7]:
float(sin(pi/3))
[7]:
0.8660254037844386

例題(代数式)

次の式を書いてみよう

  1. \(\sin{x}+\cos{y}\)

  2. \(e^{x}\)

  3. \(\frac{x+xy}{x}\)

[8]:
sin(x)+cos(y)
[8]:
$\displaystyle \sin{\left(x \right)} + \cos{\left(y \right)}$
[9]:
E**x
[9]:
$\displaystyle e^{x}$
[10]:
(x+x*y)/x
[10]:
$\displaystyle \frac{x y + x}{x}$

2.3. 基本的な代数操作

数学でおなじみの代数操作(式の変形)を使ってみましょう。

  1. 展開 (expand)

  2. 因数分解(factor)

  3. 簡易化 (symplify)

  4. 代入 (substitution)

Pythonは英語

Pythonの関数名やメソッド名は、英語か英語の省略した名称になっています。 英語に強いと意味はすぐにわかりますが、英語だと認識しないとアルファベット列です。 関数を覚えるときは、(辞書で意味を調べて)英単語も同時に覚えるようにしましょう。

準備

x, y, z をシンボルとします。

[11]:
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')

2.3.1. 式の展開

式を展開するときは、expand()を用います。

例. \((x+y)^3\)の展開

[12]:
(x+y)**3
[12]:
$\displaystyle \left(x + y\right)^{3}$
[13]:
expand((x+y)**3)
[13]:
$\displaystyle x^{3} + 3 x^{2} y + 3 x y^{2} + y^{3}$

三角関数が含まれるときは、trig=Trueを追加します。

. \(cos(x+y)\)

[14]:
expand(cos(x + y), trig=True)
[14]:
$\displaystyle - \sin{\left(x \right)} \sin{\left(y \right)} + \cos{\left(x \right)} \cos{\left(y \right)}$

部分分数への展開はapart()を用います。

例. \(\frac{1}{x(x+1)}\)

[15]:
1/(x*(x+1))
[15]:
$\displaystyle \frac{1}{x \left(x + 1\right)}$
[16]:
apart(1/(x*(x+1)))
[16]:
$\displaystyle - \frac{1}{x + 1} + \frac{1}{x}$

2.3.2. 因数分解

式を因数分解するときは、factor()を用います。

例. (受験でお馴染みの)\(x^3+y^3+z^3 - 3xyz\)の因数分解

[17]:
x**3 + y**3 + z**3 - 3*x*y*z
[17]:
$\displaystyle x^{3} - 3 x y z + y^{3} + z^{3}$
[18]:
factor(x**3+y**3+z**3-3*x*y*z)
[18]:
$\displaystyle \left(x + y + z\right) \left(x^{2} - x y - x z + y^{2} - y z + z^{2}\right)$

2.3.3. 式の簡略化

式を簡易化するときはsimplify()を用います。

例. \(\frac{x+xy}{x}\) の簡略化

[19]:
simplify((x + x*y)/x)
[19]:
$\displaystyle y + 1$

三角関数を含む式を簡略化したいときは、trigsimp() を用います。

例. \(\cos^2{x}-\sin^2{x}\)

[20]:
trigsimp(cos(x)**2 - sin(x)**2)
[20]:
$\displaystyle \cos{\left(2 x \right)}$

2.3.4. 式の代入

式への代入は、subs()メソッドを用います。

例. \(x^3+y^3+z^3-3xyz\)\(z\)に1を代入する

[21]:
(x**3+y**3+z**3-3*x*y*z).subs(z, 1)
[21]:
$\displaystyle x^{3} - 3 x y + y^{3} + 1$

2.4. 方程式の解法

solve()を用いると、方程式の解を求めることができる。

例. \(x^4=1\)のxの解

[22]:
solve(x**4-1, x)
[22]:
[-1, 1, -I, I]

連立方程式は、リストで与えます。

例. 連立方程式 𝑥+5𝑦=2,−3𝑥+6𝑦=15 の解

[23]:
solve([x+5*y-2, -3*x+6*y-15], [x,y])
[23]:
{x: -3, y: 1}

2.5. 初等解析

2.5.1. 極限

極限は、limit()を用いて求めることができます。

例. \(\lim_{x \to 0} x^x\)

[24]:
limit(x**x, x, 0)
[24]:
$\displaystyle 1$

無限大は、ooと書きます。

例. \(\lim_{x \to \infty} \frac{1}{x}\)

[25]:
limit(1/x, x, oo)
[25]:
$\displaystyle 0$

2.5.2. 微分

微分は、diff()を用います。

例. :math:`frac{x}{dx}sin{x}`

[26]:
diff(sin(x), x)
[26]:
$\displaystyle \cos{\left(x \right)}$

2.5.3. 積分

積分は、integrate(関数, 変数)によって、初等関数, 特殊関数の積分が可能です。

\(\int \log x ~dx\)

[27]:
integrate(log(x), x)
[27]:
$\displaystyle x \log{\left(x \right)} - x$

\(\int_{-\infty}^\infty e^{-x^2} dx\)

[28]:
integrate(exp(-x**2), (x, -oo, oo))
[28]:
$\displaystyle \sqrt{\pi}$

2.6. コースワーク

Pythonの習得で重要なのは、習ったことを覚えてプログラミングすることではありません。 「こういうことはできるかな?」と調べて、ソースコードを参考にプログラミングすることです。 ぜひ、解いてみましょう。

演習(数式)

  1. \(\int_{-\infty}^\infty \sin{x^2} dx\) を求めよ

  2. \(\int_{0}^\infty (\sqrt{x^2+1}-1)^2 dx\) を求めよ

  3. \(f(x)=\frac{4x^2+2x+1}{x^2+1}\)の極値を求めよ

  4. 大学入試の過去問からSymPyで解ける問題を探して解いてみよう

ヒント

色々な解き方があります。

  1. SymPyを使っても解いてみましょう。

  2. どうしても解けなければ、手で解いても構いません