gnuplotを利用してグラフの作成ロードを駆け抜けよう!
(注) MathJaxを使用しているので、 スマホでは表示に時間がかかることがあります。
モバイル利用(Android)でのメニュー選択は、 SiteMapを利用するか、 「長押し」から「新しいタブを開く」を選択してください。
■ 「gnuplot」によるグラフの作成 [Map] |
| ||
| ||
[御案内] TeXを利用した数学プリントの作成では,
関数のグラフをどのように作成するかは大きな問題です.
ここでは,フリーのグラフ描画ソフト「gnuplot」を用いた
グラフの描画方法とTeXへの取り入れ方について解説します.gnuplotは,
数式処理ソフトMaximaにも組み込まれているソフトです.
離散的な実験データのグラフ化や2変数関数のグラフも描画することができ,
理工系の研究論文の図の作成にも利用されています.
C言語で作成された関数ライブラリーを利用することもできます.
なお,関数のグラフ描画ソフトとしては,gnuplotの他に下記のようなソフトもあります. WinTpic, Ngraph, GRAPES, FunctionView, GeoGebra, Cinderella ★gnuplotを利用しなくても、TeXの中でMetaPostを利用して 立体図形や曲面描画を可能にする「MePoTeX」というマクロパッケージがあります。 その解説ページを作成したので参照してください。 たとえば、 下記のような図をTeXのソースコードの中に簡単に記述でき、 パラパラ漫画まで作成することができます[概要]。最後のグラフは、球面調和関数のグラフです[概要]。 ★このページには数学絡みで訪れる方が多いと思われますが、
| ||
[お知らせ] 下記を出版しました。 PCやスマホで使える数式処理ソフト Maximaの解説書です。 計算問題やグラフ問題の解答を作るときに非常に重宝します。 フリーソフトなので一度試してみてください。 なお、Maximaでのグラフ描画ではgnuplotが利用されています。 PC版Maximaでグラフを描いてeps保存すれば、 数学のプリント作成の際にも利用することができます。
| ||
|
■C言語の利用 |
|
はじめに |
通常使用の場合はgnuplotに登録されている関数で十分と思いますが,
いろいろと複雑な現象を解析しようとすると特殊関数や
高度の数学的な操作が必要になってくるかもしれません.
そのような場合に,C言語で作成された関数をgnuplotの関数として
取り入れることができます.そのような関数ライブラリーとして,
「GNU科学技術計算ライブラリ(GNU Science Library)」があります.
GSLと略記されるようです.
何ができるかは,下記マニュアルの目次を見てみるとよいでしょう.
多様な特殊関数のみならず,線形代数,高速フーリエ変換,数値積分,
各種の乱数や確率分布など,
数学のあらゆる分野にわたる膨大な関数が登録されています.
GNU科学技術計算ライブラリ,リファレンス・マニュアル (578頁) このライブラリーを利用するには,C言語で記述されたソースファイルをコンパイルして,gnuplotで利用できるような形の実行ファイル(dll)を生成する必要があります. gnuplotで利用するにはコマンド「import」を使用します. このコマンドは,gnuplotの ver5.0 以上で取り入れられたコマンドです. 現時点(2020.02.15現在)では ver5.5 がリリースされています.つまり,GSLに登録されている関数を使用するには,以下のことが必要になります.
|
|
幾つかの留意事項 |
上記サイトに書かれている通りに実行したところ,そのサイトで例示されている
\(\small n\) 次の第1種ベッセル関数 \(\small J_n(x)\) のグラフを,
\(\small 0\leq n\leq 5\) についてgnuplotで描画させることができました.
なお,gnuplotの上部メニューで [関数(N)]>[特殊関数] の箇所にもベッセル関数が
ありますが,そこにあるのは \(\small J_0(x), J_1(x)\) と,
第2種ベッセル関数 \(\small Y_n(x)\) の \(\small n=0, 1\) だけです.
以下に,この図を得る作業の中での幾つかの留意点を記しておきます.
同様にすると, GSLに登録されている膨大な関数群を gnuplot でも 利用することができることになります. 私自身は解説サイトに書かれていることを真似ただけですが, 「C」について堪能な方であれば gnuplotで扱うことのできる世界が一気に広がることになるでしょう. |
|
球面調和関数 |
|
はじめに 通常の数学の教科書では触れられることが少ないのですが, 「球面調和関数」という関数があります. 私自身も掲示板[No.5]で質問があったことで詳細を知るようになった関数なのですが, フーリエ級数なみの重要な関数であるようです. 原子の軌道解析やCGにおける光の反射等の計算などで利用され, フーリエ級数の基底としての三角関数と同じような正規直交性があります. 球面上の任意の関数を球面調和関数で展開することができるようであり, それにより膨大な情報を幾つかの係数値に圧縮することができるようです. 詳しくはMaximaでの解説 を参照してください. この関数を gnuplot で扱ってみようと思います. この関数は,次のような式で定義される関数です. \[\small \begin{align*} Y_l^m(\theta,\phi) &=(-1)^{\frac{m+|m|}{2}}\sqrt{l+\frac12}\\ &\times\sqrt{\frac{(l-|m|)!}{(l+|m|)!}} P_l^m(\cos\theta)\\ &\times \frac1{\sqrt{2\pi}}e^{im\phi} \end{align*} \] ここで,\(\small P_l^m(x)\) はルジャンドルの培関数と呼ばれる関数で, ルジャンドルの多項式を \[\small P_l(x)=\frac1{2^ll!}\frac{d^l}{dx^l}(x^2-1)^l\] とするとき,次の式で定義されます. \[\small P_l^m(x)=(1-x^2)^{\frac{|m|}{2}}\frac{d^{|m|}}{dx^{|m|}}P_l(x)\] 要するに,関数の定義自体に高次導関数の高次導関数を含むので, この式を直接 gnuplot に打ち込むことはできません. ただし,GSLには,ルジャンドルの培関数が登録されています. gnuplot は複素数も扱うことができるので, ルジャンドルの培関数を gnuplot で利用できれば, この球面調和関数も扱うことが可能になります.gnuplotによる球面調和関数のグラフを描画しているサイトもありますが, そこでは \(\small l, m\) を決めて計算された具体的な関数式のグラフが 描画されています(参照). gnuplotでルジャンドルの培関数を利用することができると, 任意の \(\small l, m\) について 関数式を知ることなくグラフを直接描画することができます. |
|
Cプログラムの作成 球面調和関数は,GSLのリファレンス・マニュアルによれば 「2.24.2 ルジャンドルの培関数と球面調和関数」(p.77)の箇所で解説されています. それによると、\(\small P_l^m(x)\) の計算では \(\small l, m\) が両方大きくなると (概ね \(\small l\geq 150\)) オーバーフローが生じるので, 正規化された「gsl_sf_legendre_sphPlm(l,m,x)」を使用することが推奨されています. 「正規化されたルジャンドルの培関数」は,次の式で定義されます. \[\small \sqrt{\frac{2l+1}{4\pi}}\sqrt{\frac{(l-m)!}{(l+m)!}}P_l^m(x)\] \(\small l,m\) は整数で \(\small m\geq 0, l\geq m, |x|\leq 1\) であることが 必要です.\(\small m\lt 0\) のときは利用できませんが,球面調和関数の性質 として \[\small Y_{l,-m}(\theta,\phi)=(-1)^mY_{lm}^{*}(\theta,\phi)\] という性質を利用することで対応可能です.右辺は複素共役です. この関数を利用するためのCプログラムは, 「C言語の利用」の箇所で提示したサイトにしたがい, ベッセル関数のときのプログラムを球面調和関数に合わせて修正するだけです( 参照). そのサイトでは,ベッセル関数でのプログラム例として下記が提示されています.
|
|
dllの生成とインポート 次に,作成したCプログラムをMinGWでコンパイルします. その手順は下記の通りです. (MinGWのインストールや利用法はこちらを参照。)
生成した「gsl_sphPlm.dll」をgnuplotで使用するには, そのファイルを「import」する必要があります. その手順は下記の通りです.
|
|
グラフの描画 生成した正規化されたルジャンドルの培関数「sphPlm(l,m,x)」を利用して, 球面調和関数のグラフを描画してみましょう. 最初に,正規化されたルジャンドルの培関数のグラフを確認しておきます. 下図では,定義域 \(\small [-1:1]\) を指定しないで「plot」を実行すると エラーが生じて「gnuplot」が強制終了されるので気をつけてください. スマホでのモバイル表示の関係で改行していますが, 実際には1行で入力してかまいません. gnuplotでは,「\」の後に[enter]とすると, 改行しながらコマンドを入力することができます. ここでは,正規化されたルジャンドルの培関数 \(\small P_2^0(x), P_2^1(x), P_2^2(x)\) のグラフが描画されています. 以下では,球面調和関数を定義しますが, 「正規化されたルジャンドルの培関数」が利用されているので, 最初に記述した定義式と定数部分の違いがあります. gnuplotでは球座標や円柱座標のまま関数のグラフを描画することはできません. 球面調和関数は球座標で表される式なので, そのグラフを確認するためには媒介変数を用います. 極方程式 \(\small r=f(\theta,\phi)\) を媒介変数表示すると, \[\begin{cases} \small x=f(\theta,\phi)\sin\theta\cos\phi\\ \small y=f(\theta,\phi)\sin\theta\sin\phi\\ \small z=f(\theta,\phi)\cos\theta \end{cases}\] ですが, gnuplotで2変数の媒介変数は \(\small u, v\) を使用する必要があるので, 次のようになります.下図は, 球面調和関数のグラフとしてよく例示される \(\small Y_2^0\) の グラフです.\(\small \phi=0\) なので,これは実関数として \[\small Y_2^0(\theta,\phi)=\frac14\sqrt{\frac{5}{\pi}}(3\cos^2\theta-1)\] により表される関数です.正規化されたルジャンドルの培関数を利用しているので, 具体的な関数の式を入力する必要はありません. |
【参考】gnuplotは,球座標のままでグラフ表示することはできませんが, 平面の極座標であれば極方程式のままグラフを表示することができます. 下図は,\(\small y(2,0,\theta,\phi)\) について,\(\small \phi=0\) の場合, つまり \(\small xz\)平面による断面図を極座標で描画したものです. 極座標の変数は \(\small t\) を用いる必要があります. \(\small \theta\) は \(\small z\) 軸からの角ですが, 平面の極座標の場合は始線からの角になります. この図を横軸を中心軸に回転したものが \(\small y(2,0,\theta,\phi)\) のグラフです.以下では,\(\small f(u,v)=y(2,0,u,v)\) の指定が引き継がれています. |
下図は,\(\small |Y_2^1|\) のグラフです.上記の極座標を試した場合は polar, xrange, yrange を「unset」で解除した後に 改めて「set parametric」を実行してから下記を行ってください. 下図は \(\small Y_5^4\) の実部 (\(\small {\rm real}\,(y(5,4,u,v))\)) のグラフです. |
|
(参考) ベッセル関数 |
一般に,ベッセル関数は,ベッセルの微分方程式 \[\small x^2y''+xy'+(x^2-\alpha^2)y=0\] の特殊解 \(\small J_{\alpha}(x), Y_{\alpha}(x)\) として定義され,一般解は \[\small y=c_1J_{\alpha}(x)+c_2Y_{\alpha}(x)\] として表されます.\(\small J_{\alpha}(x), Y_{\alpha}(x)\) は, それぞれ第1種のベッセル関数,第2種のベッセル関数と呼ばれており, 具体的には次の式で表されます.実際には \(\small \alpha\) が整数の場合を 扱うことになります(参考1, 参考2). \[\small \begin{align*} J_{\alpha}(x) &=\sum_{n=0}^{\infty}\frac{(-1)^n}{n! \Gamma(n+\alpha+1)}\left(\frac{x}{2}\right)^{2n+\alpha}\\ Y_{\alpha}(x) &=\frac{J_{\alpha}(x)\cos(\alpha \pi)-J_{-\alpha}(x)}{\sin\alpha\pi} \end{align*} \] |
■「gnuplot」のリンク集 |
ここでは,gnuplotの利用法を解説しているWebサイトを紹介します.
|