完全微分方程式#

全微分 とは多変数関数の各変数の微小変化を表現したものである.2変数関数 \(f(x,y)\) の全微分 \(df\) は偏微分を用いて

\[ df = \frac{\partial f}{\partial x} dx + \frac{\partial f}{\partial y} dy \]

と書けることを思い出してほしい.ここで,全微分の形式の形の微分方程式,

\[ p(x,y)dx+q(x,y)dy = 0 \]

全微分方程式 という.ここで,\(p(x,y),q(x,y)\)\(x,y\)の関数である.そして,全微分方程式の中でも\(p(x,y),q(x,y)\)が,

\[ \frac{\partial f}{\partial x} = p(x,y), \frac{\partial f}{\partial y} = q(x,y) \]

となるとき,つまり,ある関数 \(f(x,y)\)\(x,y\)のそれぞれの偏導関数となっているとき,以下の微分方程式

\[ p(x,y)dx + q(x,y)dy = 0 \]

完全微分方程式 と呼ばれる.

完全微分方程式の解法#

完全微分方程式の一般解の導出は関数 \(f(x,y)\) を求めることである.このとき,上記の関数 \(f(x,y)\) の全微分式の定義より,

\[ df = p(x,y)dx + q(x,y)dy = 0 \]

であり,未知関数 \(f(x,y)\) は微分したら 0 となるので定数であることがわかる.つまり一般解は,

\[ f(x,y)=C \]

となる.ただし,\(C\)は定数とする.

では,微分方程式 \(p(x,y)dx + q(x,y)dy = 0\) を与えられ,未知関数 \(f(x,y)\) をどのように求めればいいかを以降で説明する.

まず与えられた微分方程式が完全形であることを確認する.完全微分方程式であるための必要十分条件は

\[ \frac{\partial p(x,y)}{\partial y} = \frac{\partial q(x,y)}{\partial x} \]

である.続いて,\(p(x,y)\)\(x\)について積分すると

\[ f(x,y) = \int p(x,y) dx + \phi(y) = C \]

未知関数 \(f(x,y)\) の一般解を求めることができるが,\(y\)を含むので\(y\)に関する未知の項 \(\phi(y)\) が生ずる.ただし,この項は上記の\(f(x,y)\)\(y\)について偏微分すると

\[ \frac{\partial f(x,y)}{\partial y} = \frac{\partial}{\partial y} \left\{ \int p(x,y) dx \right \} + \frac{d}{dy}\phi(y) = q(x,y) \]

となり,\(\phi(y)\) の微分を元の\(p(x,y),q(x,y)\)の項から関数\(f(x,y)\)求めることができる.同一の手順で \(x\) に関する偏微分を考えても良い.このようにして,偏微分を含む微分方程式であるが解くことができる.

完全微分方程式の具体例#

次の微分方程式を解いてみよう.

\[ \left ( 2x + 3y \right )dx + \left ( 3x + 8y \right )dy = 0 \]

解答はクリックで確認できる.

まずは与えられた微分方程式が完全微分方程式であるかを確かめる.\(p(x,y)=2x+3y, q(x,y)=3x+8y\) として\(y\)\(x\)に関する偏微分をそれぞれ求めると,

\[ \begin{aligned} \frac{\partial p(x,y)}{\partial y} = 3, \quad \frac{\partial q(x,y)}{\partial x} = 3 \end{aligned} \]

となり,\(\frac{\partial p(x,y)}{\partial y} = \frac{\partial q(x,y)}{\partial x}\) であるため完全微分方程式である.

\(p(x,y)\)\(x\) について積分すると,

\[\begin{split} \begin{aligned} f(x,y) &= \int p(x,y) dx + \phi(y) \\ &= \int \left( 2x + 3y \right) dx + \phi(y) \\ &= x^2 + 3xy + \phi(y) \end{aligned} \end{split}\]

となる.続いて,上記の \(f(x,y)\)\(y\) について偏微分すると,

\[\begin{split} \begin{aligned} \frac{\partial f(x,y)}{\partial y} &= \frac{\partial}{\partial y} \left( x^2 + 3xy + \phi(y) \right ) \\ &= 3x + \frac{d}{dy}\phi(y) = q(x,y) \end{aligned} \end{split}\]

したがって,\(\frac{d}{dy}\phi(y)=8y\) とわかる.これを \(y\) について積分すると,

\[\begin{split} \begin{aligned} \int \frac{d}{dy}\phi(y) &= \int 8y dy \\ \phi(y) &= 4y^2 \end{aligned} \end{split}\]

したがって,任意定数 \(C\) を用いて \(f(x,y)=C\) を考慮し,以下の一般解が得られる.

\[ \begin{aligned} f(x,y) = x^2 + 3xy + 4y^2 = C \end{aligned} \]

Pythonによる実装#

では,sympyを使って完全微分方程式を解く.ただし,このような微分方程式の形式はこれまでの微分方程式のように解くことができないため,上記の解法のステップを順番に追っていく. まずはライブラリのインポートと変数と\(p(x,y),q(x,y)\)を定義する.

from sympy import symbols, dsolve, integrate, diff

# 変数の定義
x = symbols('x')
y = symbols('y')

# p(x,y) , q(x,y)の定義
p = 2*x + 3*y
q = 3*x + 8*y

完全微分方程式であるための条件を確認する.これまでは Derivative関数を使って導関数を定義していたが,今回はdiff関数で導関数を計算する.diffは第一引数に微分する式を,第二引数に微分する変数を与える.

diff(p, y)
\[\displaystyle 3\]
diff(q, x)
\[\displaystyle 3\]

となり,完全形であることがわかった.続いて,\(p(x,y)\)\(x\) で積分してみる.積分はintegrate関数で実行できた.

F_x = integrate(p, x)
F_x
\[\displaystyle x^{2} + 3 x y\]

\(\phi(y)\) については,

\[ \begin{aligned} \frac{d}{dy}\phi(y) = q(x,y) - \frac{\partial f(x,y)}{\partial y} \end{aligned} \]

であるので,以下を計算する.

d_phi = q - diff(F_x, y)
d_phi
\[\displaystyle 8 y\]

これを \(y\) について積分する.

phi = integrate(d_phi, y)
phi
\[\displaystyle 4 y^{2}\]

従って,未知関数 \(f(x,y)\) は以下となる.

F = F_x + phi
F
\[\displaystyle x^{2} + 3 x y + 4 y^{2}\]

となり,一般解を導出できた.\(C=0\)としてプロットしてみると以下のようになる.多変数関数なので plot3d を利用する.

from sympy.plotting import plot3d
plot3d(F, (x, -5, 5), (y, -5, 5))
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.
../../_images/5303b68c33f205d59dbc3ddd2f3d19c81bbb16ba18e2051fb4d76f19d528caf5.png
<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x10edcad00>