2014/07/29(火)数値解析セミナー
力学系の解析に常微分方程式の精度保証を使っている話で、いろいろ勉強になると思ったからです。
講演の前半で、
http://www.sciencedirect.com/science/article/pii/S016727890200372X
の論文の7章で数値的に捉えられた周期解を精度保証した例が出てきました。
微分方程式
の周期解をというポアンカレ断面を用いたポアンカレマップの不動点として精度保証するものです。
講演を聞きながら手を動かして精度保証してみようということで頑張ったら、何とか出来ました。
craik.zip
これが聞きながら作ったファイルです。これとkvライブラリがあれば動くはずです。実行すると、
x: [8.0430011130278842,8.0430011130790487]
y: [0.49999999999907257,0.50000000000095291]
z: [-7.0430011130790469,-7.043001113027886]
t: [2.5356798931197284,2.5356798931353897])
が精度保証された解として見つかりました。(x,y,z)はポアンカレ断面上の点で、tが周期です。
Taylor展開の次数は30次ほど必要で、結構難しめの問題でした。
ポアンカレマップに対してKrawczyk法を用いて周期解を精度保証するライブラリは出来ているのですが、
これに関するドキュメントが未整備で自分しか使えない状態になっているのが問題。早く書かないとなあ。
2014/07/20(日)kv-0.4.7
autodifで x *= 2; みたいなコードがコンパイル出来ないバグが見つかったので、アップデートしました。
偶然この形 (*=演算子で定数倍) は使って無かったので気づいていませんでした。
それ以外には、allsolの引数順序がx,fだったのをf, xに変えたとか、allsolやodeのドキュメントを書いたくらい。
ところで、本ライブラリはC++03の機能の範囲で書いているのですが、C++11の機能が使えると嬉しい箇所が何箇所もあって気になっています。まとまった時間があったらC++11に移行したいなあ。その場合C++03は切り捨てるつもり。
2014/06/26(木)kv-0.4.6
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
今回から、発表に関する資料はなるべく公開したいと考えていて、
ここに関連資料をアップロードします。
- nas2014.pdf 予稿の原稿です。mul_up/down(対策後)の誤植を修正しています。
- test-nohwround.cpp 丸め変更を行った場合と結果が一致することを確認するのに使ったプログラムです。
- bench.cpp 個々の演算のベンチマークに使ったファイルです。
- fivesol.zip 5つの解を持つ回路方程式の全解探索のベンチマークに使ったプログラムです。コンパイルオプションは、-O3 -DNDEBUG -DKV_NOHWROUND (最後のオプションを付けると丸めモードを変更しない本発表の方法)
- nas2014-slide.pdf 発表スライド