Добрый день , Сергей !
Использую Вашу библиотеку уже не первый раз и сейчас потребовалось воспользоваться нелинейной аппроксимацией. Аппроксимировать надо пик функцией Гаусса. Однако вычисляемые параметры оказываются совсем неверными : если брать в функции Гаусса только 2 параметра ( мат. ожидание и дисперсию) ,то начальные значения
вообще не изменяются (виде похожую проблему в одной теме - взял начальные параметры близкими к предполагаемым - не помогает) ; если же брать 4 параметра , то регрессия проходит , но значения все равно остаются очень далекими от необходимых. Привожу здесь код , для функции с 4-мя параметрами :
Code:
public static void function_cx_1_func(double[] c, double[] x, ref double func, object obj)
{
func =c[3]+ c[2]/(c[1]*Math.Sqrt(Math.PI/2))* Math.Exp(-2*Math.Pow((x[0]-c[0])/c[1],2));
}
private void button4_Click(object sender, EventArgs e)
{
double[,] x1 =new double[,]{ { 655.89}, { 655.94},{ 655.99}, { 656.04}, { 656.09}, { 656.14}, { 656.19}, { 656.24}, { 656.29}, { 656.34}, { 656.39}, { 656.44} };
double[] y1 = new double[] { 56.0, 200.0, 288.0, 612.0, 1312.0, 3356.0, 8348.0, 14552.0, 9648.0, 2620.0, 524.0, 208.0 };
//{ 656.242, 0.10615, 1849.245 , 376.85 } - ожидаемые параметры, вычисленные в Origin 8
double[] c = new double[] { 656, 0.1, 1800, 370 };
double epsf = 0;
double epsx =0.000001;
int maxits =0;
int info;
alglib.lsfitstate state;
alglib.lsfitreport rep;
double diffstep = 0.0001;
alglib.lsfitcreatef(x1, y1, c, diffstep, out state);
alglib.lsfitsetcond(state, epsf, epsx, maxits);
alglib.lsfitfit(state, function_cx_1_func, null, null);
alglib.lsfitresults(state, out info, out c, out rep);
textBox1.Text += alglib.ap.format(c, 4)+" "+info + Environment.NewLine;//info =2
//{656.2421,0.1057,1838.9224,412.1488}- вычисленные значения , которые очень плохо аппроксимируют зависимость.
}
Если брать начальные параметры чуть дальше от нужных { 650 , 0.1, 1000, 500 }, то аппроксимация вообще фактически не происходит : {650.0000,0.1000,1000.0000,3477.0000}.
Очень прошу подсказать , в чем может быть проблема. Спасибо !