MATLABのSymbolic Math,いいですよね.
実は担当している微分方程式の授業で,課題や試験問題の検算に利用しています.「対数の発明は天文学者の寿命を延ばした」と称されたように,Symbolic Mathも研究者の寿命をもりもり伸ばしてくれます.
ということで,微分方程式の特殊解を求めるサンプルを作って公開しました.数値例は電気回路でお馴染みの,みんな大好きRL回路です.コードはFileExchangeに置きましたのでご自由にどうぞ.
コード説明
RL回路の微分方程式に対する特殊解を求めるサンプル
変数を定義
syms Is E_0 R L t A B omega
特殊解の解の候補を決める
Is=A*cos(omega*t)+B*sin(omega*t)
解の候補を回路方程式に代入する.
diffEq=L*(diff(Is,t))+R*Is-E_0*sin(omega*t)
$t$の適当な2点で条件式を評価し,未定係数に対する連立方程式を導く.
tmpEq(1)=subs(diffEq,t,0)
tmpEq(2)=subs(diffEq,t,pi/(2*omega))
未定係数に対する連立方程式を解く
Asol=solve(tmpEq,{A,B}).A Bsol=solve(tmpEq,{A,B}).B
未定係数を代入して簡略化する
simplify(subs(Is,{A,B},{Asol,Bsol}))
出力の抜粋
Is = $\displaystyle A,\cos \left(\omega ,t\right)+B,\sin \left(\omega ,t\right)$
diffEq = $\displaystyle L,{\left(B,\omega ,\cos \left(\omega ,t\right)-A,\omega ,\sin \left(\omega ,t\right)\right)}-E_0 ,\sin \left(\omega ,t\right)+R,{\left(A,\cos \left(\omega ,t\right)+B,\sin \left(\omega ,t\right)\right)}$
tmpEq = $\displaystyle A,R+B,L,\omega $
tmpEq = $\displaystyle \left(\begin{array}{cc}
A,R+B,L,\omega & B,R-E_0 -A,L,\omega
\end{array}\right)$
Asol = $\displaystyle -\frac{E_0 ,L,\omega }{L^2 ,\omega^2 +R^2 }$
Bsol = $\displaystyle \frac{E_0 ,R}{L^2 ,\omega^2 +R^2 }$
ans = $\frac{E_{0},\left(R,\sin\left(\omega ,t\right)-L,\omega ,\cos\left(\omega ,t\right)\right)}{L^2,\omega ^2+R^2}$
なるべく手計算の順序をそのまま自動化するように書いてあります.
一般解と特殊解の重複があったりすると面倒なのですが,本稿では言及しません.
もっといい方法をご存じの方はおしえてください.