PythonでSympyを使って色々な微分方程式を解く方法

スポンサーリンク

Pythonで導関数を計算する方法は?今回は、Pythonのsympyというライブラリを使って、微分を遊んでみましょう。

スポンサーリンク

微分って何?

微分は微積分の基本的な道具です。

機械学習における勾配降下法で損失関数を最適化する際に、導関数があればこそ、非常に有効です。

例えば、xに依存する関数y = f(x)があったとして、この関数の微分とは、xの変化に対して関数の値yがどの程度の割合で変化するかということです。

これは決して導関数の基礎についての記事ではありませんし、そうすることもできません。

微分積分は、特別な注意が必要な別物なのです。

あなたは微積分をある程度学んだことがあると思います.この記事は、Sympy ライブラリを使用して関数を微分する方法を示すことを目的としています。

Sympy を使った Python による微分の解法

SymPyは記号数学のためのPythonのライブラリです。

フル機能の計算機代数システム(CAS)を目指しながら、コードはできるだけシンプルに、Cool isn’t itを目指します。

1. PIPを使ったSympyのインストール

SymPyは微分計算以外にも使い道がありますが、今回は微分計算を中心に説明します。

pipパッケージマネージャを使用してインストールするために、pip install sympyを実行します。

2. Sympy の diff() を使って微分を解く

微分のために、sympy は関数の微分を出力する diff メソッドを用意しています。

  • 関数 f(x) = x² があるとします。
  • xに対する関数の微分:f'(x) = 2x

では、sympyを使ってどのように実現できるかを見てみましょう。

#Importing sympy
 
from sympy import *
 
# create a "symbol" called x
x = Symbol('x')
 
#Define function
f = x**2
 
#Calculating Derivative
derivative_f = f.diff(x)
 
derivative_f
from sympy import *
 
# create a "symbol" called x
x = Symbol('x')
 
#Define function
f = x**2
 
f1 = lambdify(x, f)
#passing x=2 to the function
f1(2)

シンボルを宣言することは、関数が変数 ‘x’ を持つこと、または単に関数が x に依存することを言うのと似ています。

3. Pythonで導関数を解く

x = 2 における関数の微分を計算するために、python には lambdify という関数があります。

import sympy as sym
 
#Power rule
x = sym.Symbol('x')
f = x**5
derivative_f = f.diff(x)
derivative_f

出力:4

Python による基本的な微分ルール sympy

微分可能な関数の微分を計算するために、いくつかのルールがあります。

最もよく使われる規則がいくつかあります。

  • べき乗則
  • 積の法則
  • 連鎖の法則
  • 商の法則

それでは、一般的な微分の法則にあるように、実際にsympyを使って微分を計算する方法を考えてみましょう。

1. べき乗則

一般に:f'(xn) = nx(n-1)

例:関数f(x) = x⁵があるとします。

その微分は次のようになる:f'(x) = 5x(5-1) = 5×4

(uv)′ = u′v + uv′
import sympy as sym
#Product Rule
x = sym.Symbol('x')
f = sym.exp(x)*sym.cos(x)
derivative_f = f.diff(x)
derivative_f

2. 積の法則

u(x)とv(x)を微分可能な関数とします。

このとき、関数u(x)v(x)の積もまた微分可能です。

import sympy as sym
#Chain Rule
x = sym.Symbol('x')
f = sym.cos(x**2)
derivative_f = f.diff(x)
derivative_f

例:f(x) = exp(x)⑭*cos(x)

import sympy as sym
 
#Derivatives of multivariable function
 
x , y = sym.symbols('x y')
f = x**4+x*y**4
 
#Differentiating partially w.r.t x
derivative_f = f.diff(x)
derivative_f
import sympy as sym
 
#Derivatives of multivariable function
 
x , y = sym.symbols('x y')
f = x**4+x*y**4
 
#Differentiating partially w.r.t y
derivative_f = f.diff(y)
derivative_f

3. 鎖の法則

連鎖法則とは、関数の合成の微分を計算するものです。

  • 例えば、関数 h(x) = f( g(x) ) があるとします。
  • とすると、連鎖法則では h′(x) = f ′(g(x)) g′(x) となります。
  • 例:f(x) = cos(xxxxxxx*2)

この処理は、商則にも拡張できる。

もうお分かりだと思いますが、関数が変わるだけで、応用は同じで、あとはライブラリ自身がやってくれます。

import sympy as sym
 
#Derivatives of multivariable function
 
x , y = sym.symbols('x y')
f = x**4+x*y**4
 
#Differentiating partially w.r.t x and y
derivative_f = f.diff(x,y)
derivative_f
Output Of The Above Function
Output Of The Above Function

sympy を用いた多変数関数の導関数

上で見た例では変数が1つだけでした。

しかし、私たちは複数の変数を持つ関数に遭遇することがよくあります。

このような導関数は一般に偏導関数と呼ばれます。

多変数関数の偏微分とは,1つの変数に関して,他のすべての変数を一定にした微分のことです.

例: f(x,y) = x4 + x * y4

上記の導関数をPythonでxについて偏微分してみましょう.

Power Rule Output
Power Rule Output
Product Rule Output solve derivatives in Python
Product Rule Output

変数の数が 1 以上あるときは,symbols を使用します.

Chain Rule Output
Chain Rule Output
Partial Differentiation W R T X solve derivatives in Python
Partial Differentiation w.r.t X

コードは全く同じですが、今度は y が diff メソッドの入力引数として渡されます。

まずxを部分微分し、次にyを部分微分することができます

Partial Differentiation W R T Y
Partial Differentiation w.r.t Y
Partial Differentiation W R T X And Y solve derivatives in Python
Partial Differentiation w.r.t X And Y

まとめ

この記事では、微分やPythonで微分を解く方法についてではなく、Pythonのパッケージを活用して関数の微分を実行する方法について説明しました。

微分は素晴らしいもので、機械学習やそれ以外の分野でも重要な役割を果たすので、その背後にある考え方をぜひ知っておいてください。

タイトルとURLをコピーしました