# 代数計算: SymPy

SymPy は、Mathematica や Maple の代替を目指して開発が進められている Python の代数計算ライブラリです。初歩的な数学の問題を解くときに重宝します。


## 準備

必要なモジュールをインポートします。


```
from sympy import *
```

Google Colabratory では、数式を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)

```

## 代数計算とは

代数操作とは、数式を数値として計算することなく、シンボル(代数)の操作として計算することです。
変数などのシンボルは数値として評価されず、シンボルのまま計算されます。
計算結果は、 代数式のまま得られます。

通常のPythonの変数と区別するため、
変数は数値ではなく、Symbolを与えて初期化します。




```
x = Symbol('x')
y = Symbol('y')

x + y + y + x + x
```








$$3 x + 2 y$$



注意：これ以降は、変数$x,y$はシンボルで初期化されているものとします。

## 代数式

Symbol が含まれた式を代数式と呼ぶことにします。


```
x = Symbol('x')
y = Symbol('y')

z = x + y + y + x + x
z
```








$$3 x + 2 y$$



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

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


```
z ** 2
```








$$\left(3 x + 2 y\right)^{2}$$




```

```

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

例. $\sin{\frac{\pi}{3}}$


```
sin(pi/3)
```








$$\frac{\sqrt{3}}{2}$$



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

例. $\sin{\frac{\pi}{3}}$


```
float(sin(pi/3))
```








$$0.8660254037844386$$



## 練習

次の式を書いてみよう



1.   $\sin{x}+\cos{y}$
2.   $e^{x}$
3.   $\frac{x+xy}{x}$




# 代数式の基本操作

数学でおなじみの基本操作をマスターしましょう。

1.   展開 (expand)
2.   因数分解(factor)
3.   簡易化 (symplify)
4.   代入 (substitution)



## 式の展開

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

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



```
expand((x+y)**3)
```








$$x^{3} + 3 x^{2} y + 3 x y^{2} + y^{3}$$



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

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


```
apart(1/(x*(x+1)))
```








$$- \frac{1}{x + 1} + \frac{1}{x}$$



## 因数分解

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

例. $x^3+y^3+z^3 - 3xyz$の因数分解



```
z = Symbol('z')

factor(x**3+y**3+z**3-3*x*y*z)
```








$$\left(x + y + z\right) \left(x^{2} - x y - x z + y^{2} - y z + z^{2}\right)$$



## 式の簡略化

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

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



```
simplify((x + x*y) / x)
```








$$y + 1$$



三角関数を含むときは、trigsimp() を用います。

例. $\cos^2{x}-\sin^2{x}$



```
trigsimp(cos(x)**2 - sin(x)**2)
```








$$\cos{\left (2 x \right )}$$



## 式の代入

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


例. $x^3+y^3+z^3-3xyz$ の $z=1$のとき


```
(x**3+y**3+z**3-3*x*y*z).subs(z, 1)
```








$$x^{3} - 3 x y + y^{3} + 1$$



# 方程式の解法

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

例. $x^4=1$のxの解


```
solve(x**4-1, x)
```








$$\left [ -1, \quad 1, \quad - i, \quad i\right ]$$



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

例. 連立方程式 $x + 5y = 2, -3x + 6y = 15$の解を求める


```
solve([x+5*y-2, -3*x+6*y-15], [x,y])
```








$$\left \{ x : -3, \quad y : 1\right \}$$



# 微積分

SymPyを使えば、微積分もお手のものです。

## 極限

極限は、limit()を用いて求めます。


例. $\lim_{x \to 0} x^x$


```
limit(x**x, x, 0)
```








$$1$$



無限大は、ooです。

例. $\lim_{x \to \infty} x^x$


```
limit(1/x, x, oo)
```








$$0$$



## 微分

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

例. $\frac{x}{dx}\sin{x}$


```
diff(sin(x), x)
```








$$\cos{\left (x \right )}$$



## 積分

初等関数, 特殊関数の有限無限区間での積分ができます。

例. $\int \log{x} dx$



```
integrate(log(x), x)
```








$$x \log{\left (x \right )} - x$$



例. 例. $\int_{-\infty}^\infty  e^{-x^2} dx$


```
integrate(exp(-x**2), (x, -oo, oo))
```








$$\sqrt{\pi}$$



### 練習

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



# 総合問題

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

68ae7edc1e3fd1e24ea7945d93e608e92b92e5a7
ipynb
Jupyter Notebook
template/sympy.ipynb
KuramitsuLab/inaba
c36e098557fc5f3f382604be357e918dc8978058
MIT
template/sympy.ipynb
KuramitsuLab/inaba
c36e098557fc5f3f382604be357e918dc8978058
MIT
template/sympy.ipynb
KuramitsuLab/inaba
c36e098557fc5f3f382604be357e918dc8978058
MIT
Qwen/Qwen-72B
1. YES
2. YES