LoginSignup
33
27

More than 1 year has passed since last update.

Sympy あれば、心配ない

Last updated at Posted at 2019-11-11

Sympyを用いた演算

Google Colab で使うための準備

# 現在の Google Colab では Sympy 1.1.1 が入っている。
# Sympy 1.1 では後述の「特殊解」が計算できないので、1.3 にアップグレードする。
# !pip install sympy==1.3

#【追記(2022/01/21)】現在の Google Colaboratory では、
# Sympy の 1.7.1 が入っており、そのせいで不具合が起こるようです。
# 次のようにして 1.9 をインストールしてください。
!pip install sympy==1.9
import sympy as sym
from sympy.plotting import plot
sym.init_printing(use_unicode=True)
%matplotlib inline
# Google Colab 使用の場合、SympyによるTeX表示をサポートするために実行する
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?config=default"
    javascript(url=url)
    return sym.printing.latex(exp,**options)

sym.init_printing(use_latex="mathjax",latex_printer=custom_latex_printer)

シンボルの定義

指定した文字をシンボル(変数を表す文字)として扱います。

a = sym.Symbol('a')

まとめて定義したいときは次のように。

a, b, c, x, y = sym.symbols("a b c x y")

指定した文字を関数として扱います。

f = sym.Function('f')
g = sym.Function('g')

簡単な多項式

# 数式は英語で numerial expression または numerical formula
expr = x**2-12*x+8
expr

$$x^{2} - 12 x + 8$$

# 得られた関数を図示
plot(expr, (x, -20, 20))

output_12_0.png

<sympy.plotting.plot.Plot at 0x7faf57ced080>

因数分解する

# 因数分解
expr = x**2 + 2*x + 1
sym.factor(expr)

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

方程式を解く

# 等式は英語で equation または equality
expr = x**2 - 12 * x + 8
eq = sym.Eq(expr, 0)
eq

$$x^{2} - 12 x + 8 = 0$$

# 方程式を解く
sym.solve(eq)

$$\left [ - 2 \sqrt{7} + 6, \quad 2 \sqrt{7} + 6\right ]$$

# 代数を使った式も取り扱える
eq = sym.Eq(a * x ** 2 + b * x + c, 0)
eq

$$a x^{2} + b x + c = 0$$

# xについて解く
sym.solve(eq, x)

$$\left [ \frac{- b + \sqrt{- 4 a c + b^{2}}}{2 a}, \quad - \frac{b + \sqrt{- 4 a c + b^{2}}}{2 a}\right ]$$

# 連立方程式
eq1 = 3 * x + 5 * y - 29
eq2 = x + y - 7

sym.solve([eq1, eq2])

$$ x : 3, y : 4$$

微分

expr = 2 * x ** 2 + 5 * x - 3
expr

$$2 x^{2} + 5 x - 3$$

# 微分
sym.Derivative(expr)

$$\frac{d}{d x} \left(2 x^{2} + 5 x - 3\right)$$

# 微分を計算する
sym.Derivative(expr).doit()

$$4 x + 5$$

# このように書いても同じ
sym.diff(expr)

$$4 x + 5$$

# sym.Eq を使って等式として表記
sym.Eq(sym.Derivative(expr), sym.diff(expr))

$$\frac{d}{d x} \left(2 x^{2} + 5 x - 3\right) = 4 x + 5$$

# 上と同じ意味だが、変数が1つだけなら上のように省略できる。
# 変数が2つ以上の場合は何で微分するか明記しなければいけない
sym.Eq(sym.Derivative(expr, x), sym.diff(expr, x))

$$\frac{d}{d x} \left(2 x^{2} + 5 x - 3\right) = 4 x + 5$$

# 2階微分
sym.Eq(sym.Derivative(expr, x, 2), sym.diff(expr, x, 2))

$$\frac{d^{2}}{d x^{2}} \left(2 x^{2} + 5 x - 3\right) = 4$$

# xについて微分して x=1を代入
sym.diff(expr).subs(x, 1)

$$9$$

# x について微分
expr = a * x ** 2 + b * x * y + c * y ** 2
sym.diff(expr, x)

$$2 a x + b y$$

# xについて微分して x=1を代入
sym.diff(expr, x).subs(x, 1)

$$2 a + b y$$

課題1

以下の微分の公式を、Sympy を使って完成させなさい。
【ヒント】 sin などの関数を Sympy で使うときは sym.sin のように書きます

1-1.

$$\frac{\partial}{\partial x} x^{a} = $$

1-2.

$$\frac{d}{d x} \sin{\left (x \right )} = $$

1-3.

$$\frac{d}{d x} \cos{\left (x \right )} = $$

1-4.

$$\frac{d}{d x} e^{x} = $$

1-5.

$$\frac{\partial}{\partial x} a^{x} = $$

1-6.

$$\frac{d}{d x} \log{\left (x \right )} = $$

1-7.

$$\frac{d}{d x} \sqrt{x} = $$

1-8.

$$\frac{d}{d x} \tan{\left (x \right )} = $$

1-9.

$$\frac{\partial}{\partial x} \sin^{a}{\left (x \right )} = $$

1-10.

$$\frac{\partial}{\partial x} \cos^{a}{\left (x \right )} = $$

1-11.

$$\frac{\partial}{\partial x} \tan^{a}{\left (x \right )} = $$

1-12.

