首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于指数曲线拟合的Math.Net方法

基于指数曲线拟合的Math.Net方法
EN

Stack Overflow用户
提问于 2014-06-20 21:48:34
回答 3查看 5K关注 0票数 7

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

代码语言:javascript
复制
f(x) = a*exp(b*x) + c*exp(d*x)

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

MATLAB计算下列参数:

代码语言:javascript
复制
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实现这些结果?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-28 18:24:36

不,现在似乎没有指数支持。然而,在Math.NET论坛上有一次讨论,维护人员在讨论中提出了解决办法:

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

在链接中断时复制的内容:

通过转换,您可以类似于通过转换将非线性模型进行线性化。类似于以下几点的内容应该有效:

代码语言:javascript
复制
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]}; 
}

示例用法:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-04-23 21:16:58

从Math.net的角度来看,Math.net似乎进行了各种类型的回归,而您的函数需要某种类型的迭代方法。例如,高斯-牛顿法,在每一次迭代中,你都会使用线性回归来求解(过确定的)线性方程组,但这仍然需要一些“人工”来编写这个方法。

票数 2
EN

Stack Overflow用户

发布于 2015-04-23 21:31:30

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24336153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档