2014/08/01(金)kv-0.4.8
newton.hppをちょっと直した、mpfrのラッパーを書いた、ODEの初期値問題の使い方を詳細に書いた、くらいが主な変更です。
ODEの初期値問題はいろいろな解法を試したかったせいで多数のプログラムを作成しており、自分でも思い出しながら使い方を書くのは大変でした。初期値問題のみで、それを使った境界値問題や周期解の問題に対するshooting methodの話はまだです。これらも早く書きたい。
また、MPFRの簡単なラッパーを書き、interval型の両端の数として使えるように整えて、double, dd以外の第3の選択肢を提供しました。以前boost.intervalにmpfrcppを組み合わせて出来ていたことが出来なくなっていたので、早く書きたいと思っていたライブラリの一つです。ラッパーそのものはほぼ一日で書き上がりました。
重めの全解探索問題 (example/test-nishi.cc の5つの解を持つ非線形回路方程式) でベンチマークを取ってみました。
5.96sec (double, -DKV_FASTROUND -DNDEBUG -O3)
29.9sec (dd, -DKV_FASTROUND -DNDEBUG -O3)
326sec (mpfr<53>, -DNDEBUG -O3)
415sec (mpfr<106>, -DNDEBUG -O3)
これを見ると、53bit (doubleと同じ) や106bit (ddと同じ) くらいの精度では遅すぎてMPFRを使う意味はなさそうです。106bitよりも更に高精度が必要な問題に対して仕方なく使うような感じでしょうか。
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/27(日)ubuntu 14.04その後
時計が10.04と同じじゃないと不安なので。
時刻と日付の設定→時計 で、時計の表示設定の「曜日」と「月日」をクリック。
bashのファイル名補完がccとc++に対してなぜか効かない(gccとかg++なら効く)。
/usr/share/bash-completion/completions/gcc
に、
complete -F _gcc cc c++
を加えた。この対処で正しいかどうかは謎。
terminalを複数開いているといつの間にかかな漢字変換が起動できなくなってしまう問題。
terminalは一つしか開かずにタブ切り替えしてれば問題は起きないことが分かった。むしろ慣れたらタブの方がいいや。
mpfr遊びするために、
sudo apt-get install libgmp-dev
sudo apt-get install libgmp10-doc
sudo apt-get install libmpfr-dev
sudo apt-get install libmpfr-doc
それぞれ5.1.3と3.1.2が入った。
sudoを使うと、
no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory
とか表示されるのは直らず。多分sambaを入れると起きる。実害はなさそう?なので放置。
こんなもんかなあ。実によく動いてくれている。
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を作ったりもしました。コンパイルが遅くなるのでまあ使うことはないでしょうけど。