protected void Step()
{
// Evaluate the functions values and jacobian.
m_MinValue = m_Estimator.Eval( m_MinPoint, m_Jacobian );
// Find extended matrix
for ( int i=0; i < m_ParametersCount; i++ )
for ( int j=0; j < m_Dimension; j++ )
m_JacobianEx[i,j] = m_Jacobian[i,j];
double SqrtLambda = Math.Sqrt( m_Lambda );
for ( int i=0; i < m_Dimension; i++ )
m_JacobianEx[i+m_ParametersCount,i] = SqrtLambda * m_Diagonal.m[i];
// Find extended vector of function values
for ( int i=0; i < m_ParametersCount; i++ )
{
double Value = m_Estimator.GetCalcFunctionValues()[i];
m_FunctionValues.m[i] = Value;
m_FunctionValuesEx.m[i] = -Value; // !! Mind the NEGATIVE sign here !!
}
// Solve min ||jacExt*x+funValsExt||
// if(isQR)
m_Delta = m_JacobianEx.SolveLeastSquareQR( m_FunctionValuesEx );
// else
// m_Delta = jacExt->solveLstSqrSVD(-m_FunctionValuesEx);
// Candidate for new minimizer
for ( int i=0; i < m_Dimension; i++)
m_TempPoint.m[i] = m_MinPoint[i] + m_Delta[i];
// Calculate ro : showing how expansion works for the function
Vector Temp = m_Jacobian * m_Delta;
m_PredictedReduction = -(Temp * m_FunctionValues) - Temp*Temp*0.5;
m_Reduction = m_MinValue - m_Estimator.Glou( m_TempPoint );
if ( m_PredictedReduction == m_Reduction )
ro = 1;
else
ro = m_Reduction/m_PredictedReduction;
}