forum.alglib.net http://forum.alglib.net/ |
|
Nonlinear approximation problem http://forum.alglib.net/viewtopic.php?f=2&t=3823 |
Page 1 of 1 |
Author: | sadimakum [ Sun Nov 19, 2017 1:01 pm ] | |||
Post subject: | Nonlinear approximation problem | |||
Добрый день , Сергей ! Использую Вашу библиотеку уже не первый раз и сейчас потребовалось воспользоваться нелинейной аппроксимацией. Аппроксимировать надо пик функцией Гаусса. Однако вычисляемые параметры оказываются совсем неверными : если брать в функции Гаусса только 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}. Очень прошу подсказать , в чем может быть проблема. Спасибо !
|
Author: | Sergey.Bochkanov [ Mon Nov 20, 2017 8:40 am ] |
Post subject: | Re: Nonlinear approximation problem |
Вам надо установить масштаб переменных при помощи lsfitsetscale(). Второй коэффициент на несколько порядков меньше, чем остальные - это сбивает с толку оптимизатор. Масштаб здесь будет что-то вроде [1000,1,1000,1000] или [100,1,100,100]. P.S. just for you to know, it is English-only forum :) |
Author: | sadimakum [ Mon Nov 20, 2017 11:10 am ] |
Post subject: | Re: Nonlinear approximation problem |
THANKS A LOT ! |
Page 1 of 1 | All times are UTC |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |