はじめに非線形方程式と探索領域を与え、その領域内の全ての解を計算する。領域内の全ての解を網羅しているはずである。プログラムはかなり複雑である。ファイル構成allsol.hpp下請けとして、interval.hpprdouble.hppinterval-vector.hppautodif.hppmatrix-inversion.hppを使っている。Codeも参考になるかも。-10≤y≤10における全ての解を求めることを考える。(allsol-sample1.cc)。T型のベクトルを返すような関数オブジェクトを定義する。ように表示されるはず。何らかの理由で存在か非存在か決定できなかった区間の数を表す。第3引数で画面にどのくらい情報を出すか制御できる。(allsol-sample2.log)。進行状況を観察したいときに指定するとよい。第3引数のdefault値(省略時の値)は1である。0にすると、全くメッセージを出さなくなる。見つかった解を受け取って何か処理を行いたいこともあるだろう。0);のようにメッセージを抑制すると見つかった解も見られなくなってしまう。関数allsolは、実は見つかった解のリストを返している。(allsol-sample3.cc)。解の存在も非存在も示すことが出来ず、無限ループに陥ってしまう。(allsol-sample4.cc)。存在判定または非存在判定をあきらめる必要がある。その閾値を指定することが出来る。1e-8);のように指定すると、区間幅が10-8以下であきらめるようになる。次のプログラムを動かすと、2つの解と4つの不明領域を見つけてちゃんと停止する。(allsol-sample5.cc)。1e-8);}実行結果は次の通り。(defaultはNULL)。そこに不明領域を書き込む。次のようにすればよい。(allsol-sample6.cc)。-1)の重解の存在領域が除外されていることが分かる。ここで見つかった4つの領域は結合されて1つになって返されている。アルゴリズムの挙動を変更するための多数のコンパイルオプションがある。現状の一覧と簡単な説明を書いておく。K(I)とIの共通部分が存在する状態で、K(I)の大きさがIのEDGE_RATIO倍以下ならIを分割せずにK(I)に置き換える。分割の境界に解が乗った場合対策。1以上なら、f'(I)の情報を使ってIのうち解の存在しない部分を削るアルゴリズム(トリミング)を使う。1-3は内部で使っている部分和計算のアルゴリズムの違い。トリミングで、f'(I)の成分が0を含む場合0除算が起きてしまうが、そのとき動作を規定する。division_part2を駆使してトリミングを実行する。2なら、更にトリミングによってIが2つに分かれてしまう場合でもトリミングを実行する。1なら、トリミングを行った後ある条件を満たしたら更に連続してトリミングを行う。1なら、f(c)とf'(I)を用いてfをaffine化して解の非存在を判定するアルゴリズムを使う。1なら、mig(f'(I))を利用して解の存在判定が決して通らない場合を察知し、存在判定をスキップする。トリミング等で解の特定の成分の区間幅が極端に小さくなると存在判定の性能に悪影響を及ぼすので、一度の分割またはトリミングでRECOVER_RATIO以下の大きさにはならないように制御する。1なら、トリミング等で区間幅が半分以下に縮んでいたら、区間の分割を行わない。1なら、f'(I)を計算する前にf(I)による解の非存在判定を行う。通常はf'(I)の副産物としてf(I)が得られるのでf'(I)を計算してからそれを行うが、f(I)とf'(I)の計算コストが大きく違う問題の場合は、先にf(I)で除外できた方が有利なこともありそう。1なら、解が見つかったときの区間反復において、f'(I_n)を再計算させて2次収束させる。0なら、f'(I_0)を使い続ける1次収束。1なら、重解等であきらめた領域をlistで返却する場合、その区間のうち隣接するものを結合する。1なら、入力区間として[0,∞]や[-∞,∞]などの無限区間を入力できる。1なら、区間の分割時に重み付き最大値を使う。誰か頑張ってくれないだろうか。数の型はカスタマイズ出来るようになっている。第2引数に渡された区間の両端の型を使って、全体の計算を行うことになる。詳細はinterval型の説明を見て欲しい。4倍精度の全解探索を実行できる。I);}以下は実行結果。解が高精度に計算されている。試験的に、無限区間の全解探索を出来るようにしてみた。(allsol-sample8.cc)。I);}ただ区間に無限大を含む区間を与えるだけでよい。ENABLE_INFINITY=1である必要がある。WEIGHTED_MAX=1がお勧め。いずれもデフォルト値がそうなっている。試験的な機能で、実用的な時間では止まらない例題も多いと思われる。今後改良していくつもり。変数を「1変数のvector」にしなくてよい別のallsol関数を用意した。(allsol-sample9.cc)。どちらが呼び出されるかは区別される。中身は多変数版のallsolを呼び出しているだけ。区間に対して全解探索を行う。それ以外はallsolと同じ。allsol-simple.hppもある。関数名はallsol_simpleとallsol_list_simple。allsol-affine.hppというのもあるが、まだ試作品であり十分にテストされていない。arithmeticを用いてfを評価して全解探索の性能向上を狙ったもの。関数名はallsol_affineとallsol_list_affine。