最終更新: 2024/8/27
kvライブラリの更新履歴
-
2013/09/18 初版。kv-0.1を公開。
本ドキュメントは圧倒的に不完全だが、とりあえず
4. ファイル構成とtest/以下のファイルを見ればなんとか使い方は分かるのではないか。
-
2013/09/30 kv-0.2。stringtod, stringtoddのbug-fix。その他細かい修正。
ドキュメントが不完全なのは相変わらず。
-
2013/10/30 kv-0.3。psa.hppのbug-fix。その他細かい修正。
ドキュメントは、区間演算、問題の記述あたりを加筆した。
-
2013/12/3 kv-0.4。constants<T>::str()のbug-fix。odeのcallbackの
仕組みを見直し、lp.hppの修正、psaのpowなど。その他細かい追加、修正。
webデモの試作。
-
2014/1/2 kv-0.4.1。allsol.hppの区間反復をちゃんとする。gamma.hpp追加(不完全)。
intervalのpow(整数乗)を修正(Thanks to 山口俊樹君)。
丸めモード変更のエミュレートを試作(-DKV_NOHWROUND)。
webデモに二重積分と常微分方程式の初期値問題を追加。
-
2014/3/19 kv-0.4.2。
区間演算で端点に無限大が来た場合の扱いをきちんとした。
丸めモード変更のエミュレート(-DKV_NOHWROUND)の完成度を高める。
ddの除算で被除数が無限大に近い場合の問題を修正。
-
2014/4/16 kv-0.4.3。
複素数のabs, sqrtを修正。expの無限大に近い引数の場合の修正。
atan2([0,e],[-1,-1])のような場合の値の修正。ddの平方根の修正。
ddの場合でも、-DKV_NOHWROUNDでハード的な丸めモード変更を使わない。
-
2014/6/1 kv-0.4.4。
defint_autostep(定積分) でpsaのhistoryをクリアしていなかった問題を修正。
lp.hppで無限ループに陥ることがあったのを修正。Airy関数の試作など。
-
2014/6/6 kv-0.4.5。
defint_autostepのstep size controlを精密化。psa.hppの小修正。
ODEのstep size controlも少し改善。digammaの追加。
数値積分の精度保証に関する説明を詳細に書いた、など。
-
2014/6/26 kv-0.4.6。
affineで-DAFFINE_SIMPLE=2のときの乗算のバグを修正。
関数名を変えて、allsol系のheader fileを同時にincludeできるように。
主要なファイル (全てでは無い) から日本語のコメントを削除。
Visual Studio 2013でコンパイル出来ることを確認。
affineの改良乗算、最良乗算を実装。
-
2014/7/20 kv-0.4.7。
autodifでx *= 2;のようなコードがコンパイル出来なかったバグの修正
(Thanks to あっきー)。
allsol及びnewtonの引数の順序をx, fからf, xに変更。
allsolでgiveupした区間をなるべく一つにまとめるように。
allsolの使い方を詳細に書いた。
odeの使い方を少しだけ書いた。
-
2014/8/1 kv-0.4.8。
newton.hppのバグfix。
mpfrラッパー作成。
odeの使い方を詳細に書いた。
-
2014/9/15 kv-0.4.9。
gammaをきちんと書き直した。trigamma作成。
Krawczykの使い方、境界値問題の解き方、odeのcallbackの解説を書いた。
ode-affine.hppのステップ幅コントロールがおかしかったのを修正。
-
2014/10/9 kv-0.4.10。
webデモでlogが使えなかったバグの修正。
lgamma追加。defint-singular.hpp追加。
-
2014/10/26 kv-0.4.11。
rkf45.hppの係数が間違っていたのを修正。
psaのhistoryの問題で、数学関数のみを含み加減乗除を一つも含まないような常微分方程式が解けなかったバグを修正。
-
2014/11/12 kv-0.4.12。
affine<dd>のようにdouble以外の型を入れたaffineがコンパイル出来なかった
バグを修正。
ddを区間の端点でなく単体で使ったときのための数学関数(精度保証しない)を作成。
dd, psa, interval, autodifでpow(x, 2.5)のようにdoubleを入れた場合の挙動に問題があったのを修正。affineにpowを追加。
-
2014/11/24 kv-0.4.13。
ddの表示(文字列変換)が正しく動作していなかったバグを修正。
affine.hppに数学関数をいくつか追加。
-
2014/12/4 kv-0.4.14。
ddとintervalでtanhに絶対値の大きい値を入れるとオーバーフローして
しまっていた問題を修正。allsolの解説pdfを追加。
-
2014/12/8 kv-0.4.15。
psa.hppの乗算でhistoryを使ったときの問題点を修正。
interval.hppの文字列との比較を修正。
-
2014/12/25 kv-0.4.16。
dka.hppの整備、Smithの定理を用いて精度保証付きのDKAを行うvdkaを作成。
gamma.hppを整備。
defint-singular.hpp内の特異積分関数にstep幅を自動で決めるautostep版を追加。
-
2015/3/7 kv-0.4.17。
webに特殊関数の節を設け、gamma関数の計算方法のメモなど、説明を書いた。
0除算等に使う例外をrange_errorからdomain_errorに変更。
psaのhistoryの問題で、計算の手順の一番最後が数学関数であるような
常微分方程式が正常に解けないことがあったバグを修正。
-
2015/3/12 kv-0.4.18。
lgammaをdouble以外の型で使うとコンパイルエラーになるバグを修正。
整数次のみの第1種Bessel関数を追加。
-
2015/3/23 kv-0.4.19。
mpfrである程度以上仮数部の長い数を扱ったとき、e, ln2, piの定数の
精度が不十分なため区間幅が小さくならない問題を修正
(constants.hpp周辺が大きく変わった。詳細はまだ書いてない。)。
atanhの端点処理をちゃんとやるようにした。
ddとmpfrにceilとldexpを追加。
MSYS2, Visual Studio 2013でコンパイル出来ることを確認。
-
2015/4/16 kv-0.4.20。
sinh, coshに-∞を含む区間を与えたときに0除算が起きる問題を修正。
端点に±∞を含む乗算の結果が正しくないことがあった問題を修正。
-
2015/6/6 kv-0.4.21。
端点特異性を持つ精度保証付き数値積分を大幅に書き換え。
webドキュメントの数値積分の章の5.に使い方を詳細に記述した。
complex.hppにconj(共役複素数)が無かったので追加。
全解探索で見つかった解の反復改良の縮小率が1に近すぎて
反復が止まってしまう例が見つかったので対策した。
-
2015/6/29 kv-0.4.22。
defint_power_r, defint_log_r, defint_power_autostep_r, defint_log_autostep_rの
bug-fix。その他細かい修正。
-
2015/8/7 kv-0.4.23。
allsol.hppで無限大を含む区間を扱えるようにする。
interval.hppのmidをより精密に。vleq.hppの仕様変更。その他細かい修正。
-
2015/10/5 kv-0.4.24。
ライセンスを明記し、MITライセンスとする。
interval.hppのproper_subsetを修正し、proper_subset([0,1],[0,2])が真になるように。
beta.hpp追加。eig.hpp追加(高安 亮紀氏の提供による)。
その他細かい修正。
-
2015/10/15 kv-0.4.25。
interval-conv.hpp追加。eig.hppのバグ修正。hypergeom.hpp追加。
その他細かい修正。
-
2015/11/3 kv-0.4.26。
hypergeom.hppのアルゴリズム変更。psa.hppにasin, acos, atan, asinh, acosh, atanh追加。
bessel関数で部分的に非整数次対応。kkt.hpp追加。
webに「その他の機能」を設け、いくつか説明を書いた。
その他細かい修正。
-
2015/11/26 kv-0.4.27。
公比が区間な等比級数の和の公式を修正し、それに伴いhypergeom.hppを修正。
optimize.hppで、求まった区間のうち隣接しているものを結合する機能を追加。
allsol.hppで、TRIMのアルゴリズムを少し変更。
constants<affine<T>>::pi()などが機能していなかった問題を修正。
webデモの問題記述でpi, e, ln2を使えるようにした。
webデモにaffineとintervalによる関数の値域評価を追加。
その他細かい修正。
-
2015/12/23 kv-0.4.28。
highderiv.hpp追加。test-rounding.cc追加。シンプルな区間演算ライブラリを
webページに追加。affineの説明、psaの説明を少し詳しくした。
その他細かい修正。
-
2016/3/16 kv-0.4.29。
conv-double.hpp, conv-dd.hppの書き方を安全に、Visual C++で
_control_fpでなく_controlfp_sを使用するように (Thanks to 小野寛生様)。
test-rounding.ccを少し精密に調べるように。
Visual C++ 2013でコンパイル出来ることを確認。
interval-simpleを最新に。
その他細かい修正。
-
2016/3/25 kv-0.4.30。
ODEの刻み幅の制御方法を変え、精度保証に失敗した場合のrestart時の刻み幅を単に前回の半分でなく少し真面目に推定するようにした。
ODEのweb demoでode_maffineとode_maffine2を選択できるようにした。
example/rober.ccを追加。
kv/ode-lohner.ccのbug-fix (運良く計算結果には影響のないバグ)。
その他細かい修正。
-
2016/3/28 kv-0.4.31。
kv/conv-double.hppとkv/conv-dd.hppの文字列からdouble/ddへの変換で、アンダーフロー領域やオーバーフロー領域で丸めモードを見ずに無条件で0やinfに変換してしまっていたバグの修正。
-
2016/4/2 kv-0.4.32。
kv/interval.hppとkv/dd.hpp内のsinh, coshで、入力が負の大きな値のときにゼロ除算を起こしていたバグの修正。
-
2016/4/15 kv-0.4.33。
kv/conv-double.hppとkv/conv-dd.hppで、Visual C++ 2015でのコンパイルに
問題があったのを修正 (Thanks to @quartozさん、@nikqさん)。
自動微分の使い方を少し追記。
-
2016/4/28 kv-0.4.34。
kv/dd.hppで、sqrtとlogに負の値を入れたときエラーで止まるようにした
(Thanks to 関根 晃太さん)。
kv/fpu53.hppで_controlfp_sを使うように。
kv/conv-double.hppとkv/conv-dd.hppで、手抜きしてsprintfを使う実装に
なっていのたをC++らしく書き換えた。
-
2016/5/6 kv-0.4.35。
前回更新で指数部の表示がおかしくなっていたのを修正。
kv/ode-maffine3.hpp, test/test-ode-maffine3.ccを追加 (ode-maffine2程では
ないがstiffに強く、初期値に関する微分もできる)。
ode-maffineを使っていた他のプログラムで、ode-maffine3を使うようにする。
webデモのODE solverでアルゴリズムを3種類から選べるようにする。
-
2016/5/9 kv-0.4.36。
maffine3アルゴリズムが十分使えそうなので、
- maffine → 一応maffine0として残すが消滅候補
- maffine2 → そのまま
- maffine3 → maffineと改名
と、maffine3を正式に採用した(使い勝手は変わらない)。
-
2016/9/6 webページの説明を部分的に英訳した。(thanks to 田中一成さん)
-
2016/11/20 kv-0.4.37。
dd (double-double)のsqrtを新しいアルゴリズムに。
ddのsqrtに無限大を入れるとNaNになっていたバグの修正。
dd区間演算の除算で丸めの向きを間違うことがあったバグを修正。
dd及びdd区間演算のアルゴリズムの詳細を書いた。
interval-conv.hppにmpfrtompfrとimpfrtoimpfrを追加。
-
2016/12/10 kv-0.4.38。
intervalにmidrad, max, minを追加。
dka.hppのvdkaで解に重なりがあったときの処理をきちんと行なうようにした。
その他細かい修正。
-
2016/12/30 kv-0.4.39。
大域最適化用のoptimize.hppにminimize/minimize_value/maximize/maximize_valueを追加。1変数用の関数も追加。
dka.hppのdka関数の収束条件を見直し。
高階微分用のhighderiv.hppに、
高階微分の関数オブジェクトを生成するHighDerivと、
偏高階微分の関数オブジェクトを生成するPartialDerivを追加した。
allsol.hppに1変数関数用のallsol関数を追加した。
その他細かい修正。
-
2017/1/27 kv-0.4.40。
常微分方程式の長時間計算におけるcallbackの仕様を変更し、callback関数の戻り値を
チェックしてfalseなら計算を中止するようにした。
詳細は「14. 常微分方程式の初期値問題の精度保証」の中の「4. callback関数を指定する」に書いた。
kraw-approx.hppに1変数専用のkrawczyk_approx関数を追加した。
ベキ級数演算の解説pdfを最新に。
その他細かい修正。
-
2017/3/10 kv-0.4.41。
ode solverの内部型をddにしたときにコンパイル出来なくなっていた問題点を修正。
-
2017/8/23 kv-0.4.42。
コンパイル時にマクロKV_USE_TPFMAを定義すると、twoproductの計算に
fma命令を使うようになる (詳細は
6. 4倍精度演算(dd)
に)。
dka.hppを少し改良して重解に対する安定性が向上。
概要を紹介するスライドを掲載した。
-
2017/11/8 kv-0.4.43。
gnuplot.hppを削除し、matplotlib.hppに差し替える。
ode.hpp内のマクロのスペルミスを修正 (thanks to 青木 柊さん)。
-DKV_USE_AVX512で、AVX-512にある丸めモードの指定を命令自身に含んだ
加減乗除と平方根を使うようにする。
丸めモードの変え方とコンパイルオプションが増えてきたので、
20. 丸めモードの変え方とコンパイルオプションまとめ
のページを作成。
-
2018/6/17 kv-0.4.44。
rdd.hpp, rdd-hwround.hpp, rdd-nohwround.hppを修正し、主にddのオーバーフローに
関するバグを修正。
affine.hppのepsilon_reduceで、与えられたaffineベクトルが1次元だった場合に正しく
動かないバグを修正。
rkf78.hpp追加。
-
2018/11/18 kv-0.4.45。
autodif.hppを修正し、pow(x,0)を含む自動微分が出来なかったバグを修正。
kraw-approx.hppを修正し、1変数関数のkrawczykに失敗した場合の処理が
まずかったのを修正。
kraw-approx.hppの事前Newton法で、十分収束したと見做されれば指定回数未満の
反復でやめるように。
dka.hppの内部精度をdouble以外に出来なかったバグの修正。
その他細かい修正。
-
2018/11/28 kv-0.4.46。
ode.hpp, ode-autodif.hpp, ode-affine.hpp, ode-lohner.hppで、
step sizeのコントロールに関するいくつかのbug fix。
ode-autodif.hppで解のTaylor展開そのものを取得させる場合、
自動微分情報を返さないようにした。
ode-maffine.hppのstep sizeのコントロールに関するbug fix。
その他細かい修正。
-
2018/11/29 kv-0.4.47。
ode-autodif.hppに、kv-0.4.35で行ったstiff ODEに強い計算方法を
取り入れる。これにより、ode-maffine0が改良されode-maffineと
全く同じ振る舞いをするようになったので、
ode-maffine0.hppをode-maffine.hppに改名し、ode-maffine.hppは削除した。
(追記: どうしても旧ode_maffine0と同じ動作をさせたい場合は、
コンパイルオプションとして-DODE_AUTODIF_NEW=0を付ければ
ode-maffineは旧ode_maffine0と同じ動作になるはず。)
その他細かい修正。
-
2019/4/10 kv-0.4.48。
区間演算で端点に無限大を含む場合の計算を修正。今までは、
[0,0] × [0,∞]のような、片方が[0,0]、もう片方が
無限大を含む区間のとき、これを[-∞,∞]としてしまっていた。
[0,0]になるように修正 (福井大学石井大輔先生のご指摘による)。
matplotlib.hppでrectが正しく動作していなかったバグの修正。
affine.hppにepsilon_reduce2を追加。ode-maffine.hpp,
ode-maffine2.hppをそれを使って書き換えた。
その他細かい修正。
-
2019/11/21 kv-0.4.49。
辺及び一点で特異性を持つ2変数関数の二重積分を行う、
doubleint-singular.hpp, test-doubleint-singular.ccを追加。
-
2020/2/12 kv-0.4.50。
ddのfrexpが2のベキ乗よりもわずかに小さい値に対して正しく動いていなかった
バグの修正。
interval.hppで、内部型としてfrexpが誤差を含む可能性がある型を
使っている場合(例えばdd)、logがごく稀に正しい値を返していなかったバグを修正。
dd.hppの(精度保証付きでない)sinとcosの引き戻し処理がまずかったのを修正。
-
2021/3/20 kv-0.4.51。
interval.hppにfloorとceilを追加。
optimize.hppがきちんと終了しない場合があったバグを修正。
highderiv.hppに定数関数を与えたときに落ちていたバグを修正。
Newton-Cotes公式で数値積分を行う、
defint-newtoncotes.hpp, test-defint-newtoncotes.ccを追加。
Newton-Cotes公式で二重積分を行う、
double-newtoncotes.hpp, test-double-newtoncotes.ccを追加。
Newton-Cotes公式で辺が曲がった長方形領域での二重積分を行う、
doubleint-curvededge.hpp, test-doubleint-curvededge.ccを追加。
その他細かい修正。
-
2021/8/5 kv-0.4.52。
test-rounding.ccで、非正規化数を強制的に0にする"flush to zero"モードに
なっていないかどうか(この状態だと区間演算で問題が生じる)をチェックする
ようにした。
iccでコンパイルできるように修正 (ただし、iccはデフォルトで"flush to zero"なので
"-no-ftz"オプションが必要) 。
optimize.hppで、「端にない」区間で傾きが単調ならばそこに最小値は存在しない
というチェックを入れる改良を行った。
defint-newtoncotes.hpp, double-newtoncotes.hppで、最適な分割数の
推定がうまくできていなかったバグを修正。
defint.hpp, defint-singular.hppで、急減少関数などの特定の被積分関数
に対してstep sizeがうまく計算できていなかった問題を修正。
psa.hppの中のinv関数を、係数のオーバーフローが発生しづらいように改良。
gamma.hppの中のdigamma関数の計算アルゴリズムをより高精度なものに変更。
その他細かい修正。
-
2021/11/12 kv-0.4.53。
sqrtにinterval<dd>を入れ、その上端(x1,x2)がx1=DBL_MAX, x2>0のときに
計算結果の区間幅が広くなってしまう問題に気づき、それを修正
(Thanks to 中田 真秀先生)。
Bessel関数の計算が出来ないことがあるという指摘を受け、
定積分を計算する関数defint_autostep(f, a, b)でbが区間のときに
step sizeの調整に失敗することがあるバグに気づき、それを修正
(Thanks to 浅井 大晴さん、多田 秀介さん、宮内 洋明さん)。
-
2022/1/6 kv-0.4.54。
kv/rfloat64x.hppを作成し、Intel 80bit浮動小数点数(_Float64x)を端点として持つ区間演算を実現した。
kv/ddx.hppを作成し、_Float64xを2つ組み合わせて指数部15bit、仮数部128bitの浮動小数点演算を実現した。
kv/rddx.hppを作成し、ddxを端点として持つ区間演算を実現した。
Intelの32bit環境では-msse2,-mfpmath=sseなどどしてSSE2を利用しないと、
ddやKV_NOHWROUNDが利用できないように変更
(動作の安定性の問題、_Float64xとの同居の問題の解決のため)。
interval-conv.hppを廃止予定にし、interval-converter.hppを新たに作成した。
これにより、内部型の異なる区間同士の代入が簡単になった
(内部型の異なる区間同士の変換参照)。
その他細かい修正。
-
2022/9/16 kv-0.4.55。
ARM (32bit/64bit) で-DKV_FASTROUNDしたとき、inline assemblerを使った高速な丸め
変更を行えるようにした。
しかしあまり得しなかった。詳細は
丸めモードの変え方とコンパイルオプションまとめ
の「6.ベンチマーク」参照。
その他細かい修正。
-
2024/2/17 kv-0.4.56。
g++-13で_Float64xが動かなくなったせいで、ほとんどすべてのプログラムが
g++-13でコンパイルできなくなっていた問題を修正。g++-13では
_Float64xを使った80bit拡張浮動小数点数による精度保証はとりあえず
使えないようにした。
optimize.hppに、autodifを使わない、区間演算のみの最適化機能 (ただし遅い) を
追加。
-
2024/8/27 kv-0.4.57。
defint_autostepにおいて、order=1だと正しく精度保証できないバグを修正。
odelong_maffineに自動微分型を与えてかつcallback関数を指定したとき、
callback関数が初期値に関する微分の情報をも渡してくれるように変更。詳細は
常微分方程式の初期値問題の精度保証
の「5. 初期値に関する微分を得る」を参照。