Common Library  0.9.5
MathLib::CGM_Operator< T > クラステンプレートabstract

共役勾配法 ( Conjugate Gradient Method ) 用多変数関数オブジェクト [詳解]

公開メンバ関数

virtual ~CGM_Operator ()
 仮想デストラクタ(何もしない)
 
virtual T nabla (const std::vector< T > &x, size_type i) const =0
 ∇f の値を求める [詳解]
 
virtual T hessian (const std::vector< T > &x, size_type i, size_type j) const =0
 ヘッセ行列 H の値を求める [詳解]
 
void assign (const std::vector< T > &x0, const std::vector< T > &m)
 初期値を代入する [詳解]
 
ft (T t) const
 F(t) = f(x0 + t∇f(x0)) を返す [詳解]
 
operator() (T t) const
 dF(t)/dt = ( ∇f(x0 + t∇f0), ∇f(x0) ) を返す [詳解]
 

非公開メンバ関数

virtual T fx (const std::vector< T > &x) const =0
 f(x) の値を求める [詳解]
 

詳解

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_; // 中心の座標
:
// fx : f(x) = a( x - x0 )^2 + b( y - ya )^2 を求める
//
// ( x, y ) = ( x[0], x[1] ) として計算する
virtual double fx( const std::vector< double >& x ) const
{
return( a_ * pow( x[0] - x0_, 2 ) + b_ * pow( x[1] - y0_, 2 ) );
}
// ∇f : ( ∂f/∂x, ∂f/∂y ) を求める
//
// ( x, y ) = ( x[0], x[1] ) として計算する
// i = 0 で ∂f/∂x、i = 1 で ∂f/∂y を返す
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_ ) );
}
// H : | ∂^2f/∂x^2, ∂^2f/∂x∂y | を求める
// | ∂^2f/∂x∂y, ∂^2f/∂y^2 |
//
// ( x, y ) = ( x[0], x[1] ) として計算する
// ( i, j ) = ( 0, 0 ) で ∂^2f/∂x^2、( i, j ) = ( 1, 1 ) で ∂^2f/∂y^2
// ( i, j ) = ( 1, 0 ), ( 0, 1 ) で ∂^2f/∂x∂y を返す
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) の値を求める

関数詳解

◆ fx()

template<class T >
virtual T MathLib::CGM_Operator< T >::fx ( const std::vector< T > &  x) const
privatepure virtual

f(x) の値を求める

引数
xx の値(多変量)
戻り値
f(x) の値

◆ nabla()

template<class T >
virtual T MathLib::CGM_Operator< T >::nabla ( const std::vector< T > &  x,
size_type  i 
) const
pure virtual

∇f の値を求める

引数
xx の値(多変量)
ix の何番目のパラメータに対する偏微分を返すかを指定する添字
戻り値
∇f の i 番目の値

◆ hessian()

template<class T >
virtual T MathLib::CGM_Operator< T >::hessian ( const std::vector< T > &  x,
size_type  i,
size_type  j 
) const
pure virtual

ヘッセ行列 H の値を求める

引数
xx の値(多変量)
i,jH の何行・何列目の二階偏微分を返すかを指定する添字
戻り値
H の i 行・j 列目の値

◆ assign()

template<class T >
void MathLib::CGM_Operator< T >::assign ( const std::vector< T > &  x0,
const std::vector< T > &  m 
)
inline

初期値を代入する

引数
x0代入する初期値
m探索方向ベクトル
戻り値
なし

◆ ft()

template<class T >
T MathLib::CGM_Operator< T >::ft ( t) const
inline

F(t) = f(x0 + t∇f(x0)) を返す

引数
tt の値
戻り値
F(t) の値

◆ operator()()

template<class T >
T MathLib::CGM_Operator< T >::operator() ( t) const
inline

dF(t)/dt = ( ∇f(x0 + t∇f0), ∇f(x0) ) を返す

引数
tt の値
戻り値
dF/dt の値

このクラス詳解は次のファイルから抽出されました: