変数分離法
例題
$$ \frac{dy}{dx} = – 2 x\, y $$
解くべき方程式を,変数 eq
に代入します。diff()
はMaxima で微分を行う関数ですが,微分方程式を定義するときは '
で始まるのが大事です。
'diff(y, x)
ではなく,diff(y, x)
と '
を最初につけるのを忘れるとどうなるかというと…
diff(y, x);
/* 解くべき方程式を,変数 eq に代入。*/
eq: 'diff(y, x) = -2*x*y;
/* 微分方程式を解く関数は ode2() 。*/
ode2(eq, y, x);
上記の答えの %c
は積分定数 $C$ を表します。
マルサスの人口モデル
$$\frac{dN}{dt} = \gamma \, N$$
を初期条件 $t = t_0$ で $N(t_0) = N_0$ として解く。
eq2: 'diff(N, t) = gamma * N;
ode2(eq2, N, t);
/* 1階微分方程式の初期条件 */
ic1(%, t = t0, N = N0);
参考:米国の人口とマルサスモデル
上記によれば,1790年から1930年のアメリカの人口は以下のようになっている(人口の単位は百万人)。
usa: [
/* 西暦, 人口(百万人)*/
[1790, 3.9],
[1800, 5.3],
[1810, 7.2],
[1820, 9.6],
[1830, 12.9],
[1840, 17.1],
[1850, 23.2],
[1860, 31.4],
[1870, 38.6],
[1880, 50.2],
[1890, 62.9],
[1900, 76.0],
[1910, 92.0],
[1920,106.5],
[1930,123.2]
]$
$t_0 = 1790$ (年)とすると,$N_0 = 3.9$ 。したがって,マルサスの人口モデルを $N_m(t)$ とすると
t0: usa[1][1]; /* 1行目の1列目 */
N0: usa[1][2]; /* 1行目の2列目 */
kill(t, gamma)$
Nm(t) := N0 * exp(gamma1*(t-t0));
残りのパラメーター $\gamma_1$ は,別の時刻 $t_1$ における $N_1 = N_m(t_1)$ から求める。
\begin{eqnarray}
N_1 &=& N_0 e^{\gamma_1 (t_1 – t_0)} \\
\log \frac{N_1}{N_0} &=& \gamma_1 (t_1 – t_0) \\
\therefore\ \ \gamma_1 &=& \frac{1}{t_1 – t_0} \log \frac{N_1}{N_0}
\end{eqnarray}
たとえば,$t_1 = 1830$ とすると…
t1: usa[5][1]; /* 5行目の1列目 */
N1: usa[5][2]; /* 5行目の2列目 */
gamma1: 1/(t1-t0) * log(N1/N0);
このようにして求められた $N(t)$ を,人口データ usa
と共グラフにしてみます。
Maxima でグラフを作成する関数として plot2d()
などのいわゆる plot 系と,draw2d()
などのいわゆる draw 系があります。パラメータ設定等の書式が異なりますので,それぞれの例をあげておきます。
/* plot2d() によるグラフ */
plot2d([[discrete, usa], Nm(t)], [t, 1790, 1940],
[style, [points, 1.5], lines],
[legend, "アメリカの人口", "マルサスモデル"],
[xlabel, "年"], [ylabel, "人口(単位:百万人)"])$
/* draw2d() によるグラフ */
draw2d(
color = "red",
key = "マルサスモデル",
explicit(Nm(t), t, 1790, 1940),
color = "blue",
point_type = 7,
point_size = 0.7,
key = "アメリカの人口",
points(usa),
xlabel = "年", ylabel = "人口(単位:百万人)",
yrange = [-20, 410], xaxis = true
)$
ヴェアフルストによる修正人口モデル
$$
\frac{dN}{dt} = \gamma N \left(1 – \frac{N}{N_{\rm max}}\right)
$$
/* 念のため,変数を初期化 */
kill(N, t, Nmax, N0, t0)$
eq3: 'diff(N, t) = gamma2 * N * (1 - N/Nmax);
ans: ode2(eq3, N, t);
どうやら,Maxima はちゃんと $N= \dots$ のように解いてはくれないようです。あとは人間の手で整理していくことになります。
上式 ans
の両辺に $\gamma_2$ をかけた式を ans2
とし,
ans2: gamma2 * ans;
両辺の exponential をとった式を ans3
とする。lhs()
は左辺(left-hand-side),rhs()
は右辺(right-hand-side)をとる関数。
ans3: exp(lhs(ans2)) = exp(rhs(ans2));
この ans3
式を N
について解く。方程式を解くのは solve()
関数。
sol: solve(ans3, N);
最後に初期条件,$t = t_0$ で $N = N_0$ を入れる。(一般に solve()
の解は複数かも知れないのでリスト形式 [... ]
で出力される。1個目をとるのが sol[1]
。)
sol1: ic1(sol[1], t = t0, N = N0);
define(Nv(t), rhs(sol1));
参考:米国の人口とヴェアフルストモデル
初期条件を $t_0 = 1790$(年)のとき $N(t_0) = N_0 = 3.9$(百万人)とします。
$t_1$(年)と $t_2$(年)の値を使って $\gamma$ と $N_{\rm max}$ を求めます。指数関数を含む連立方程式はなかなか解いてくれないので,簡単な代数方程式の形にして解きます。
$Nv(t)$ の分子分母を $e^{\gamma t}$ で割り,さらに
\begin{eqnarray}
n_0 &\equiv& \frac{N_0}{N_{\rm max}}
\end{eqnarray}
とします。
t0: usa[1][1]; /* 1行目の1列目 */
N0: usa[1][2]; /* 1行目の2列目 */
/* n0 = N0/Nmax とおいた */
Nv1(t):= N0/(n0 + (1-n0)*exp(gamma2*(t0-t)));
$t_1 = 1850$(年)と $t_2 = 1910$(年)の値を入れて連立方程式の形にします。
t1: usa[7][1];
t2: usa[13][1];
eq1: usa[7][2] = Nv1(t1);
eq2: usa[13][2] = Nv1(t2);
簡単な連立方程式にするため,さらに $T \equiv e^{-60\, \gamma_2}$ とし,$n_0$ と $T$ に関するシンプルな連立方程式の形にして,solve()
で解きます。
kill(T, n0)$
eq1: subst(exp(-60*gamma2)=T, eq1);
eq2: subst(exp(-120*gamma2)=T**2, eq2);
ans: solve([eq1, eq2], [n0, T]);
$n_0, \ T$ からもとの $N_{\rm max}, \ \gamma_2$ の値になおすと…
Nmax: float(N0/ev(n0, ans[1][1]));
gamma2: float(-1/60*log(ev(T, ans[1][2])));
/* plot2d() によるグラフ */
plot2d([Nm(t), [discrete, usa], Nv(t)], [t, 1790, 1940],
[point_type,bullet],
[style, lines, [points, 1.5], lines],
[color, red, blue, green],
[legend, "マルサスモデル", "アメリカの人口", "ヴェアフルストモデル"],
[xlabel, "年"], [ylabel, "人口(単位:百万人)"])$
/* draw2d() によるグラフ */
draw2d(
color = "red",
key = "マルサスモデル",
explicit(Nm(t), t, 1790, 1940),
color = "blue",
point_type = 7,
point_size = 0.7,
key = "アメリカの人口",
points(usa),
color = "green",
key = "ヴェアフルストモデル",
explicit(Nv(t), t, 1790, 1940),
xlabel = "年", ylabel = "人口(単位:百万人)",
yrange = [-20, 410], xaxis = true
)$
1階線形微分方程式と積分因子法
Maxima では,1階線形微分方程式は,特に積分因子法を coding しなくても,ode2()
関数で解くことができます。
例題
$$ \frac{dy}{dx} + \frac{y}{x} = \frac{\sin x}{x} $$
Maxima での三角関数 $\sin x, \cos x, \tan x$ は sin(x)
, cos(x)
, tan(x)
と書きます。
eq: 'diff(y, x) + y/x = sin(x)/x;
ode2(eq, y, x);
参考:あえて積分因子法の公式で…
この例題をあえて積分因子法の公式に従ってやってみる。
一般的な1階線形微分方程式(非同次方程式の格好しているもの)を
$$\frac{dy}{dx} + P(x) y = Q(x)$$
と書くと,積分因子 $g(x)$ は
$$g(x) = \exp \left\{\int^x P(x’)\,dx’ \right\}$$
解は
$$y = \frac{1}{g(x)} \left\{\int^x g(x’) Q(x’) \, dx’ + C \right\}$$
この例題では
$$P(x) = \frac{1}{x}, \ Q(x) = \frac{\sin x}{x}$$
P(x):= 1/x;
Q(x):= sin(x)/x;
define(g(x), exp(integrate(P(x), x)));
y = 1/g(x) * (integrate(g(x)*Q(x), x) + C);
最も簡単な定数係数2階微分方程式
最も簡単な定数係数2階線形微分方程式 $y^{”} + y = 0$ と $y^{”} – y = 0$ を解く。
eq1: 'diff(y, x, 2) + y = 0;
ode2(eq1, y, x);
eq2: 'diff(y, x, 2) - y = 0;
ode2(eq2, y, x);
参考:脊髄反射によらずに解く
$y^{”} + y = 0$ を脊髄反射によらずに解く。両辺に $2 y’$ をかけて整理すると
$$\left(\left(y’\right)^2 + y^2\right)’ = 0$$
微分してゼロということは,かっこの中身は定数であるということなので,
$$ \left(y’\right)^2 + y^2 = \mbox{const.} \equiv a^2$$
とおける。つまり
$$\frac{dy}{dx} = \pm \sqrt{a^2 – y^2}$$
を解けばよい。まずは $+$ の式から…
assume(a > 0)$
eq1: 'diff(y, x) = sqrt(a**2 - y**2);
ode2(eq1, y, x);
$y = $ の形に解きます。
solve(%, y);
$-$ の式についても同様に…
eq2: 'diff(y, x) = -sqrt(a**2 - y**2);
ode2(eq2, y, x);
solve(%, y);
ということで 2 つの解をまとめると,積分定数 $C_1, C_2$ を使って
\begin{eqnarray}
y &=& C_1 \sin(x + C_2) \\
&=& C_1 \left(\sin x \cos C_2 + \cos x \sin C_2 \right) \\
&=& (C_1 \cos C_2) \sin x + (C_1 \sin C_2) \cos x \\
&\equiv& A \cos x + B \sin x
\end{eqnarray}
のように書けるということ。
最も簡単な定数係数2階微分方程式:続き
$y^{”} + K y = 0$ あるいは移項して $y^{”} = – K y$ を解く。
eq: 'diff(y, x, 2) = - K * y;
$K > 0$ の場合
ode2(eq, y, x);
/* positive; と回答する */
$K < 0$ の場合
ans3: ode2(eq, y, x);
/* negative; と回答する */
上記の解は間違いではないかも知れないが,ややこしい。
$K \equiv -|K|$ としてみる。
ev(%, K=-abs(K));
$K = 0$ の場合
ode2(eq, y, x);
/* zero; と回答する */
人類の至宝:オイラーの公式
Maxima がオイラーの公式を知っているか確認する。
Maxima では虚数単位 $i$ は %i
です。
exp(%i * theta);
demoivre()
関数は複素指数関数を三角関数で表します。
exp(%i * theta) = demoivre(exp(%i * theta));
オイラーの等式
$\theta = \pi$ のとき,$e^{i \pi} + 1 = 0$。$\pi$ は Maxima では %pi
です。
exp(%i * %pi) + 1;
オイラーの公式からみた三角関数と双曲線関数の関係
三角関数 $\cos x, \sin x$ を exponentialize()
で(複素)指数関数表示します。
cos(x) = exponentialize(cos(x));
sin(x) = exponentialize(sin(x));
双曲線関数 $\cosh x, \sinh x$ も指数関数表示します。
cosh(x) = exponentialize(cosh(x));
sinh(x) = exponentialize(sinh(x));
さて,三角関数や双曲線関数の変数(引数)が虚数でもいいのだと拡張すると…
cosh(%i * theta);
sinh(%i * theta);
cos(%i * x);
sin(%i * x);
例題
微分方程式 $y^{”} + K y = 0$ の $K > 0$ の場合の解は
\begin{eqnarray}
y &=& A \cos\left( \sqrt{K} x\right) + \frac{B}{\sqrt{K}} \sin\left( \sqrt{K} x\right)
\end{eqnarray}
のように書ける。このことを使って,$K<0$ の場合と $K = 0$ の場合の解を上記の解から直接求める。
$K > 0$ の場合
y = y1: A * cos(sqrt(K) * x) + B/sqrt(K) * sin(sqrt(K) * x);
$K < 0$ の場合
y = ev(y1, K=-abs(K));
$K = 0$ の場合
y = limit(y1, K, 0);
定数係数2階線形同次方程式
定数係数2階線形微分方程式(同次方程式)は以下のように書ける。
$$ \frac{d^2 y}{dx^2} + 2 b \frac{dy}{dx} + cy = 0$$
$b, c$ は定数。一般解 $y$ は以下のように場合分けして…
eq: 'diff(y, x, 2) + 2 * b * 'diff(y, x) + c * y = 0;
$c – b^2 > 0$ の場合
ode2(eq, y, x), factor;
/* c - b**2 は positive; と答える */
$c – b^2 < 0$ の場合
ode2(eq, y, x), factor;
/* c - b**2 は negative; と答える */
$c – b^2 = 0$ の場合
ode2(ev(eq, c=b**2), y, x);
ひとつだけの解ですますには…
以下の表現ひとつで3つの場合の全てに対応した解になることを示しておきます。
y(mu):= exp(-b*x) * (A*cos(mu * x) + B/mu*sin(mu * x));
$c-b^2 > 0$ の場合は $\mu \equiv \sqrt{c-b^2}$ として…
y = y(sqrt(c-b**2));
$c-b^2 < 0$ の場合は $\mu \equiv \sqrt{c-b^2} = i \sqrt{b^2-c}$ として…
y = y(%i * sqrt(b**2-c));
最後に $c-b^2 = 0$ の場合は $\mu \rightarrow 0$ の極限をとって…
y = limit(y(mu), mu, 0), factor;
定数係数2階線形非同次方程式
人力で解く際には,同次方程式と非同次方程式とでは,解く手間がずいぶん違ったが,Maxima ではどちらも同じ。ode2()
を使う。
例題
非同次方程式 $y^{”} + a^2 y = \sin b x$ を解く。
/* a, b は正(ゼロでない)と仮定する。*/
assume(a>0, b>0)$
eq: 'diff(y, x, 2) + a**2 * y = sin(b*x);
ode2(eq, y, x);
$a = b$ の場合は上記の解の分母がゼロになってしまうので,別途計算する必要がある。
この状況は,力学では固有振動数 $a$
に等しい振動数の外力が加えられた時に起こる「共鳴(共振)」と呼ばれる現象である。
eq1: ev(eq, b = a); /* ev(eq) は b = a の場合を評価してくれる。*/
ode2(eq1, y, x);
積分定数 $\% k_1, \% k_2 $がつくのは同次方程式の一般解。非同次方程式の特解は,振幅が $x$ に比例して単調増加していく。
あえてロンスキアンを使った公式で特殊解を求める
非同次方程式も ode2()
で解がもとまったわけだが,そこをあえてロンスキアンを使った公式で特殊解を求めてみる。
まず,同次方程式は…
eq0: 'diff(y, x, 2) + b**2 * y = 0;
ode2(eq0, y, x);
上記のように同次方程式の1次独立な基本解はそれぞれ…
y1(x):= sin(a*x);
y2(x):= cos(a*x);
ロンスキアンは $W(x) \equiv y_1 y_2′ – y_1′ y_2 = \cdots$
W: y1(x) * diff(y2(x), x) - diff(y1(x), x) * y2(x);
W: trigsimp(W);
非同次方程式の特殊解 $y_s(x)$ は,非同次項を $R(x) = \sin b x$ として
$$y_s(x) = y_2(x) \int^x \frac{R(x’) y_1 (x’)}{W(x’)} dx’ – y_1(x) \int^x \frac{R(x’) y_2(x’)}{W(x’)} dx’$$
$b \neq a$ を仮定して…
R(x):= sin(b*x);
ys: y2(x)*integrate(R(x)*y1(x)/W, x) - y1(x)*integrate(R(x)*y2(x)/W, x);
expand(ys)
でかっこをはずして展開して…
trigexpand(%)
で三角関数の加法定理を使い…
最後に trigsimp(%)
で簡単化すると…
最後に trigsimp(%)
で簡単化すると…
expand(ys)$
trigexpand(%)$
trigsimp(%);
無事,非同次方程式の特殊解
$y_s$ が出ました。ただし,積分の下限の任意性があるので,以下のように
$$y_s(x) = y_2(x) \int_0^x \frac{R(t) y_1 (t)}{W(t)} dt – y_1(x) \int_0^x \frac{R(t) y_2(t)}{W(t)} dt$$
とすると…
assume(x>0)$
ys: y2(x)*integrate(R(t)*y1(t)/W, t, 0, x) - y1(x)*integrate(R(t)*y2(t)/W, t, 0, x);
なんだかんだで簡単化してやると…
expand(ys)$
trigexpand(%)$
trigsimp(%)$
expand(%);
… となり,$\displaystyle y_s = \frac{\sin (b x)}{a^2-b^2}$ のほかに $\sin (a x)$ に比例する項も現れます。しかし,$\sin (a x)$ に比例する項は,同次方程式の一般解に組み込まれるので,$\sin (b x)$ に比例する項が結局非同次方程式の特殊解となります。
このように,ロンスキアンを使った公式で特殊解を求めると,不定積分の不定性(積分の下限の不定性)により,同次方程式の一般解に組み込まれる項があらわれることもありますので,そのへんは各自処理していただくということで…
$b = a$ の場合は,非同次項 $R(x) = \sin (a x)$ として…
R(x):= sin(a*x)$
ys: y2(x)*integrate(R(x)*y1(x)/W, x) - y1(x)*integrate(R(x)*y2(x)/W, x);
expand(ys)
でかっこをはずして展開して…
trigexpand(%)
で三角関数の加法定理を使い…
最後に trigsimp(%)
で簡単化すると…
expand(ys)$
trigexpand(%)$
trigsimp(%);
無事,非同次方程式の特殊解
$y_s$ が出ました。ただし,積分の下限の任意性があるので,以下のように
$$y_s(x) = y_2(x) \int_0^x \frac{R(t) y_1 (t)}{W(t)} dt – y_1(x) \int_0^x \frac{R(t) y_2(t)}{W(t)} dt$$
とすると…
assume(x > 0)$
ys: y2(x)*integrate(R(t)*y1(t)/W, t, 0, x) - y1(x)*integrate(R(t)*y2(t)/W, t, 0, x);
なんだかんだで簡単化してやると…
expand(ys)$
trigexpand(%)$
trigsimp(%)$
expand(%);
… となり,やはり非同次方程式の特殊解の項のほかに,$\sin (a x)$ に比例する項,つまり同次方程式の一般解に組み込まれる項も現れます。