下請けとして、
test/test-kraw-approx.ccは、次のような感じ。 非線形方程式
x02 - x1 - 1 = 0に対して近似解(1.01, 0.01)を初期値として5回Newton法を回し、 その結果を元にして精度保証を行う例。
(x0-2)2 - x1 - 1 = 0
#include <kv/kraw-approx.hpp>
namespace ub = boost::numeric::ublas;
typedef kv::interval<double> itv;
struct Func {
template <class T> ub::vector<T> operator() (const ub::vector<T>& x) {
ub::vector<T> y(2);
y(0) = x(0) * x(0) - x(1) - 1.;
y(1) = (x(0) - 2.) * (x(0) - 2.) - x(1) - 1.;
return y;
}
};
int main()
{
ub::vector<double> x;
ub::vector<itv> ix;
bool b;
std::cout.precision(17);
x.resize(2);
ix.resize(2);
x(0) = 1.01;
x(1) = 0.01;
b = kv::krawczyk_approx(Func(), x, ix, 5, 1);
if (b == false) {
std::cout << "fail\n";
}
}
引数の意味は以下の通り。
なお、候補者集合の作り方は、 「その近似解を起点としたNewton法の修正量のノルムの2倍を半径とした超立方体区間」とすることが多いが、 ここではそれを少しアレンジした方法を用いている。 詳細はこちら(未発表資料, 2008/09/19作成)。
(2018/11/17) Newton法で指定された反復回数未満でも、収束したような様子で あれば反復をやめてKrawczykテストに移るようにした。