関数cneuman マニュアル

(The documentation of function cneuman)

Last Update: 2023/11/14


◆機能・用途(Purpose)

複素変数に対するノイマン関数を計算する。
Compute the Neuman function for a complex variable.

ノイマン関数は \[\begin{equation} N_n(z)=\lim_{\nu\rightarrow n} \frac{\cos(\nu\pi)J_{\nu}(z)-J_{-\nu}(z)}{\sin(\nu\pi)} \label{eq.Neuman} \end{equation}\] によって定義される。ここで \[\begin{equation} J_{\nu}(z)=\left(\frac{z}{2}\right)^{\nu} \sum_{k=0}^{\infty}\frac{(-1)^k (z/2)^{2k}}{k!\Gamma(\nu+k+1)} \label{eq.Bessel} \end{equation}\] はベッセル関数、 \[\begin{equation} \Gamma(z)=\int_0^{\infty}e^{-t}t^{z-1}dt \label{eq.Gamma} \end{equation}\] はガンマ関数である。
The Neuman function is defined by Eq. (\ref{eq.Neuman}), where \(J_{\nu}(z)\) is a Bessel function (Eq. \ref{eq.Bessel}) and \(\Gamma(z)\) is a Gamma function (Eq. \ref{eq.Gamma}).


◆形式(Format)

#include <mathfunc.h>
inline double complex cneuman(const int n,const double complex z)


◆引数(Arguments)

n ノイマン関数\(N_n(z)\)の次数\(n\)。非負でなければならない。
The order \(n\) of the Neuman function \(N_n(z)\), which must be non-negative.
z ノイマン関数\(N_n(z)\)の引数\(z\)の値。 \(z\)が実数の場合、\(0<z<35\)の範囲を推奨する。 複素数値については適切な値の範囲をチェックできていない。
The value of the argument \(z\) for the Neuman function \(N_n(z)\). For real \(z\), a range \(0<z<35\) is recommended. An appropriate range for complex \(z\) has not been examined.


◆戻り値(Return value)

引数で指定した\(n\)と\(z\)の組に対する\(N_n(z)\)の値。
The value of \(N_n(z)\) for \(n\) and \(z\) specified by the arguments.


◆使用例(Example)

double complex N=cneuman(1,0.5);


◆計算方法(Computation method)

●概要 (Outline)

\(n=0,1\)に対しては級数表示 \[\begin{eqnarray} N_n(z) &=& \frac{2}{\pi}J_n(z)\ln\frac{z}{2} \nonumber \\ & & -\frac{1}{\pi}\left(\frac{z}{2}\right)^{-n} \sum_{k=0}^{n-1}\frac{(n-k-1)!}{k!}\left(\frac{z}{2}\right)^{2k} \nonumber \\ & & -\frac{1}{\pi}\left(\frac{z}{2}\right)^n \sum_{k=0}^{\infty}\frac{(-1)^k\left(\frac{z}{2}\right)^{2k}}{k!(n+k)!} [\psi(k)+\psi(k+n)] \label{eq.summation} \end{eqnarray}\] \[\begin{equation} \psi(k)=-\gamma+\sum_{l=1}^k\frac{1}{l} \label{eq.psi} \end{equation}\] \[\begin{equation} \gamma=0.57721566 \label{eq.gamma} \end{equation}\] を用いる。\(n \geqq 2\)に対しては漸化式 \[\begin{equation} N_{m-1}(z)+N_{m+1}(z)=\frac{2m}{z}N_m(z) \label{eq.recursive} \end{equation}\] を用いる。
For \(n=\) 0 and 1, a series expansion formula given as Eqs. (\ref{eq.summation})-(\ref{eq.gamma}) is used. For \(n \geqq 2\), a recursive formula (\ref{eq.recursive}) is used.


●計算式の簡単化 (Simplified formula)

(\ref{eq.summation})式を用いるのは\(n=0,1\)に対してだけであるので 具体的に書き下すとより簡単になる。\(n=0\)に対する式は \[\begin{equation} N_0(z)=\frac{2}{\pi}J_0(z)\ln\frac{z}{2} -\frac{2}{\pi} \sum_{k=0}^{\infty}\frac{(-1)^k\left(\frac{z}{2}\right)^{2k}}{(k!)^2}\psi(k) \label{eq.summation.n0} \end{equation}\] \(n=1\)に対する式は \[\begin{equation} N_1(z)=\frac{2}{\pi}J_1(z)\ln\frac{z}{2}-\frac{2}{\pi z} -\frac{z}{2\pi} \sum_{k=0}^{\infty}\frac{(-1)^k\left(\frac{z}{2}\right)^{2k}}{k!(k+1)!} [\psi(k)+\psi(k+1)] \label{eq.summation.n1} \end{equation}\] である。
Because Eq. (\ref{eq.summation}) is used only for \(n=\) 0 and 1, explicit formulas for these \(n\) values are simpler than the original ones. The formulas for \(n=\) 0 and 1 are given by Eqs. (\ref{eq.summation.n0}) and (\ref{eq.summation.n1}), respectively.


