2014-06-20 157 views
7

我對Math.Net Library非常陌生,並且在嘗試基於指數函數進行曲線擬合時遇到了問題。更具體地講,我打算使用此功能:使用Math.Net的基於指數的曲線擬合

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

使用MATLAB我得到相當不錯的效果,如圖所示如下圖:

blah

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可以實現這些結果嗎?

回答

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 
沿着以下應 工作線的東西
2

看看Math.net,似乎Math.net會執行各種類型的迴歸,而您的函數需要某種類型的迭代方法。例如Gauss-Newton的方法,你可以在每次迭代中使用線性迴歸來求解一個(超定)線性方程組,但是這仍然需要一些「手動」的工作來編寫方法。

1

答案是:還沒有,我相信。基本上,整個csmpfit包有貢獻,但它還沒有被整合到Math.Net中。您可以將它作爲單獨的庫使用,然後在完全整合後移至Math.Net。鏈接http://csmpfit.codeplex.com