template<class T>
class MathLib::CGM_Operator< T >
共役勾配法 ( Conjugate Gradient Method ) 用多変数関数オブジェクト
利用するには fx、nabla、hessian を派生クラスで実装する必要がある。 fx は関数 f(x) の値 ( x は多変量 )、nabla は ∇f = { ∂f / ∂xi } の値、 hessian はヘッセ行列 H = { ∂^2f / ∂xi∂xj } を返す関数を表す。 平面上の楕円の方程式の場合、以下のようになる ( エラー処理は省略 )。
double a_, b_;
double x0_, y0_;
:
virtual double fx(
const std::vector< double >& x )
const
{
return( a_ * pow( x[0] - x0_, 2 ) + b_ * pow( x[1] - y0_, 2 ) );
}
virtual double nabla(
const std::vector< double >& x,
size_t i )
const
{
if ( i == 0 )
return( 2 * a_ * ( x[0] - x0_ ) );
else
return( 2 * b_ * ( x[1] - y0_ ) );
}
virtual double hessian(
const std::vector< double >& x,
size_t i,
size_t j )
const
{
if ( i == 0 && j == 0 )
return( 2 * a_ );
else if ( i == 1 && j == 1 )
return( 2 * b_ );
else
return( 0 );
}
virtual T hessian(const std::vector< T > &x, size_type i, size_type j) const =0
ヘッセ行列 H の値を求める
virtual T nabla(const std::vector< T > &x, size_type i) const =0
∇f の値を求める
virtual T fx(const std::vector< T > &x) const =0
f(x) の値を求める