奥村 晴彦:[改訂新版] C 言語による標準アルゴリズム事典

作成日 : 2018-10-26
最終更新日 :

まとめ

前著「C言語による最新アルゴリズム事典」 の改訂新版。

称賛

前著は非常に役にたっているが、残念ながらグラフィックスの部分が PC-9801 シリーズを前提としていたため、 陳腐化してしまっていた。 著者はこの点を改良し、ドロー系は SVG や EPS で、 ペイント系は BMP で表す方法に書き直している。これはありがたい。 また、前著でいくつかあった誤植も訂正されている。 なお、タイトル名称は「最新」アルゴリズム事典から「標準」アルゴリズム事典に替わっている。

たらいまわし関数

p.186 に「たらいまわし関数」が掲載されている。<特に用途はない>と記載されているが、ではなぜ前著で掲載されたのか、気になっていた。 その疑問は、 数学セミナー 2019 年 2 月号の竹内郁夫氏の記事によって氷解したのだった。

補足

ポリトープ法

前著の評で書いたことを補足する。これは、 「このような連続な偏導関数を持つ問題にはもっと収束の速い方法がある」の具体例である。 本書で例に挙げられた最小化すべき関数の形は次の通りである :

`f(M, gamma, h, b, a) = sum_(i=1)^11(g_i(x;M,gamma,h,b,a)- y_i)^2`
`g_i(x;M, gamma, h, b, a) = (h gamma^2)/((x_i - M)^2 + gamma^2) + b + ax_i ( i = 1, cdots, 11)`

パラメータ、`M, gamma, h, b, a` のそれぞれの右肩に (r) をつけて反復回数を表すものとする。 ここで、上記最小化すべき関数の形は最小二乗法が適用できる形になっているので、 関数 `g` に関するヤコビ行列 `J_g` およびその転置行列 `J_g^T` を用いて、 パラメータを逐次更新するガウス・ニュートン法が適用できる。

`((M^((r+1))),(gamma^((r+1))),(h^((r+1))),(b^((r+1))),(a^((r+1))))= ((M^((r))),(gamma^((r))),(h^((r))),(b^((r))),(a^((r)))) + (J_g^T J_g)^-1 J_g^T ( (y_1-g(x_1;M^((r)),gamma^((r)), h^((r)), b^((r)), a^((r)))), (y_2-g(x_2;M^((r)),gamma^((r)), h^((r)), b^((r)), a^((r)))),(vdots), (y_n-g(x_n;M^((r)),gamma^((r)), h^((r)), b^((r)), a^((r)))))`
`J_g = (((del g_1)/(del M),cdots,(del g_11)/(M)), ((del g_1)/(del gamma),cdots,(del g_11)/(gamma)), ((del g_1)/(del h),cdots,(del g_11)/(h)), ((del g_1)/(del b),cdots,(del g_11)/(b)), ((del g_1)/(del a),cdots,(del g_11)/(a)))`

ガウス・ニュートン法についてはリンク先参照。

t 分布と不完全ベータ関数

本書 pp.426-428 では `t` 分布の分布関数を求めるアルゴリズムが掲載されている。このプログラムが使えるのは、自由度 df (degree of freedom) が自然数の場合に限られる。自由度が一般に正の非整数でも計算できるようにするには、 同じく本書の pp.232-234 にある不完全ベータ関数を用いればよい。 本書では不完全ベータ関数の項目には `t` 分布が参照先として指示されているが、 `t` 分布の項目には不完全ベータ関数への参照がないので補足した。 なお、本書では、不完全ベータ関数を連分数近似で求める方法が掲載されている。また、非整数を自由度とする t 分布の計算は、 Welch の t 検定で必要となるので重要である。

コンパイルにあたって

本書のソースファイルは、https://github.com/okumuralab/algo-c/tree/main/src で公開されている。 この中にはコンパイルすると警告(Warning)が出るファイルがある。

math.h のインクルード

math.h がインクルードされていないファイルがあるので、インクルードすべき。(binormal.c, poly.c)

if else の曖昧性

if ... if ... else の構文が、else に対応する if は 1 番めか 2 番目かが曖昧。適切に {} をつけるのがよい(squeeze.c, ll.155-157)

static 篇素

static 変数の型が宣言されていない場合がある。static int などと補うべき。(knight.c)

数式

数式には MathJax を用いている。

書誌情報

書名[改訂新版] C 言語による標準アルゴリズム事典
著者奥村 晴彦
発行日2018 年 5 月 8 日 第 2 版 第 1 刷発行
発行元技術評論社
定価2500 円(本体)
サイズA5版 215 ページ
ISBN978-4-7741-9690-9
その他

まりんきょ学問所コンピュータの本アルゴリズム > 奥村 晴彦 : [改訂新版]C言語による標準アルゴリズム事典


MARUYAMA Satosi