「Maxima」を活用して数学の学習ロードを駆け抜けよう!
(注) MathJaxを使用しているので、 スマホでは表示に時間がかかることがあります。
モバイル利用(Android)でのメニュー選択は、 SiteMapを利用するか、 「長押し」から「新しいタブを開く」を選択してください。
■ 数式処理ソフト「Maxima」を活用した数学学習 [Map] |
| ||||
| ||||
[御案内] 「Maxima」(マキシマ)は,フリーの数式処理ソフトです. 有料の Mathematica や Maple に劣らないレベルの数式処理が可能であり, Linux,Windows,MacOSのみならず,Android版もあります. ここでは,数学学習での Maxima の活用法について解説します. | ||||
[お知らせ] スマホ(Android)版Maximaの解説本を出版しました. 計算問題やグラフの確認をするときに非常に重宝します. フリーソフトなので一度試してみてください. PC版のコマンドレファランスとしても利用できます。
| ||||
|
■数学学習での活用 |
|
式の変形 |
最初の例示画面にあるように,
式の展開(expand)や因数分解(factor)を行うことができます.
「factor」は整数係数での因数分解を行い,
整数係数で分解できないときは式がそのまま返されます. 複数の文字を含む式を一つの文字で整理するには,「rat」を利用します. 下記では,\(\small (x+y+z)^2\) を展開して \(\small y\) について 整理しています.「%」は直前の展開式を表します. 「rat((x+y+z)^2, y)」としてもかまいません. 文字式の変形では,いろいろな箇所で部分分数に分解する計算も頻出します. この変形は「partfrac」により行うことができます. 他にも,いろいろな機能があります.
|
微分積分 |
最初の例示画面にあるように,
関数の微分(diff)や積分(integrate)の計算を行うことができます.
下記では,\(\small \sin^3(2x)\) の \(\small x=\pi/3\) での微分係数の
値を求めています.円周率 \(\small \pi\) は「%pi」で表します.
(%i7)の「%」は,直前の結果である(%o6)の微分結果を表します.
定積分は積分範囲を指定します.下図では,
\(\small [0,\pi]\) での定積分の値を求めています.
指定した関数の特定の値でのテイラー展開を求めることもできます.
下図では,\(\small \cos{x}\) のマクローリン展開が8次の項まで
求められています.
書式は,「taylor(関数, 変数, 値,次数)」です.
他にも,いろいろな機能があります.
|
|
線形代数 |
冒頭の例示画面で紹介したように,
行列に関して行列式や固有値の計算をすることができます.
下図では,行列の積や逆行列の計算が行われています.
2次以上の次数でもかまいません.
M\(\small *\)Mとすると,行列としての積の計算ではなく,
対応する成分ごとの積が計算されます.
(%i7)では,「ratsimp」により式の簡略化が行われています.
「ratsimp(%)」とすることでもかまいません.
「%」は,直前の(%o6)に示されているMの逆行列を表します.
他にも,線形代数に関するいろいろな機能があります.
|
|
微分方程式 |
|
冒頭での画面例示にあるように,
Maximaには微分方程式の解析解を求めたり,
初期値問題を解くコマンドが用意されています.
「ode2」を利用すると1階と2階の常微分方程式の一般解を求めることができます.
得られた一般解に対して,「ic1」では1階の場合の初期条件,
「ic2」では2階の場合の初期条件を指定して特殊解が求められます.
■1階微分方程式 次に,この解で, たとえば「\(\small x=1, y=e\)」を満たす特殊解を求めてみましょう. 1階微分方程式の一般解から特殊解を求めるコマンドは「ic1」です. 上図では,(%o6)の一般解に対して初期条件を指定したものです. Maximaでは,ネイピア数 \(\small e\) は「%e」で表します. 上記は同次形の微分方程式ですが, 同様にして変数分離形,1階線形,完全微分形などの 一般解や特殊解を求めることができます. |
|
■解曲線と勾配場 これにより解は求められましたが,一体どのようなグラフなのでしょうか. 1階微分方程式は,多くの場合は \(\small \frac{dy}{dx}=(x, yの式)\) の形に表すことができます.(%i6) の式は \(\small \frac{dy}{dx}=\frac{y}{x-y}\) です.これは,解が分からなくても,点 \(\small (x,y)\) が与えられると, その点を通る解曲線の接線の傾きが分かることを意味します. したがって,格子点での接線を短く引けば, 解を表す具体的な式が求められなくても 解曲線の状況をある程度把握できることになります. そのような図を勾配場といいます. Maximaには,その勾配場を描画するパッケージ(plotdf)があります. それはデフォルトでは読み込まれないので, パッケージを読み込むコマンド「load」で明示的に読み込ませます. その上で,\(\small \frac{dy}{dx}=f(x,y)\) の勾配場を描画するには 「plotdf(f(x,y))」を実行します. 下図では,(%o13)の右半分は省略されています. 「load」で読み込むと,どのようなパッケージが読み込まれたかが 下段に表示されます.「plotdf.lisp」が読み込まれ, Lisp言語で書かれたファイルであることが分かります. フォルダーの場所も明示されるので,どのような内容が書かれているのか 一度は眺めておくとよいでしょう.テキストファイルなので, 内容を見ることができます. なお,「load(plotdf)$」とすると,パッケージが読み込まれるだけで, 下段には何も表示されません. 次に,(%i14)を実行すると,ちょっとの時間をおいて下図が表示されます. この画面は,gnuplotではなく xmaximaの画面です. 適当な場所でクリックすると,その点を通る解曲線が描かれます. それは何度でも繰り返すことができます. 画面を閉じるには,トップメニュー左端にある「×」か, または右角の「×」をクリックします. 最初から点を指定することもできます. 上記の画面をいったん閉じます. 例えば点 \(\small (1, e)\) を通る解曲線を描画するには, 改めて 「plotdf(y/(x-y), [trajectory_at, 1, 2.71828])$」として 具体的な数値で指定します.ここでは「%e」は使用できません. または,勾配図の描かれている図の,左端の「×」の右側をクリックすると 下図が表示されるので,上から2段目の「Trajectory at」の箇所で, 座標が \(\small (a,b)\) であれば, 「a b」として半角空白で区切って入力しても同じ曲線が描画されます. このメニューの個々の詳細は, マニュアルの22.5節にある「plotdf」の箇所を 参照してください.曲線の色を変更することもできます. 勾配場の画面を閉じるには「×」印をクリックします. いずれにしろ,微分方程式は,単に解を求めるばかりではなく, そのグラフも同時に把握することが重要です.特に勾配場は, それを実際に手作業で描画するのは大変なので 通常の教科書で解説されることは少ないのですが, Maximaを利用すると微分方程式の解の式と勾配場の中でのグラフを 簡単に見ることができます.この機能は, 微分方程式の理解を大きく向上させることになるでしょう. |
|
■2階微分方程式 冒頭の例示画面にあるように, 定数係数の2階線形微分方程式の一般解も「ode2」で求めることができます. 初期値問題を解くときは「ic2」を利用します. 変数を増やして1階の連立微分方程式に直せば, 「plotdf」によりベクトル場を図示することもできます. なお,「ode2」で解けるのは2階までです.3階以上には対応していません. 微分方程式の解を求めるコマンドには, 「ode2」の他に「desolve」があります. 「desolve」はラプラス変換を利用して解を求めます. 例えば,\(\small x''+x=t\) の解を求めるには,次のようにします. \(\small x(t)\) ではなく \(\small y(x)\) としてもかまいませんが, 「ode2」のときのような \(\small y, x\) だけの式ではエラーになるので, 式の定義の仕方には気をつけてください. 「desolve」は3階以上にも対応しています. ラプラス変換を利用して解いているので, \(\small x(0), \frac{d}{dt}x(t)\big|_{t=0}\) などの初期条件を含む式で解が表されます.「ode2」の場合は一般解を求めてから初期条件を与えますが, 「desolve」で特殊解を求めるには, 「desolve」を実行する前に与える必要があります.初期条件の指定は 「atvalue」により行います.この微分方程式を, たとえば「\(\small x(0)=1,~x'(0)=4\) 」 という初期条件のもとで解くには次のようにします. 上図では,最初に「atvalue」を利用して(%i17)では \(\small x(0)=1\) を, (%i18)では \(\small x'(0)=4\) を指定しています. 2つの初期値の指定をした上で,(%i19)で「desolve」により解を求めています.
■連立微分方程式 \(\small y(t)=\frac{(y(0)+3x(0))e^{3t}}{4} +\frac{(3y(0)-x(0))e^{-t}}{4}\) たとえば,\(\small x(0)=1, y(0)=1 \) という条件のもとでの解を求めるには, 「atvalue」により初期値を指定してから,改めて「desolve」を実行します. 同様にして,3元以上の場合の解も求めることができます. |
|
フーリエ解析 |
|
Maximaには,
フーリエ級数やフーリエ変換を求めるパッケージも備わっています.
その機能はデフォルトでは読み込まれていないので,
最初に「load(fourie)」または「load("fourie")」を実行して
パッケージを読み込ませます.
(「fourier」ではありません.)
それにより,フーリエ係数やフーリエ級数の式,グラフ化,
そしてフーリエ変換を求めることができます.
上図は,単位ステップ関数の
\(\small [-1, 1]\) の部分が繰り返されるとしたとき,
そのような関数をフーリエ級数で表して
5項目と19項目までをグラフで表示したものです.
項数が増えるにしたがい単位ステップ関数に近づいていくことが分かります.
フーリエ級数を利用すると,このような連続ではない点を含む関数も
三角関数を利用して表すことができます.
★所持しているスマホやタブレットがAndroidの場合は, 「Maxima on Android」というアプリを組み込めば スマホやタブレットでもフーリエ解析の計算ができることになります!
■フーリエ級数とフーリエ係数 |
|
■単位ステップ関数のフーリエ級数 項数を変えながらのグラフを鑑賞するため, 関数 \(\small g(x,n)\) を(%i12)のように定義して, plot2dを利用してグラフを描いてみましょう. (%o9)にはフーリエ係数がまとめられています. plot2dでは,関数を [ ] 内に続けて指定すると複数のグラフが描画されます. gnuplotのデフォルトでは凡例に関数の長い式が表示されますが, これを表示しないようにするには, 範囲指定の後に [legend,false] を追加します. フーリエ係数の計算,簡略化,そして級数表示一気に行うコマンドもあります. 「totalfourier(f(x), x, p);」とすると,フーリエ係数が簡略化されて表示され, さらにはフーリエ級数までが表示されます. |
|
■フーリエ余弦級数・フーリエ正弦級数 ここまでは,定義域が \(\small [-p, p]\) の関数を周期 \(\small 2p\) の 周期関数に拡大して考えています.定義域が \(\small [0, p]\) の場合に, それを偶関数や奇関数として定義域を \(\small [-p, p]\) にして 同様のことを考えるのが,フーリエ余弦級数やフーリエ正弦級数です. フーリエ余弦係数は「fourcos(f(x), x, p)」, フーリエ正弦係数は「foursin(f(x), x, p)」により求められます. たとえば,区間 \(\small [0, 1]\) で関数 \(\small f_2(x)=1-x\) を考えて, 区間 \(\small [-1, 1]\) に偶関数(even function)で拡張すると \(\small 1-|x|\) です. なお,(%i26)で改行しながら入力するには, TeXmacs+Maximaでは「Shift+Enter」, wxMaximaでは「Enter」です. (%i25)のf2cos(x,n)の定義で,直前の(%o24)にある フーリエ余弦係数を「%」だけで参照するとエラーになるので気をつけてください. このコマンドでは参照場所をはっきり明示する必要があるようです. \(\small f_2(x)=1-x\) を奇関数(odd function)で拡張すると \(\small \frac{|x|}{x}-x\) で表されます.フーリエ正弦係数と, そのグラフは次のようになります.凡例は,項数だけを示しました. 2つのフーリエ級数の収束の様子を比較してみましょう. 偶関数として拡張すると,微分可能ではない点は含まれますが, 連続関数として定義域が拡張されています.奇関数として拡張すると, 連続ではない点を含んだ関数として拡張されています.その点では,当然, 微分可能ではありません. 連続関数として拡張されていると数項を取るだけで収束していきますが, 微分可能ではない点での収束は遅いことが見てとれます. 一方,不連続な点を含んで拡張されると,全体の収束が遅く, 特に不連続な点での収束はかなり遅いことが分かります. このように,フーリエ級数の収束の速さは, 連続性や微分可能性と密接に関連しています. |
|
■複素フーリエ級数 三角関数と指数関数は,一見すると全く関係がないように見えますが, 複素数まで考えると オイラーの公式 \(\small e^{i\theta}=\cos\theta+i\sin\theta\) により, これらの間には密接な関係性があります.オイラーの公式から, \[\small \displaystyle \cos\theta=\frac{e^{i\theta}+e^{-i\theta}}{2},\quad \sin\theta=\frac{e^{i\theta}-e^{-i\theta}}{2i}\] となり,実数の世界の三角関数は指数が純虚数の指数関数で表すことができるので, フーリエ級数は指数関数による級数で表すことができます. 実際,この関係を利用すると, \[\small\begin{align*} a_n\cos&\frac{n\pi x}{p}+b_n\sin\frac{n\pi x}{p}\\ &=\frac{a_n-ib_n}{2}e^{\frac{in\pi x}{p}}+\frac{a_n+ib_n}{2}e^{\frac{i(-n)\pi x}{p}}\end{align*}\] と変形できることから, \[\small c_0=a_0,~ c_n=\frac{a_n-ib_n}{2},~ c_{-n}=\frac{a_n+ib_n}{2}\] とおくと,\(\small f(x)\) のフーリエ級数は次の式で表すことができます. 関数 \(\small f(x)\) の複素フーリエ級数といいます. \[\small\displaystyle f(x)\sim\sum_{n=-\infty}^{\infty}c_ne^{\frac{in\pi x}{p}}\] この係数 \(\small c_n\) は,\(\small a_n\pm ib_n\) の箇所を 積分の式に直してオイラーの公式を利用すると,任意の整数に対して \[\small\displaystyle c_n=\frac1{2p}\int_{-p}^{p}f(x)e^{-\frac{in\pi x}{p}}\,dx\] となります.\(\small c_n\) を複素フーリエ係数といいます. 複素フーリエ係数が分かれば,実フーリエ係数は \[\small a_n=c_n+c_{-n},\quad b_n=i(c_n-c_{-n})\] により求めることができます. 以上の詳細は,フーリエ解析の書籍を参照してください. 「fourie」パッケージに,この複素フーリエ係数を求めるコマンドはありませんが, \(\small c_n\) は「integrate」により求めることができます. (%i32)では「integrate」を利用して,定義により \(\small \frac12\int_{-1}^{1}f(x)e^{-in\pi x}\) を求めています. 虚数単位は「%i」です. (%i33)では,得られた式を「define」を利用して \(\small c_n\) に定義しています.このように,計算結果から引数を持つ式を定義するときは 「define」を利用します. 指数に虚数単位を含む式で表示されるので, (%i34)では,「demoivre」というコマンドにより三角関数の式に直しています. (%i35)では,「trigsimp」により三角関数の基本性質を利用して 式の簡略化を図っています.そして,「foursimp」を利用して, \(\small n\) が整数の場合の値を求めています.次に,\(\small c(n)\) から \(\small a_n, b_n\) を求めてみましょう. 前述の計算では個別に式変形や簡略化を行っていますが, 面倒なので3つのコマンドを入れ子にしています. \(\small a_n=c_n+c_{-n},~b_n=i(c_n-c_{-n})\) を利用します. (%i35)では \(\small a_n\) を,(%i36)では \(\small b_n\) を求めています. 当然ながら,単位ステップ関数の箇所で 求めた値と一致します. |
|
■「integrate」での計算 念のため,「fourie」というパッケージを使用しないで, 積分を求める基本的なコマンドである「ingegrate」でどこまでが可能であるかを 調べてみましょう. たとえば, \[\small f(x)=x\qquad (-1\leq x\lt 1)\] を考えると,\(\small p=1\) であり奇関数であることから \(\small a_n=0\) なので \[\small \displaystyle b_n=\int_{-1}^{1}x\sin{n\pi x}\,dx\] を計算する必要があります.「integrate」を利用すると次のように計算されます. ただし,\(\small n\) がどのような値か不明なので \(\small n\pi\) の サイン・コサインの値はそのままで表示されます. \(\small n\) が整数であることを指定するには「declare」を用いて次のように 指定します. (%i2)により整数であることを宣言して改めて積分を計算すると, 三角関数の値が評価されて結果が表示されます. あらためて「integrate」を計算しなくても,(%i4)のように, (%o1)に表示された結果を「ev」により評価する(evaluate)ことでも 同じ結果が得られます.いろいろな計算を続けていくと, \(\small n\) が整数であることを宣言したかどうかを忘れてしまう場合があります. そのようなときは,「featurep」により確認することができます. 末尾に「p」がつくと真偽判定を行うコマンドになり, 真であれば「true」,偽であれば「false」が返されます. 整数であるという宣言を取り消すには,(%i6)のように「remove」を用います. フーリエ級数を学習中で,自分の行った部分積分の計算が正しいかどうかを 確認するには,Maximaの積分結果は(%o1)のままでよいと思われます. その式から(%o3)の式を得るのは,自分の頭の中で行うべきでしょう. 次に,絶対値関数を考えてみます. \[\small f(x)=|x|\qquad (-1\leq x\lt 1)\] この関数は偶関数なので \(\small b_n=0\) となり \(\small a_n\) だけを 求めることになりますが,下図の(%o8)のようにMaximaは積分式をそのまま返します. 絶対値関数(absolute function) \(\small |x|\) は「abs(x)」です. 絶対値を含む関数の定積分は積分範囲を分けて計算しなければならないので 面倒です.いろいろな関数の箇所で, 絶対値関数の積分を求める必要があるときは 「abs_integrate」というパッケージを読み込ませるとよい, と解説しました.それを読み込んで計算すると,結果は (%o10)のような式で表示されます. 結果は表示されましたが,通常は見かけない関数を用いて表示されます. \(\small \Gamma(a, z)\) は第二種不完全ガンマ関数と呼ばれる特殊関数で, 次の式で定義される関数です.マニュアルの15.4節や Wikipediaを 参照してください. \[\small \displaystyle \Gamma(a, z)=\int_{z}^{\infty}t^{a-1}e^{-t}\,dt\] 通常のガンマ関数は自然数の階乗を実数に拡張した関数ですが, 第二種不完全ガンマ関数には次のような性質があります. \[\small \Gamma(a+1, z)=a\Gamma(a, z)+z^ae^{-z}\] この関数は,\(\small a, z\) の値によっては \(z, e^z, 誤差関数\) で表すことができます.デフォルトでは, そのような式変形は行われない設定になっています.しかし, ここで考えている \(\small |x|\) のフーリエ余弦係数は簡単な式のはずです. 可能なら簡単な式に変形するようにするには, 「gamma_expand」というオプション変数を「true」にします. 下図では,画面の右側は省略されています. (%i11)では,「gamma_expand」という変数の内容を確認しています. 「false」になっているので,(%i12)で「true」を割り当てます. その上で(%i10)に表示された式を評価(evaluate)して(%o13)が得られます. (%i13)は,「%o10, ev」や「ev(%o10)」などとしてもかまいません. (%i14)では,指数関数で表された式を「demoivre」を利用して三角関数の式に直し, (%i15)ではそれを簡略化しています. この箇所では「fourie」というパッケージは読み込んでいないので, (%o15)に対して「foursimp」は効きません.自分で考えることにより, \(\small |x|\) のフーリエ余弦係数は \(\frac{2((-1)^n-1)}{n^2\pi^2}\) であることが分かります. フーリエ解析で扱う関数は, 不連続な点や微分可能ではない点を含む関数と三角関数との積の積分を 計算しなければならない場面が頻出します. そのような関数は絶対値や単位ステップ関数などを用いて表されることが多いので, そのたびに以上のようなことを行うのは面倒です. フーリエ解析を「integrate」だけで行うのは煩雑極まりないといえるでしょう. |
|
■フーリエ積分 フーリエ級数は, 有限区間で定義された関数を周期関数に拡張して考えたものですが, 実数全体で定義されて, 必ずしも周期関数とは限らない関数で同様のことを考えたのがフーリエ積分です. 関数 \(\small f(x)\) を実数全体で定義された関数とします. この関数の,区間 \(\small [-L, L]\) の部分が周期的に繰り返されるとして そのフーリエ級数を考えます. そのフーリエ級数で \(\small L\to \infty\) の場合を考えて, フーリエ係数に相当する式として得られるのがフーリエ変換です. このことを複素フーリエ級数で考えると,\(\small \lim\sum\) が含まれるので, フーリエ級数に相当する式は総和ではなく積分の式になり, \(\small f(x)\) は次の式で表されます. これを \(\small f(x)\) のフーリエ積分といいます. \[\small \displaystyle f(x)\sim\frac1{2}\int_{-\infty}^{\infty}F(\omega)e^{i\omega x}\,d\omega \quad \cdots\cdots (1)\] ここで,\(\small F(\omega)\) は次の式で表され, 複素フーリエ級数の \(\small c_n\) に相当する式です. \[\small \displaystyle F(\omega)=\frac1{\pi}\int_{-\infty}^{\infty}f(x)e^{-i\omega x}\,dx\quad \cdots\cdots (2)\] (2)の \(\small F(\omega)\) を 関数 \(\small f(x)\) の フーリエ変換 といいます. (1)の式を逆フーリエ変換ということもあります. なお,係数の \(\small 1/2, 1/\pi\) の値や位置は本により異なります. Maximaの出力結果を見ると, Maximaでは上記のように定めているように思われます. また,関数 \(\small f(x)\) は, このような無限積分が存在するための適当な条件のもとで考えることになります. (2)の積分変数を \(\small u\) に変えて(1)に代入して変形すると,(1)は 三角関数を用いた式に変形することができます. \[\small \displaystyle \int_{0}^{\infty} \left\{A(\omega)\cos\omega x+B(\omega)\sin\omega x\right\}\,d\omega\] ここで,\(\small A(\omega), B(\omega)\) がフーリエ係数に相当する式で フーリエ積分係数といい, 次の式で表されます. \[\small \displaystyle A(\omega)=\frac1{\pi}\int_{-\infty}^{\infty}f(u)\cos\omega u\,du\] \[\small \displaystyle B(\omega)=\frac1{\pi}\int_{-\infty}^{\infty}f(u)\sin\omega u\,du\] \(\small F(\omega)\) との間には,\(\small F(\omega)=A(\omega)-iB(\omega)\) という関係があります. \(\small f(x)\) が偶関数のときは \[\small \displaystyle f(x)\sim \int_0^{\infty}C(\omega)\cos\omega x\,d\omega\] \[\small \displaystyle C(\omega)=\frac2{\pi}\int_{0}^{\infty}f(u)\cos\omega u\,du\] \(\small f(x)\) が奇関数のときは \[\small \displaystyle f(x)\sim \int_0^{\infty}S(\omega)\sin\omega x\,d\omega\] \[\small \displaystyle S(\omega)=\frac2{\pi}\int_{0}^{\infty}f(u)\sin\omega u\,du\] と表されます.\(\small C(\omega)\) をフーリエ余弦変換, \(\small S(\omega)\) をフーリエ正弦変換といいます. フーリエ変換 \(\small F(\omega)\) との関係は, 偶関数であれば \(\small C(\omega)=F(\omega)\) ですが, 奇関数のときは \(\small S(\omega)=iF(\omega)\) です. 「fourie」パッケージを読み込ませると, 「fourint(f(x),x)」により \(\small A(\omega), B(\omega)\) , 「fourintcos(f(x),x)」により \(\small C(\omega)\), 「fourintsin(f(x),x)」により \(\small S(\omega)\) が, それぞれ \(\small \omega\) の代わりに \(\small z\) を用いた式で求められます。 以上の詳細については,フーリエ解析の書籍を参照してください. フーリエ級数は,項数を増やすことで収束の様子を見ることができます. フーリエ積分でも, 積分範囲を広げていくことで収束の様子をみることができます. 以下に,幾つかの具体例でやってみましょう. 最初に「fourie」と「abs_integrate」を読み込み, 第二種不完全ガンマ関数が現れたら 簡単な式に変形するようにしておきます.また, 指定した範囲の関数を切り出す関数cut(x,a,b)を定義しておきます. (%i5)では,\(\small f_1(x)\) を次のような関数として定義しています. \[\small f_1(x)=\begin{cases} 0 & (x\leq 0)\\ 1 & (0\lt x\leq 1)\\ 0 & (0\lt x) \end{cases}\] (%i6)で,この関数のフーリエ積分を求めています.結果は,\(\small f(x)\) の フーリエ積分を次の式で表したときのフーリエ積分係数 \(\small A(\omega), B(\omega)\) が, 変数に \(\small z\) を用いた式で返されます. \[\small \displaystyle \int_{0}^{\infty} \left\{A(\omega)\cos\omega x+B(\omega)\sin\omega x\right\}\,d\omega\] フーリエ変換 \(\small F(\omega)\) は, \(\small F(\omega)=A(\omega)-iB(\omega)\) という関係から (%i8)により求められます.一方,フーリエ変換 \(\small F(\omega)\) を \[\small \displaystyle F(\omega)=\frac1{\pi}\int_{-\infty}^{\infty}f(x)e^{-i\omega x}\,dx\] により求めると,結果は指数関数を含む式で表されるはずです. そこで,(%o8)をオイラーの公式を利用して指数関数の形で表してみましょう. そのような変形をするコマンドは「exponentialize」です. (%o9)が指数関数で表した結果です. (%o8)の三角関数の部分を単に指数関数で表しただけなので, (%i10)ではそれを展開しています. (%o10)の式が,フーリエ変換 \(\small F(\omega)\) の式です. (%i11)では,実際に積分して一致することを確かめています. Maximaでの書式に合わせて \(\small z\) を用いています. 繰り返すと,(%o10)は \(\small F(\omega)=A(\omega)-iB(\omega)\) を 求めて指数関数に直した式で, (%o11)はフーリエ変換の定義式により直接積分して得られた式です. \(\small F(\omega)\) は,(%i11)の積分を \(\small \pi\) で割った式で 定めているので,2つの結果は一致していることが分かります. なお,\(\small \infty\) は「inf」,\(\small -\infty\) は「minf」です. 次に,同様のことを偶関数で行ってみましょう. (%i16)で定義した \(\small f_2(x)\) は次のような関数です. (%i17)と(%i19)の結果から,両者が一致していることが分かります. 下記では,フーリエ余弦変換の定義式により求めています. 当然ながら,上記と一致します. |
|
■フーリエ積分の収束の様子 フーリエ級数は,項数を増やすごとにもとの関数に近づいていくことを 見ることできて分かりやすいのですが, 無限積分で表されるフーリエ積分は,なかなかその意味を把握しにくいところです. 関数の変化の特徴を調べるのにフーリエ変換は重要な役割を果たしますが, その詳細はフーリエ解析の書籍を参照してください. ここでは,\(\small f_2(x)\) のフーリエ積分を考えて, 積分範囲を広げていくと元の関数に近づいていく様子を鑑賞してみましょう. まず,上記の計算結果から,\(\small f_2(x)\) は次の無限積分で表されます. \[\small \displaystyle f_2(x)=\int_0^{\infty}C(\omega)\cos{\omega x}\,d\omega\] \[\small \displaystyle C(\omega)=\frac2{\pi}\cdot\frac{1-\cos\omega}{\omega^2}\] \(\small f_2(x)\) は \(\small C(\omega)\) を代入すると次の式で表されます. \[\small \displaystyle \begin{align*} f_2(x)&=\frac2{\pi}\int_0^{\infty} \frac{(1-\cos\omega)\cos{\omega x}}{\omega^2}\,d\omega\\ &=\lim_{a\to\infty}\frac2{\pi}\int_0^a \frac{(1-\cos\omega)\cos{\omega x}}{\omega^2}\,d\omega \end{align*}\] 区間 \(\small [0, a]\) での積分の値を, この区間を \(\small n\) 等分した数値積分で計算して, \(\small a, n\) を大きくしていった場合を考えてみましょう. 区間 \(\small [0, a]\) を \(\small n\) 等分した分点を \(\small \omega_k\) とすると,\(\small \varDelta \omega=\frac{a}{n},~\omega_k=\frac{ka}{n}\) となるので,定積分の定義により \[\small\displaystyle \begin{align*} \frac2{\pi}&\int_0^a\frac{(1-\cos\omega)\cos{\omega x}}{\omega^2}\,d\omega\\ &=\lim_{n\to\infty}\frac2{\pi}\sum_{k=1}^{n} \frac{(1-\cos\omega_k)\cos{\omega_k x}}{\omega_k^2}\,\varDelta \omega\\ &=\lim_{n\to\infty}\frac2{\pi}\sum_{k=1}^{n} \frac{(1-\cos\frac{ka}{n})\cos{\frac{ka}{n} x}}{\left(\frac{ka}{n}\right)^2} \cdot\frac{a}{n}\\ \end{align*}\] となります.そこで, \[\small g(x,a,n,k)= \frac{(1-\cos\frac{ka}{n})\cos{\frac{ka}{n} x}}{\left(\frac{ka}{n}\right)^2} \cdot\frac{a}{n}\] \[\small g_2(x,a,n)=\frac2{\pi}\sum_{k=1}^{n}g(x,a,n,k)\] として定めて,\(\small x\) の値を変えるごとに \(\small g_2(x,a,n)\) の 値を求めてプロットしてみましょう. \(\small g_2(x,a,n)\) は,\(\small g(x,a,n,k)\) を定義済みとすると 次のように定義されます. g2(x,a,n):=(2/%pi)\(\small *\)sum(g(x,a,n,k),k,1,n) 区間 \(\small [-2, 2]\) で \(\small \varDelta \omega=0.1\) となるような 刻み幅で考えるものとします.\(\small a\to\infty\) ですが, 値を大きくすると計算時間もかかるので \(\small (a, n)\) の組合せは \(\small (2, 20), (3, 30), (5, 50)\) で考えてみます.連続関数としてではなく,指定された区間内の分点での \(\small g_2(x,a,n)\) の 値を繋いでいくことになります.このような離散的なグラフは, 「discrete」を指定して点 \(\small (x_i, y_i)\) を繋いでいくことで 描画されます. plot2d([discrete, 分点のリスト, 値のリスト], xの範囲, yの範囲) 積分の刻み幅を \(\small 0.1\) として, 区間 \(\small [-2, 2]\) の分点も同じ刻み幅で考えると, \(\small -2, -1.9, -1.8,\ldots, 2\) となりますが, この値の列(分点のリスト)は 「makelist(-2+0.1\(\small *\)i, i, 0, 40)」により生成されます. 対応する \(\small g_2(x,a,n)\) の値の列も同様の書式で 「makelist(g2(-2+0.1\(\small *\)i,a,n),i,0,40)」により生成されます. 下図は,\(\small f2(x)\) のグラフと,\(\small (a, n)\) が \(\small (2, 20), (3, 30), (5, 50)\) の場合のグラフを描画したものです. \(\small a\) の値が増えるごとに,つまり積分範囲が広がるごとに \(\small f_2(x)\) のグラフに近づいていくことが分かります. 上図は,下記のコマンドで描画しています.ちなみに,\(\small (a,n)=(5,50)\) の場合のグラフを描画するには, \(\small [-2,2]\) 内の40個の分点で \(\small g2(x,5,50)\) の値を計算する 必要があり,個々の \(\small g2(x,5,50)\) の値は 積分範囲 \(\small [0,5]\) での定積分の値を数値積分で \(\small n=50\) の和を求めて計算しています. \(\small a\to\infty\) であるからといって, \(\small a, n\) をあまり大きな値で試すと,最近のPCといえどもかなりの 計算時間がかかるので気をつけて下さい. |
|
ラプラス変換 |
|
■ラプラス変換と逆変換 ラプラス変換は,\(\small t\geq 0\) で定義された関数 \(\small f(t)\) に 対して次の無限積分で定義されます.\(\small s\) は複素数です. \(\small f(t)\) のラプラス変換を \(\small \mathcal{L}\left\{f(t)\right\}\) で表します. \[\small \mathcal{L}\left\{f(t)\right\}=\int_0^{\infty}f(t)e^{-st}\,dt=F(s)\] この積分を計算すると,\(\small f(t)\) に関する微分・積分の計算が \(\small F(s)\) では \(\small s\) を掛ける, \(\small s\) で割るということに対応します. \[\small \mathcal{L}\left\{f'(t)\right\}=sF(s)-f(0)\] \[\small \mathcal{L}\left\{\int_0^t{f(t)\,dt}\right\}=\frac1{s}F(s)\] したがって,\(\small f(t)\) に関する微分方程式や積分方程式が, ラプラス変換を行うと \(\small F(s)\) と \(\small s\) との単なる 乗除の代数式に変換されます. その代数式を解いて \(\small F(s)\) を求めて, ラプラス変換の逆計算をすることで \(\small f(t)\) を求めることができます. \(\small F(s)\) から \(\small f(t)\) を求めることをラプラス逆変換といい, 次の記号で表します. \[\small \mathcal{L}^{-1}\left\{F(s)\right\}=f(t)\] Maximaでは,関数 \(\small f(t)\) の ラプラス変換を求めるコマンドは「laplace(f(t),t,s)」, 逆ラプラス変換を求めるコマンドは「ilt(F(s),s,t)」です. |
|
■基本的関数のラプラス変換 以下に具体例を示します.新たなパッケージを読み込む必要はありません. 上図では,上から順に,基本的な関数である \(\small a(定数),t^2,e^{at},\sin(at),\cosh(at)\) の ラプラス変換が求められています。 上図では,微分 \(\small x'(t)\) と積分 \(\small\displaystyle \int_0^t x(u)\,du\) の ラプラス変換を,具体的な関数ではなく一般形で求めています. 「diff」や「integrate」は微分や積分の計算結果を返しますが, 「'diff」や「'integrate」とすると微分や積分の記号で表します. 「laplace」の引数として利用するときは, 微分や積分の記号で入力するため「'」をつけた形で利用します. また,積分の場合は,積分変数は \(\small t, s\) 以外の 文字を使用し,積分の上端は \(\small t\) とします. 上図では,指数関数 \(\small e^{at}\) との積として, \(\small t^2e^{at}, e^{at}\cos{bt}\) のラプラス変換が求められています. 上図にあるように,デルタ関数 \(\small \delta(t-a)\), 単位ステップ関数(unit_step(t-a))を含んでいてもかまいません. (%i12)では,コマンドを入力すると \(\small a\) の符号が問われるので, 正(positive)であることを示すために「pos」を入力します. 単に「p」だけでもかまいません. (%i13)では,単位ステップ関数の積分を扱うために, 自動的にパッケージ「abs_integrate」が読み込まれたことを示してます. (%i14)では,畳み込み積分 \(\small\displaystyle \int_0^tf(x)g(t-x)\,dx\) のラプラス変換を求めています. \(\small f(t), g(t)\) の畳み込み積分は記号 \(\small f(t)*g(t)\) で表されます. (%i14)の右側が省略されていますが,下記の式です. (%i14) laplace('integrate(f(x)\(\small *\)g(t-x),x,0,t),t,s); (%o14)から,畳み込み積分について次のことが成り立ちます. \[\small \mathcal{L}\left\{f(t)*g(t)\right\} =\mathcal{L}\left\{f(t)\right\}\mathcal{L}\left\{g(t)\right\}\] |
|
■ラプラス逆変換 ラプラス変換 \(\small F(x)\) からもとの関数 \(\small f(t)\) を求めることを ラプラス逆変換といい \(\small \mathcal{L}^{-1}\left\{F(s)\right\}=f(t)\) で 表します.ラプラス逆変換のコマンドは「ilt」です. 通常は,基本的な関数の \(\small f(t)\) と \(\small F(s)\) との 対応関係を逆に見ることで計算します. 基本的関数のラプラス変換のラプラス逆変換を求めると,下図の通りです. (%o15)は \(\small \mathcal{L}^{-1}\left\{\frac2{s^3}\right\}=t^2\) を示しています.(%o16)は \(\small \cosh{at}\) という形では表示されませんが, この結果は双曲余弦関数を示しています. (%i17)の計算はなされずコマンドがそのまま返されています. (%i13)と(%o13)の関係から, 本来は単位ステップ関数 unit_step(t) が返されるべきです. ラプラス変換の性質には \[\small \mathcal{L}\left\{f(t-a)\right\}=e^{-as}F(s)\] という性質があるので,\(\small e^{-as}/s\) の逆ラプラス変換は, \(\small 1/s\) の逆ラプラス変換を \(\small a\) だけ平行移動した関数です. そこで,(%i18)により \(\small 1/s\) の逆ラプラス変換を考えると \(\small \mathcal{L}^{-1}\left\{\frac1{s}\right\}=1\) となります. 単位ステップ関数(unit_step(t))である \(\small \Theta(t)\) としては表示されません. しかし,ラプラス変換での関数 \(\small f(t)\) は \(\small t\geq 0\) の場合を考え,\(\small t<0\) のときは「0」である関数を考えているので, (%o18)は, \(\small 1/s\) の逆ラプラス変換は単位ステップ関数 \(\small \Theta(t)\) であることを示しています.したがって, \(\small e^{-as}/s\) の逆変換は単位ステップ関数を \(\small a\) だけ 平行移動した関数 \(\small \Theta(t-a)\) であることが分かり,(%i13)と一致します. このように,全てをMaximaに任せないで, Maximaが結果を返さないときや,返ってきた結果に疑問を感じるときは, それを注意深く点検して自分で考えることが必要です. もう少し複雑にして, \[\small F(s)=\frac{s+1}{s^2(s^2+1)}\] の逆ラプラス変換を求めてみましょう. Maximaのコマンド「ilt」を利用すると(%i19)によりすぐに結果が得られます. ただ,このコマンドは, そのような関数になる理由を理解できた上で利用すべきでしょう. この程度の逆変換は自分で求めることができる必要があります. それには,自分で部分分数に分解できる必要があります. 部分分数分解を行うコマンドは「partfrac」です. 自分の計算結果が正しいかどうかを確認するときに利用するとよいでしょう. (%o20)の式と,ラプラス変換の基本公式を見比べることで, ラプラス逆変換が(%o19)となることが分かります. |
|
■微分方程式の解法 一般に,一つのシステムでは,いろいろなものが次々に変化していきます. 多くの場合,その変化は微分方程式で表されるので,そのシステムを解析するには 次々にいろいろな微分方程式の解を求めていく必要があります. そのために必要とされるのがラプラス変換です. 具体的に,1階線形微分方程式 \(\small ax'(t)+x(t)=\Theta(t),~x(0)=0\) を考えてみましょう.右辺は単位ステップ関数です. なお,(%i23)の右側が切れていますが, 「EQ: a\(\small *\)'diff(x(t),t)+x(t)=unit_step(t)$」です. ここでは,この微分方程式を(%i23)で「EQ」として割り当てます. Maximaは,大文字と小文字を区別します. (%i24)では「atvalue」を用いて \(\small x(0)=0\) を指定しています. (%i25)で微分方程式EQのラプラス変換を求めて,(%i26)で \(\small x(t)\) の ラプラス変換を求めています. 「solve」は,このような式変形のときに利用することもできます. 引数の「%」は,直前の結果である(%o25)のことです. (%i27)では,直前の式の [ ] の内部の右辺(rhs)を取り出しています. 「%[1]」は,「直前の式の[ ]内の1番目の式」ということです. [ ]内に複数の式があるときには,この書式で必要な式を選びます. (%i28)では部分分数に分解しています. 部分分数に分解した式を逆ラプラス変換することで, 求める解 \(\small x(t)\) が求まります. (%o27)に対して「ilt」を利用すると, 部分分数分解をしなくても解を直接求めることができますが, 解を理解する上では部分分数に分解した方が良いでしょう.下図は,「x(t,a):=1-exp(-t/a)$」として関数 \(\small x(t,a)\) を 定義して,\(\small a=0.5, 1, 2\) の場合のグラフです. 「plot2d([x(t,0.5), x(t,1), x(t,2)],[t,0,4],[y,-1,2],[legend,"a=0.5","a=1","a=2"])$」により描画しています. \(\small a\) の値が小さいほど反応が早いことを示しています. 具体的な解を求めたら,そのグラフも確認するよう習慣づけた方が良いでしょう. 今度は,2階線形微分方程式 \(\small x''(t)+2x'(t)+10x(t)=\delta(t)\) を \(\small x(0)=0, x'(0)=0\) という初期条件で考えてみましょう. 右側が切れていますが,(%i30)と(%o33)は次の式です. (%i30) EQ:'diff(x(t),t,2) +2\(\small *\)'diff(x(t),t) +10\(\small *\)x(t)=delta(t)$ (%o33) \(\small \begin{align*} s^2\mathcal{L}(x(t),t,s)&+2s\mathcal{L}(x(t),t,s)\\ &+10\mathcal{L}(x(t),t,s)=1 \end{align*}\) 上図は,下記により描画しました. plot2d(exp(-t)\(\small *\)sin(3\(\small*\)t)/3,[t,0,4],[y,-0.2,0.4])$ なお,ここでは関数の式が簡単なので式を直接入力していますが, (%o36)の式を関数 \(\small f(x)\) として定義するには, 「f(x):=%」では定義できません. 下図の(%o38)にあるように,「%」として定義されたことになります. 出力された式を関数として認識させるには, 「define」を用いて「define(f(t), %o36)」のようにします. 下図にあるように,その定義により \(\small t=0, \frac{\pi}{2}\) での値が正しく求められています. |
|