我是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实现这些结果?
答案 0 :(得分:2)
看看Math.net,似乎Math.net做了各种类型的回归,而你的函数需要某种类型的迭代方法。例如Gauss-Newton的方法,你可以在每次迭代中使用线性回归来求解(超定)线性方程组,但是这仍然需要一些“手动”的工作来编写方法。
答案 1 :(得分:1)
答案是:我还不相信。基本上,整个csmpfit
包有贡献,但它尚未集成到Math.Net中。您可以将它用作单独的库,然后在完全集成后移动到Math.Net。链接http://csmpfit.codeplex.com
答案 2 :(得分: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