2014/06/26(木)kv-0.4.6

kvライブラリを0.4.6にversion upしました。

affine arithmeticでは、丸め誤差の扱い方が3通りあり、
-DAFFINE_SIMPLE=1
のようにコンパイル時に指定すると動作を変えることが出来ます。1がdefaultで、他に遅いけどより精密な0、速いけど精度が悪い2があります。ここに2を指定したときの乗算で、変数の初期化忘れのせいで計算が正常に行えていませんでした。2は全くダミー変数を増やさないaffine arithmeticであまり使うことはないと思われますが、「計算結果の精度保証に影響を及ぼすバグ」はあってはならないものであり、そういうバグを見つけたときは速やかにアップデートすると決めています。

他に、日本語コメントを大幅に削除したり、allsol系の関数名を整理したり、Visual Studio 2013でいつの間にかいくつかのファイルがコンパイルできなくなっていたので修正したりしました。

allsol系のファイルを重複してincludeすることが可能になったので、kvライブラリに含まれる全てのheader fileをincludeするall.hppを作ったりもしました。コンパイルが遅くなるのでまあ使うことはないでしょうけど。

2014/06/13(金)なぜ自分のプログラム(ソースコード)を公開するのか

今回は、自分のプログラム(ソースコード)をなぜ公開しようと決心したかについてお話します。

我々は、精度保証付き数値計算という分野について日夜研究を行っています。精度保証付き数値計算は、数値計算をすると同時にその誤差を数学的に厳密に評価出来るような新しい数値計算法です。数学の証明の一部に使える信頼性を持ち、実際いくつもの問題が精度保証付き数値計算を援用して解かれています。

ところで、我々の分野の研究発表なり論文で、ソースコードを公開しているものは非常に少ないです。このことがこの分野の普及の妨げになっていると考えられ、それはそれで大変に大きな問題ですが、今回は少し違う観点で考えてみます。

精度保証付き数値計算の発表なり論文では、「精度保証付き数値計算を用いて○○という問題を解き、△△の範囲内に解が存在することが厳密に保証された。」というふうな言い方がよくされます。正直に申し上げると、本当に自分のプログラムにミスが無いと言えるのか、完全な自信があるわけではありません。他人の成果を見て何か怪しいんじゃないのと思ったことも一度や二度ではありません。プログラムにバグが無いことを保証してくれる何かが無いと、厳密に保証されたとは言えないのではないか。

しかし、よく考えるとこれは数学の定理の証明も同じことで、数学者もミスはするし、定理の正しさは大勢の数学者の検証によって(場合によっては長い時間をかけて)正しいかどうかの評価が確定するのです。

精度保証付き数値計算での計算結果の厳密性を保証するのは、論文に書かれた理論と、それを実装したプログラムです。両者を検証して初めてその正しさが分かるのに、プログラムを公開していなかったらチェックのしようがありません。数学の定理の証明でその一部が黒塗りで塗りつぶされているようなものがあったとして、それを正しい証明と認められるでしょうか。

知り合いの研究者から、「理論も本当に大事なところは書かないことがある。ましてやソースコードなど出せない。大事なテクニックが盗まれてしまう」という話を聞いたことがあります。仮にも解の正しさを「証明した」と謳う精度保証付き数値計算で、こんなことがありえるのか、と思います。

以上のような考えのもとに、今後自分が何らかの発表をするときのソースコードは全て公開し、全世界の人々の審判の目に晒されることを覚悟しようと思います。この分野の全研究者がソースコードを公開するようになって欲しいのですが、まず自分から始めないと、と考えました。

ご意見、反論があれば是非お願いします。

また、今後査読が回ってきたとき、ソースコードの非公開を理由にrejectする、というような過激なことも考えています。これに関してもご意見をお願いします。

2014/06/13 石垣島から羽田に向かう機内にて

2014/06/11(水)NAS2014

第43回数値解析シンポジウム (NAS2014) で石垣島に来ています。

今回から、発表に関する資料はなるべく公開したいと考えていて、
ここに関連資料をアップロードします。
  • nas2014.pdf 予稿の原稿です。mul_up/down(対策後)の誤植を修正しています。
  • test-nohwround.cpp 丸め変更を行った場合と結果が一致することを確認するのに使ったプログラムです。
  • bench.cpp 個々の演算のベンチマークに使ったファイルです。
  • fivesol.zip 5つの解を持つ回路方程式の全解探索のベンチマークに使ったプログラムです。コンパイルオプションは、-O3 -DNDEBUG -DKV_NOHWROUND (最後のオプションを付けると丸めモードを変更しない本発表の方法)
  • nas2014-slide.pdf 発表スライド
fivesol.zipは、kvライブラリのうち必要なものを抜粋したサブセットを含んでいます。

2014/06/06(金)kv-0.4.5

前回からあまり間が開いていないけど、kvライブラリを0.4.5にしました。

主な変更は、数値積分や常微分方程式のstep size controlに関する部分です。
また、digamma (gamma関数の対数微分) も追加しました。
digammaを作っていて内部で使っている数値積分の甘さが気になったのでちゃんと書きたくなった、
というのがstep size controlをいじった動機です。
digammaは元々gammaの改善が目的だったけれど、gammaはまだ特に変わっていません。

また、数値積分の使い方について詳細に記述しました。

他の機能についても詳細に記述したいところだけど、いつになることやら。

lobachevsky, gamma, digammaとそれぞれ異なる特異積分のテクニックを含んでおり、そのへんを汎用的な手法として整理するのもそろそろやりたいところだなあ。

2014/06/02(月)gamma関数とdigamma関数

ひとりごと。

gamma関数を以前作ったけど、微分が0になる位置を正確に計算できなかったので、
特に負の領域で満足の出来ないものだった。(大きい区間幅の入力に弱い)

某R先生もgamma関数を作ってるけど、こちらは微分が0になる位置を数表で持っていて、
それは数式処理ソフトで作っているようで、少しずるい感じ。
その数式処理ソフトは精度保証されているのか? 単なる高精度計算である可能性は?

精度保証を行うソフトウェアは、その計算結果が精度保証出来ていると思えるための理由を
そのソフトウェア自身の中に持っていて欲しい気がする。

そのへんを完全にするために、digamma関数を何となく作り始めて、何となく動いた気がした。
-digamma(1) = γ (0.5772...=オイラー定数)
らしいので、オイラー定数の精度保証もついでに出来たことになる?
OK キャンセル 確認 その他