6 changed files with 145 additions and 9 deletions
@ -0,0 +1,65 @@ |
|||
using MathNet.Numerics.LinearAlgebra; |
|||
using System; |
|||
|
|||
namespace MathNet.Numerics.Optimization.Subproblems |
|||
{ |
|||
internal class NewtonCGSubproblem : ITrustRegionSubproblem |
|||
{ |
|||
public Vector<double> Pstep { get; private set; } |
|||
|
|||
public bool HitBoundary { get; private set; } |
|||
|
|||
public void Solve(IObjectiveModel objective, double delta) |
|||
{ |
|||
var Jacobian = objective.Jacobian; |
|||
var Gradient = objective.Gradient; |
|||
var Hessian = objective.Hessian; |
|||
|
|||
// define tolerance
|
|||
var tolerance = Math.Min(0.5, Math.Sqrt(Gradient.L2Norm())) * Gradient.L2Norm(); |
|||
|
|||
// initialize internal variables
|
|||
var z = Vector<double>.Build.Dense(Hessian.RowCount); |
|||
var r = -Gradient; |
|||
var d = -r; |
|||
|
|||
while (true) |
|||
{ |
|||
var Bd = Hessian * d; |
|||
var dBd = d.DotProduct(Bd); |
|||
|
|||
if (dBd <= 0) |
|||
{ |
|||
var t = Util.FindBeta(1, z, d, delta); |
|||
Pstep = z + t.Item1 * d; |
|||
HitBoundary = true; |
|||
return; |
|||
} |
|||
|
|||
var r_sq = r.DotProduct(r); |
|||
var alpha = r_sq / dBd; |
|||
var znext = z + alpha * d; |
|||
if(znext.L2Norm() >= delta) |
|||
{ |
|||
var t = Util.FindBeta(1, z, d, delta); |
|||
Pstep = z + t.Item2 * d; |
|||
HitBoundary = true; |
|||
return; |
|||
} |
|||
|
|||
var rnext = r + alpha * Bd; |
|||
var rnext_sq = rnext.DotProduct(rnext); |
|||
if (Math.Sqrt(rnext_sq) < tolerance) |
|||
{ |
|||
Pstep = znext; |
|||
HitBoundary = false; |
|||
return; |
|||
} |
|||
|
|||
z = znext; |
|||
r = rnext; |
|||
d = -rnext + rnext_sq / r_sq * d; ; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
namespace MathNet.Numerics.Optimization |
|||
{ |
|||
public sealed class TrustRegionNewtonCGMinimizer : TrustRegionMinimizerBase |
|||
{ |
|||
/// <summary>
|
|||
/// Non-linear least square fitting by the trust region Newton-Conjugate-Gradient algorithm.
|
|||
/// </summary>
|
|||
public TrustRegionNewtonCGMinimizer(double gradientTolerance = 1E-8, double stepTolerance = 1E-8, double functionTolerance = 1E-8, double radiusTolerance = 1E-8, int maximumIterations = -1) |
|||
: base(TrustRegionSubproblem.NewtonCG(), gradientTolerance, stepTolerance, functionTolerance, radiusTolerance, maximumIterations) |
|||
{ } |
|||
} |
|||
} |
|||
|
|||
Loading…
Reference in new issue