7

我对 Math.Net 库非常陌生,并且在尝试基于指数函数进行曲线拟合时遇到了问题。更具体地说,我打算使用此功能:

f(x) = a*exp(b*x) + c*exp(d*x)

使用 MATLAB 我得到了很好的结果,如下图所示:

废话

MATLAB 计算以下参数:

f(x) = a*exp(b*x) + c*exp(d*x)
Coefficients (with 95% confidence bounds):
a =   29.6       ( 29.49     , 29.71)
b =    0.000408  (  0.0003838,  0.0004322)
c =   -6.634     ( -6.747    , -6.521)
d =   -0.03818   ( -0.03968  , -0.03667)

是否可以使用 Math.Net 实现这些结果?

4

3 回答 3

2

查看 Math.net,似乎 Math.net 进行了各种类型的回归,而您的函数需要某种类型的迭代方法。例如 Gauss-Newton 方法,您将在每次迭代中使用线性回归来求解(超定)线性方程组,但这仍然需要一些“手动”工作来编写该方法。

于 2015-04-23T21:16:58.253 回答
1

答案是:还没有,我相信。基本上,整个包都有贡献csmpfit,但尚未集成到 Math.Net 中。您可以将其用作单独的库,然后在完全集成后移至 Math.Net。链接http://csmpfit.codeplex.com

于 2015-04-23T21:31:30.980 回答
1

不,目前似乎没有指数支持。但是在 Math.NET 论坛上有一个讨论,维护者提出了一种解决方法:

https://discuss.mathdotnet.com/t/exponential-fit/131

万一链接损坏,内容重复:

您可以通过转换它,类似于通过转换线性化非线性模型。类似于以下内容的东西应该起作用:

double[] Exponential(double[] x, double[] y,
    DirectRegressionMethod method = DirectRegressionMethod.QR)
{
    double[] y_hat = Generate.Map(y, Math.Log);
    double[] p_hat = Fit.LinearCombination(x, y_hat, method, t => 1.0, t => t);
    return new[] {Math.Exp(p_hat[0]), p_hat[1]}; 
}

示例用法:

double[] x = new[] { 1.0, 2.0, 3.0 };
double[] y = new[] { 2.0, 4.1, 7.9 };
double[] p = Exponential(x,y); // a=1.017, r=0.687
double[] yh = Generate.Map(x,k => p[0]*Math.Exp(p[1]*k)) // 2.02, 4.02, 7.98
于 2017-02-28T18:24:36.043 回答