Подгонка кривой на основе экспоненты с использованием Math.Net

#c# #matlab #curve-fitting #mathnet-numerics

#c# #matlab #подгонка кривой #mathnet-числовые методы

Вопрос:

Я очень новичок в 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 ?

Ответ №1:

Глядя на Math.net , кажется, что Math.net выполняет различные типы регрессии, в то время как ваша функция требует некоторого типа итеративного метода. Например, метод Гаусса-Ньютона, в котором вы будете использовать линейную регрессию на каждой итерации для решения (переопределенной) системы линейных уравнений, но для этого все равно потребуется некоторая «ручная» работа с написанием метода.

Ответ №2:

Нет, похоже, на данный момент нет экспоненциальной поддержки. Однако есть обсуждение 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
 

Ответ №3:

Ответ: пока нет, я полагаю. В принципе, есть вклад всего csmpfit пакета, но он еще не интегрирован в Math.Net . Вы можете использовать его как отдельную библиотеку, а затем после полной интеграции перейти к Math.Net . Ссылка http://csmpfit.codeplex.com