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}.
Очень прошу подсказать , в чем может быть проблема. Спасибо !

Attachments:
File comment: Формула подбираемой зависимости
APPROX.jpg
APPROX.jpg [ 14.25 KiB | Viewed 2538 times ]
File comment: Синими точками - исходные данные , красными - полученная функция Гаусса
APPROX11.jpg
APPROX11.jpg [ 29.98 KiB | Viewed 2538 times ]

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/