微分方程式#
微分方程式とは?#
微分方程式とは,変数 \(x\) と変数 \(x\) を持つ未知関数 \(y\) とその導関数を含む方程式である.例えば,以下のように,
という等式が与えられ,この等式は左辺の独立変数 \(x\) を持つ関数 \(y(x)\) の微分 \(\frac{dy}{dx}\) が右辺の変数 \(x,y\) を持つ関数 \(f(x,y)\) を持つ関数が等しいことを意味し,これまで学んだ \(x=1\) といった解が得られる方程式とは異なり,この等式を満たす関数 \(y(x)\) を求めることが微分方程式を解くということである.
微分方程式の形#
微分方程式は大まかに,
関数と導関数が線形性を持つか?
独立変数の数は2つ以上か? に応じて分類することができる.
線形微分方程式#
まず一つ目の「関数と導関数が線形性を持つか?」について,微分方程式を
と定義する.ここで\(y'=\frac{dy}{dx}\)であり,実定数 \(\alpha,\beta\)に対して,
が成立すれば微分方程式が線形であり,その微分方程式を線形微分方程式と呼ぶ.成立しない微分方程式は非線形微分方程式と呼ばれる.非線形微分方程式は簡単にいうと\(y^2\)や\(yy'\)といった非線形項を含む微分方程式と言える.
線形微分方程式の具体例#
以下の微分方程式が線形であることを確かめる.
解答はクリックで確認できる.
前述の線形性の定義を満たすことを確認すればよいので微分方程式を次のように定義する.
上式の左辺について,
となる.続いて,右辺について確認する.
以上より,\(y,y'\)の項について両辺が一致するので \(y\) について線形であり,これは線形微分方程式である.
非線形微分方程式の具体例#
以下の微分方程式が非線形であることを確かめる.
解答はクリックで確認できる.
前述の線形性の定義を満たすことを確認すればよいので微分方程式を次のように定義する.
上式の左辺について,
となる.続いて,右辺について確認する.
以上より,両辺の係数が一致しない.従って,\(y\) について非線形であり,これは非線形微分方程式である.
常微分方程式#
続いて,二つ目の「独立変数の数は2つ以上か?」について,一つの独立変数を持つ微分方程式を 常微分方程式(Ordinary Differential Equations, ODEs) と呼び,以下の形で与えられる.
このとき,復習であるが\(y^{(n)}\)は\(n\)階の導関数であり,微分方程式に含まれる導関数の最大の次数 \(n\) を微分方程式の階数と呼ぶ.上記の式には一つの独立変数 \(x\) と関数\(y(x)\),またその導関数 \(\{y',...y^{n}\}\)が含まれている.
偏微分方程式#
常微分方程式とは異なり,二つ以上の独立変数を持つ微分方程式を 偏微分方程式(Partial Differential Equations, PDEs) と呼ぶ.偏微分方程式は関数の偏微分に関する等式であり,以下で与えられる.
ここで,\(F\)はある関数,\(x_1, x_2, ..., x_n\)は\(n\)個の独立変数,関数\(u\)は求める未知関数を表す.また,\(\frac{\partial u}{\partial x_i}\)は\(u\)の\(x_i\)に対する一階の偏微分を表し,\(n\)階の偏微分を含む.常微分方程式とは異なり,複数個の独立変数とその偏導関数が含まれていることを確認されたい.
微分方程式の例#
具体例から微分方程式を理解しよう.関数 \(f(x,y)\) が \(f(x,y)=x\) であるときを考える.この関数は一階の常微分方程式として分類される.
この微分方程式は,関数 \(y(x)\) の導関数が関数 \(x\) と等しいことを意味する.初めは,慣れないが,微分したら \(x\) となるような関数を求めることがゴールであり,このような関数は容易に暗算で計算できる.
このとき,\(C\)は積分定数であり,上記の関数 \(y(x)\) を微分 \(\frac{dy}{dx}\) すると \(x\)となることがわかるかと思う.この解は任意の定数 \(C\) に対する解の集合を表しており,これを一般解と呼ぶ.
では上記の微分方程式をsympyで解いてみる.まずは必要なライブラリをimport
する.
from sympy import symbols, Eq, Derivative, Function, dsolve
変数 x
と関数 y(x)
を定義する.
x = symbols('x')
y = Function('y')(x)
y
y(x)
を x
で微分した \(dy/dx\) を作成する.
dy = Derivative(y, x)
dy
Eq
を使って方程式を定義する.
eq = Eq(dy, x)
eq
dsolve
関数を使って未知関数 y(x)
を求める.
y_ = dsolve(eq, y)
y_
手計算の結果と一致することを確認されたい.
一般解と特殊解#
改めて前述の話をまとめる.微分方程式は解として未知関数を持つ方程式であり,上記のように,積分定数を含む形で解の集合を表す形式を一般解と言った.ここでの解の集合は任意の定数 \(C\) は微分して消えるのでどのような値が入っていもいいと考えると,導出した解は,例えば,\(y(x) = x^2/2\), \(y(x) = x^2/2 + 1\) などさまざまな関数を解として持つことがわかる.つまり,一般解はパラメータ \(C\) を持つ関数の集合なのである.
では,これをsympyを使ってプロットしてみよう.
from sympy import plotting
plotting.plot(
y_.rhs.subs(symbols('C1'), -3),
y_.rhs.subs(symbols('C1'), -2),
y_.rhs.subs(symbols('C1'), -1),
y_.rhs.subs(symbols('C1'), 0),
y_.rhs.subs(symbols('C1'), 1),
y_.rhs.subs(symbols('C1'), 2),
y_.rhs.subs(symbols('C1'), 3), (x, -2, 2))
Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.
Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.

<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x10fdfa970>
上記のように,積分定数 C1
に値を入力してみると,複数の解の候補がプロットできる.これが一般解であり,解の集合(=関数の集合)ということである.これを解空間といったりする.
そして,第一回の講義で紹介したように,問題によっては解に条件が課される場合がある.その条件を 初期条件 と呼び,初期条件に基づいて上記の集合からある特定の解(関数)を求めることができる.このときの解を 特殊解 という.
前述の例に初期条件を付加すると,
となる.これはつまり,\(x=0\) のときの未知関数 \(y\) の値は \(1\) であるという初期条件である.一般解が以下であったので,
この一般解に \(y(0) = 1\) を代入する.
となり,積分定数 \(C\) は \(1\) であり,特殊解は
である.
sympyのdsolve
に初期条件を与えて特殊解を計算するためには,ics
というキーワード引数で辞書形式で初期条件を与えれば良い.
y_ = dsolve(eq, y, ics={y.subs(x,0): 1})
y_
これをプロットすると以下となる.
plotting.plot(y_.rhs, (x, -2, 2))

<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x1116e85b0>
境界条件
微分方程式をある区間 \([x_{\alpha}, x_{\beta}]\) で考えるとき,区間の両端 \(x=x_\alpha\),\(x=x_\beta\) における解がみたす条件,つまり,\(y(x_\alpha)\) と \(y(x_\beta)\) を 境界条件 とよぶ.そして,この条件をみたす解を求める問題を 境界値問題 という.
微分方程式の解の確認#
得られた解がその微分方程式の解であることを確認するには,これまでの方程式と同様に,等式を満たすことを確認すればよい.
ここまでで,微分方程式
の一般解が
であることが計算できた.実際にこの関数が微分方程式を満たすか確認してみよう.
得られた一般解を微分する.
これは与えられた微分方程式に代入しても明らかであるように等式を満たす.よって微分方程式の解である.
解空間
この確認からも明らかなように,\(y(x) = x^2/2\), \(y(x) = x^2/2 + 1\) などさまざまな関数を解として方程式を満たすことがわかる.これを解の集合(解空間)といった.
具体例#
\(y=e^{-x}\)は以下の微分方程式の解であることを確認する.
解答はクリックで確認できる.
まず解として与えられた \(y\) を微分する.
これと \(y=e^{-x}\) を与えられた微分方程式に代入する.
この式からも明らかなように等式を満たす.従って,\(y=e^{-x}\)は与えられた微分方程式の解である.
補足:カラーマップ#
Sympyでの解のプロットにあたり,各解のカラーはSympyのplotting(=Matplotlib)のデフォルト値になっている.プロットする際に次のようにカラーマップを取得して,色を指定すると見栄えの良いグラフを描くことができる.
import numpy as np
from sympy import plotting
import matplotlib.pyplot as plt
y_ = dsolve(eq, y) # 一般解の計算
N = 7 # -3 から 3 までの計7本のグラフを書くのでN=7
eqs = []
for c in np.linspace(-3, 3, N):
eqs.append(y_.rhs.subs(symbols('C1'), c))
p = plotting.plot(*eqs, (x, -2, 2), show=False)
cm = plt.get_cmap('magma', N) # magmaカラーマップを使用
for i in range(cm.N):
p[i].line_color = cm(i)
p.show()

他のカラーマップはリファレンス等で確認できる.