Я нашел решение для нелинейной подгонки. Вы можете использовать библиотеку CenterSpace.NMath и выполнить следующие действия (например, f (x) = a + c * sin (x + b) * sin (x + b)):
DoubleParameterizedFunction func = new Function();
var f = new DoubleParameterizedDelegate(
func.Evaluate);
var fitter = new OneVariableFunctionFitter<TrustRegionMinimizer>(f);
DoubleVector x = new DoubleVector(xData);
DoubleVector y = new DoubleVector(yData);
DoubleVector init = new DoubleVector("100.0 1.0 100.0");
DoubleVector solution = fitter.Fit(x, y, init);
And Function () выглядит так:
public class Function : DoubleParameterizedFunction
{
public Function ()
{ }
public override double Evaluate (DoubleVector p, double x)
{
double a = p[0];
double b = p[1];
double c = p[2];
return a + c*Math.Sin(b + x) * Math.Sin(b + x);
}
public override void GradientWithRespectToParams (DoubleVector p,
double x, ref DoubleVector grad)
{
double a = p[0];
double b = p[1];
double c = p[2];
grad[0] = 1; //partial differential for a
grad[1] = 2 * c * Math.Sin(x + b) * Math.Cos(x + b); //partial differential for b
grad[2] = Math.Sin(x + b) * Math.Sin(x + b); //partial differential for c
}
}
https://www.centerspace.net/doc/NMath/user/nonlinear-least-squares-86564.htm