Skip to content

Commit 412d8d2

Browse files
committed
FindMinimum.OfFunction and Fit.Curve shortcuts extended to accept two more parameters #760
1 parent ec9e4ab commit 412d8d2

2 files changed

Lines changed: 60 additions & 0 deletions

File tree

src/Numerics/FindMinimum.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,28 @@ public static Tuple<double, double, double> OfFunction(Func<double, double, doub
7979
return Tuple.Create(result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2]);
8080
}
8181

82+
/// <summary>
83+
/// Find vector x that minimizes the function f(x) using the Nelder-Mead Simplex algorithm.
84+
/// For more options and diagnostics consider to use <see cref="NelderMeadSimplex"/> directly.
85+
/// </summary>
86+
public static Tuple<double, double, double, double> OfFunction(Func<double, double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double tolerance = 1e-8, int maxIterations = 1000)
87+
{
88+
var objective = ObjectiveFunction.Value(v => function(v[0], v[1], v[2], v[3]));
89+
var result = NelderMeadSimplex.Minimum(objective, CreateVector.Dense(new[] { initialGuess0, initialGuess1, initialGuess2, initialGuess3 }), tolerance, maxIterations);
90+
return Tuple.Create(result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2], result.MinimizingPoint[3]);
91+
}
92+
93+
/// <summary>
94+
/// Find vector x that minimizes the function f(x) using the Nelder-Mead Simplex algorithm.
95+
/// For more options and diagnostics consider to use <see cref="NelderMeadSimplex"/> directly.
96+
/// </summary>
97+
public static Tuple<double, double, double, double, double> OfFunction(Func<double, double, double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double initialGuess4, double tolerance = 1e-8, int maxIterations = 1000)
98+
{
99+
var objective = ObjectiveFunction.Value(v => function(v[0], v[1], v[2], v[3], v[4]));
100+
var result = NelderMeadSimplex.Minimum(objective, CreateVector.Dense(new[] { initialGuess0, initialGuess1, initialGuess2, initialGuess3, initialGuess4 }), tolerance, maxIterations);
101+
return Tuple.Create(result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2], result.MinimizingPoint[3], result.MinimizingPoint[4]);
102+
}
103+
82104
/// <summary>
83105
/// Find vector x that minimizes the function f(x) using the Nelder-Mead Simplex algorithm.
84106
/// For more options and diagnostics consider to use <see cref="NelderMeadSimplex"/> directly.

src/Numerics/Fit.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,24 @@ public static Tuple<double, double, double> Curve(double[] x, double[] y, Func<d
362362
return FindMinimum.OfFunction((p0, p1, p2) => Distance.Euclidean(Generate.Map(x, t => f(p0, p1, p2, t)), y), initialGuess0, initialGuess1, initialGuess2, tolerance, maxIterations);
363363
}
364364

365+
/// <summary>
366+
/// Non-linear least-squares fitting the points (x,y) to an arbitrary function y : x -> f(p0, p1, p2, p3, x),
367+
/// returning its best fitting parameter p0, p1 and p2.
368+
/// </summary>
369+
public static Tuple<double, double, double, double> Curve(double[] x, double[] y, Func<double, double, double, double, double, double> f, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double tolerance = 1e-8, int maxIterations = 1000)
370+
{
371+
return FindMinimum.OfFunction((p0, p1, p2, p3) => Distance.Euclidean(Generate.Map(x, t => f(p0, p1, p2, p3, t)), y), initialGuess0, initialGuess1, initialGuess2, initialGuess3, tolerance, maxIterations);
372+
}
373+
374+
/// <summary>
375+
/// Non-linear least-squares fitting the points (x,y) to an arbitrary function y : x -> f(p0, p1, p2, p3, x),
376+
/// returning its best fitting parameter p0, p1 and p2.
377+
/// </summary>
378+
public static Tuple<double, double, double, double, double> Curve(double[] x, double[] y, Func<double, double, double, double, double, double, double> f, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double initialGuess4, double tolerance = 1e-8, int maxIterations = 1000)
379+
{
380+
return FindMinimum.OfFunction((p0, p1, p2, p3, p4) => Distance.Euclidean(Generate.Map(x, t => f(p0, p1, p2, p3, p4, t)), y), initialGuess0, initialGuess1, initialGuess2, initialGuess3, initialGuess4, tolerance, maxIterations);
381+
}
382+
365383
/// <summary>
366384
/// Non-linear least-squares fitting the points (x,y) to an arbitrary function y : x -> f(p, x),
367385
/// returning a function y' for the best fitting curve.
@@ -391,5 +409,25 @@ public static Func<double, double> CurveFunc(double[] x, double[] y, Func<double
391409
var parameters = Curve(x, y, f, initialGuess0, initialGuess1, initialGuess2, tolerance, maxIterations);
392410
return z => f(parameters.Item1, parameters.Item2, parameters.Item3, z);
393411
}
412+
413+
/// <summary>
414+
/// Non-linear least-squares fitting the points (x,y) to an arbitrary function y : x -> f(p0, p1, p2, x),
415+
/// returning a function y' for the best fitting curve.
416+
/// </summary>
417+
public static Func<double, double> CurveFunc(double[] x, double[] y, Func<double, double, double, double, double, double> f, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double tolerance = 1e-8, int maxIterations = 1000)
418+
{
419+
var parameters = Curve(x, y, f, initialGuess0, initialGuess1, initialGuess2, initialGuess3, tolerance, maxIterations);
420+
return z => f(parameters.Item1, parameters.Item2, parameters.Item3, parameters.Item4, z);
421+
}
422+
423+
/// <summary>
424+
/// Non-linear least-squares fitting the points (x,y) to an arbitrary function y : x -> f(p0, p1, p2, x),
425+
/// returning a function y' for the best fitting curve.
426+
/// </summary>
427+
public static Func<double, double> CurveFunc(double[] x, double[] y, Func<double, double, double, double, double, double, double> f, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double initialGuess4, double tolerance = 1e-8, int maxIterations = 1000)
428+
{
429+
var parameters = Curve(x, y, f, initialGuess0, initialGuess1, initialGuess2, initialGuess3, initialGuess4, tolerance, maxIterations);
430+
return z => f(parameters.Item1, parameters.Item2, parameters.Item3, parameters.Item4, parameters.Item5, z);
431+
}
394432
}
395433
}

0 commit comments

Comments
 (0)