$$\frac{\partial}{\partial x} \log{\left (x \right )}^{a} = $$

1-13.

$$\frac{d}{d x} f{\left (x \right )} g{\left (x \right )} = $$

1-14.

$$\frac{d}{d x} \frac{f{\left (x \right )}}{g{\left (x \right )}} = $$

常微分方程式

$2 f'(x) + 5 f(x) = 0$ を解く

# 常微分方程式
eq = sym.Eq(2 * f(x).diff(x,1) + 5 * f(x), 0)
eq

$$5 f{\left (x \right )} + 2 \frac{d}{d x} f{\left (x \right )} = 0$$

# 一般解
ans = sym.dsolve(eq)
print(ans)
ans
Eq(f(x), C1*exp(-5*x/2))

$$f{\left (x \right )} = C_{1} e^{- \frac{5 x}{2}}$$

# 特殊解
ans = sym.dsolve(eq, ics={f(0):1})
print(ans)
ans
Eq(f(x), exp(-5*x/2))

$$f{\left (x \right )} = e^{- \frac{5 x}{2}}$$

plot(ans.rhs, (x, -10, 10)) # rhs は右辺(Right-hand side)の意味

output_52_0.png

<sympy.plotting.plot.Plot at 0x7faf54dd4320>
# 特殊解で x = 2 のとき
print(ans.subs(x, 2))
ans.subs(x, 2)
Eq(f(2), exp(-5))

$$f{\left (2 \right )} = e^{-5}$$

# evalf というメソッドを使えば浮動小数点まで展開してくれる
ans.subs(x, 2).evalf()

$$f{\left (2 \right )} = 0.00673794699908547$$

課題2

常微分方程式 $f''(x) + f'(x) + 4 f(x) = 0$ について、以下の問いに答えなさい。

  • 一般解を求めなさい。

  • $f(0) = 1$, $f'(0)=1$ のときの特殊解を求めなさい。

【ヒント】 ics={f(0):1, f(_).diff(x,1).subs(_,_):1} と書き _ を適切に埋めれば解けると思います。

  • その特殊解に $x = 2$ を代入したときの値を求めなさい。

積分

# 積分の式
expr  = x ** a
integ = sym.Integral(expr, x)
print(integ)
integ
Integral(x**a, x)

$$\int x^{a}\, dx$$

# 積分の実行
integ.doit()

$$\begin{cases} \frac{x^{a + 1}}{a + 1} & \text{for}: a \neq -1 \\log{\left (x \right )} & \text{otherwise} \end{cases}$$

# このように書いても同じ
sym.integrate(expr, x)

$$\begin{cases} \frac{x^{a + 1}}{a + 1} & \text{for}: a \neq -1 \\log{\left (x \right )} & \text{otherwise} \end{cases}$$

# sym.Eq を使って等式として表記
eq = sym.Eq(sym.Integral(expr, x), sym.integrate(expr, x))
print(eq)
eq
Eq(Integral(x**a, x), Piecewise((x**(a + 1)/(a + 1), Ne(a, -1)), (log(x), True)))

$$\int x^{a}\, dx = \begin{cases} \frac{x^{a + 1}}{a + 1} & \text{for}: a \neq -1 \\log{\left (x \right )} & \text{otherwise} \end{cases}$$

課題3

以下の積分の公式を、Sympy を使って完成させなさい。

3-1.

$$\int \frac{1}{x}\, dx = $$

3-2.

$$\int a^{x}\, dx = $$

3-3.

$$\int e^{x}\, dx = $$

3-4.

$$\int \sin{\left (x \right )}\, dx = $$

3-5.

$$\int \cos{\left (x \right )}\, dx = $$

3-6.

$$\int \tan{\left (x \right )}\, dx = $$

3-7.

$$\int \log{\left (x \right )}\, dx = $$

3-8.

$$\int \frac{1}{\cos^{2}{\left (x \right )}}\, dx = $$

3-9.

$$\int \frac{1}{\sin^{2}{\left (x \right )}}\, dx = $$

3-10.

$$\int \left(- a + x\right)^{b}\, dx = $$

3-11.

$$\int \frac{1}{\sin{\left (x \right )}}\, dx = $$

定積分

expr = (x-a)*(b-x)
eq = sym.factor(sym.Eq(sym.Integral(expr, (x, a, b)), sym.integrate(expr, (x, a, b))))
print(eq)
eq
Eq(-Integral((-a + x)*(-b + x), (x, a, b)), -(a - b)**3/6)

$$- \int_{a}^{b} \left(- a + x\right) \left(- b + x\right)\, dx = - \frac{\left(a - b\right)^{3}}{6}$$

expr = x/(x**2 + 1)
eq = sym.Eq(sym.Integral(expr, (x, 1, 2)), sym.integrate(expr, (x, 1, 2)))
print(eq)
eq
Eq(Integral(x/(x**2 + 1), (x, 1, 2)), -log(2)/2 + log(5)/2)

$$\int_{1}^{2} \frac{x}{x^{2} + 1}\, dx = - \frac{\log{\left (2 \right )}}{2} + \frac{\log{\left (5 \right )}}{2}$$

sym.integrate(expr, (x, 1, 2)).evalf()

$$0.458145365937078$$

課題4

次の定積分の式を Sympy を使って解きなさい。

$$\int_{0}^{1} \frac{4}{x^{2} + 1}\, dx = $$

33
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
27