C# 在C语言中使用非线性平方拟合#

C# 在C语言中使用非线性平方拟合#,c#,alglib,function-fitting,C#,Alglib,Function Fitting,我试图找到一个fit函数,其形式如下: f(x) = P / (1 + e^((x + m) / s) 其中,p是一个已知常数。我将这个函数拟合到一个测量的双精度列表(20-100个元素之间),所有这些值都有一个对应的x值。我对C#比较陌生,对数学也不是很在行,所以我觉得很难阅读现有的文档 我试过使用AlgLib,但不知道从哪里开始,或者使用什么函数。 编辑:为了精确地说明我在寻找什么:我想找到一个C方法,在这里我可以传递函数形式,以及一些坐标(x和y值),并让该方法返回两个未知变量(上面的s

我试图找到一个fit函数,其形式如下:

f(x) = P / (1 + e^((x + m) / s)
其中,
p
是一个已知常数。我将这个函数拟合到一个测量的双精度列表(20-100个元素之间),所有这些值都有一个对应的x值。我对C#比较陌生,对数学也不是很在行,所以我觉得很难阅读现有的文档

我试过使用AlgLib,但不知道从哪里开始,或者使用什么函数。
编辑:为了精确地说明我在寻找什么:我想找到一个C方法,在这里我可以传递函数形式,以及一些坐标(x和y值),并让该方法返回两个未知变量(上面的s和m)

我每天使用AlgLib就是为了这个目的。如果您转到链接并一直向下滚动,您会发现包含多种语言(包括C#)的代码示例的文档,我认为这将对您有很大帮助:

对于你的问题,你应该考虑所有你需要的约束,但是一个简单的例子,得到一个非线性最小二乘拟合你的输入函数和数据将看起来像这样:

public SomeReturnObject Optimize(SortedDictionary<double, double> dataToFitTo, double p, double initialGuessM, double initialGuessS)
{
   var x = new double[dataToFitTo.Count,1];

   for(int i=0; i < dataToFitTo.Count; i++)
   {
       x[i, 0] = dataToFitTo.Keys.ElementAt(i);
   }

   var y = dataToFitTo.Values.ToArray();
   var c = new[] {initialGuessM, initialGuessS};

   int info;
   alglib.lsfitstate state;
   alglib.lsfitreport rep;

   alglib.lsfitcreatef(x, y, c, 0.0001, out state);
   alglib.lsfitsetcond(state, epsf, 0, 0);
   alglib.lsfitfit(state, MyFunc, null, p);
   alglib.lsfitresults(state, out info, out c, out rep);

   /*  When you get here, the c[] array should have the optimized values 
       for m and s, so you'll want to handle accordingly depending on your
       needs.  I'm not sure if you want out parameters for m and s or an 
       object that has m and s as properties. */

}

private void MyFunc(double[] c, double[] x, ref double func, object obj)
{
    var xPt = x[0];
    var m = c[0];
    var s = c[1];
    var P = (double)obj;
    func = P / (1 + Math.Exp((xPt + m) / s));
}
public SomeReturnObject优化(SortedDictionary dataToFitTo、double p、double initialGuessM、double initialGuessS)
{
var x=新的双精度[dataToFitTo.Count,1];
for(int i=0;i
请注意,这只是一个简单的例子。Alglib中有很多内置功能,因此您需要在这里调整问题代码,以满足您的需要,包括边界约束、权重、步长、变量缩放等。从第二个链接中的示例和文档中可以清楚地看到如何做到这一切

还请注意,Alglib对MyFunc的方法签名非常挑剔,因此我将避免在这些输入周围移动或添加更多内容


或者,如果Alglib不能满足您的所有需求,您可以编写自己的Levenberg-Marquardt算法。

我每天使用Alglib就是为了这个目的。如果您转到链接并一直向下滚动,您会发现包含多种语言(包括C#)的代码示例的文档,我认为这将对您有很大帮助:

对于你的问题,你应该考虑所有你需要的约束,但是一个简单的例子,得到一个非线性最小二乘拟合你的输入函数和数据将看起来像这样:

public SomeReturnObject Optimize(SortedDictionary<double, double> dataToFitTo, double p, double initialGuessM, double initialGuessS)
{
   var x = new double[dataToFitTo.Count,1];

   for(int i=0; i < dataToFitTo.Count; i++)
   {
       x[i, 0] = dataToFitTo.Keys.ElementAt(i);
   }

   var y = dataToFitTo.Values.ToArray();
   var c = new[] {initialGuessM, initialGuessS};

   int info;
   alglib.lsfitstate state;
   alglib.lsfitreport rep;

   alglib.lsfitcreatef(x, y, c, 0.0001, out state);
   alglib.lsfitsetcond(state, epsf, 0, 0);
   alglib.lsfitfit(state, MyFunc, null, p);
   alglib.lsfitresults(state, out info, out c, out rep);

   /*  When you get here, the c[] array should have the optimized values 
       for m and s, so you'll want to handle accordingly depending on your
       needs.  I'm not sure if you want out parameters for m and s or an 
       object that has m and s as properties. */

}

private void MyFunc(double[] c, double[] x, ref double func, object obj)
{
    var xPt = x[0];
    var m = c[0];
    var s = c[1];
    var P = (double)obj;
    func = P / (1 + Math.Exp((xPt + m) / s));
}
public SomeReturnObject优化(SortedDictionary dataToFitTo、double p、double initialGuessM、double initialGuessS)
{
var x=新的双精度[dataToFitTo.Count,1];
for(int i=0;i
请注意,这只是一个简单的例子。Alglib中有很多内置功能,因此您需要在这里调整问题代码,以满足您的需要,包括边界约束、权重、步长、变量缩放等。从第二个链接中的示例和文档中可以清楚地看到如何做到这一切

还请注意,Alglib对MyFunc的方法签名非常挑剔,因此我将避免在这些输入周围移动或添加更多内容


或者,如果Alglib不能满足您的所有需求,您可以编写自己的Levenberg-Marquardt算法。

如果p是一个已知常数,
m
s
是可变的,您可以将您的双倍列表输入x?您读过了吗?@Sebastian是的,我猜答案就在那里的某个地方,但我无法根据那篇文章实际编写任何代码。试试C#的文档,这里有一些例子可以说明你要做什么:如果P是一个已知常数,
m
s
是变量,你把你的双倍列表输入到x中?你读过了吗?@sebastian是的,我有,我猜答案就在那里的某个地方,但我无法根据那篇文章编写任何代码。请尝试C#文档,这里有一些示例说明您正在尝试做什么:非常感谢您的帮助!如何设置P的值/如何使P成为拟合参数(c[2])?Np!应该很简单-Alglib将假定c[]中的每个元素都是您的拟合参数,
objectobj
项是常量(您可以传入一个li