●無限級数の扱い (Treatment of the infinite series)

(\ref{eq.summation.n0})(\ref{eq.summation.n1})式には無限級数が登場する。 これに対するプログラム内部の扱いとしては、 新たに加わる項の大きさがそれまでの項の和の\(10^{-10}\)倍を下回ったら ループを抜けるという処理にしている。
An infinite series appears in Eqs. (\ref{eq.summation.n0}) and (\ref{eq.summation.n1}). In the program, the summation is taken until the newly added term becomes smaller than \(10^{-10}\) times the summation.


●オーバーフローの回避 (Avoiding an over flow)

(\ref{eq.summation.n0})(\ref{eq.summation.n1})式に登場する \((z/2)^{2k}\)や\(k!\)などを別々に計算すると オーバーフローが起きる危険が増すので、 このプログラムでは\(\psi\)に掛かる係数全体をfactorという名前の変数で表現している。 この変数の初期値を1とし、 \(k\)が1増えるごとにこの変数に\(-(z/2)^2/\{k(k+n)\}\)を掛けるようにすれば オーバーフローを回避しながらfactorを計算することが容易になる。
Individual computations of \((z/2)^{2k}\) and \(k!\) in Eqs. (\ref{eq.summation.n0}) and (\ref{eq.summation.n1}) involve a high risk of overflow. To avoid this, the program uses a variable named “factor”, which represents the entire factor that is multiplied with \(\psi\). This value is initialized at 1 and multiplied by \(-(z/2)^2/\{k(k+n)\}\) for each \(k\) in the loop. In this way, the variable “factor” can easily be computed without a overflow.


◆使用上の注意(Note)

\((z/2)^{2k}\)と比較して\(k\)が小さいときには\(k!\)の大きくなるスピードは緩やかで、 大きな\(k\)になるほど\(k!\)は相対的に急激に成長するようになる。 その結果、(\ref{eq.summation.n0})(\ref{eq.summation.n1})式に登場する 無限級数の項の大きさはある\(k\)までは増加の一途を辿り、 \(k\)がある程度以上大きくなると減少に転じる。 無限級数の各項には\((-1)^k\)が掛かっているので 大きな項も打ち消し合って最終的には小さな値に落ち着く。 但し、計算の途中であまりにも大きな項が登場すると打ち消し合う際に桁落ちが生じ、 計算の精度が悪くなる。 double型変数の有効桁数が15桁程度であるので、 最終的な和の値に比べて15桁以上大きな項同士が打ち消し合う状況が発生すると 計算は事実上不可能になる。 \(z\)の値が大きいほどこのようなことは起こりやすい。 \(z\)として正の実数値を用いた数値計算の結果では \(n\)によらずおおよそ\(z\sim 38\)でこの問題が起きた。 このことからこの関数では\(|z| \geqq 35\)の場合に警告を出す仕様にしている。 しかしながら、\(z\)が複素数の場合にどのような\(z\)において 問題が起きるのかは未検証である。
Compared to \((z/2)^{2k}\), \(k!\) relatively slowly increases for a small \(k\) but the growing speed of \(k!\) rapidly increases for a large \(k\). As a result, a term in the infinite series in Eqs. (\ref{eq.summation.n0}) and (\ref{eq.summation.n1}) increases until a certain \(k\), after which the term decreases. Since \((-1)^k\) appears in each term, large terms cancels out, resulting in a small final summation value. However, if a term appearing in the summation is too large, the summation results in a cancellation of significant digits, which worsens the accuracy of the computation result. Because a double-type variable has an accuracy of approximately 15 digits, if terms which are by 15 orders larger than the final summation value cancel out, the final result is completely a numerical noise. This situation more likely occurs for larger \(z\). According to a numerical simulation using a positive real \(z\), this problem occurred at \(z\sim 38\) regardless of the \(n\) value. Therefore this function warns if \(|z| \geqq 35\). However, no test have been conducted for a complex \(z\) value.