LINUX.ORG.RU

Не осилил datafit

 


0

1

Я тут продолжаю благородное дело — переписываю кое-какие учебные причиндалы с древнего Matlab и прочего под Scilab. На datafit что-то застрял.

//сумма трёх гауссовых кривых, функция для аппроксимации
function y = gauss3(x, co)
    y = co(1)*exp(-((x - co(2))/co(3)).^2) ..
        + co(4)*exp(-((x - co(5))/co(6)).^2) ..
        + co(7)*exp(-((x - co(8))/co(9)).^2);
endfunction

//функция-критерий, которую должна вызывать datafit
function e = G(co, z)
    s = z(1);
    t = z(2);
    e = s - gauss3(t, co);
endfunction

Задаю 2 набора коэффициентов, «точный» и «приблизительный».

co0 = [3.386e4; 637.1; 94.32; 1.112e5; 534; 226.1; 1.042e4; 996.3; 646.6];
co1 = [3e4; 600; 90; 1e5; 500; 200; 1e4; 1e3; 650];
По «точному» создаю набор значений, «приблизительный» использую в качестве начального предположения.
S = gauss3(T, co0);

--> [coeffs, err] = datafit(2, G, [S; T], co1)

***** enters -qn code- (without bound cstr)
dimension=         9, epsq=  0.2220446049250313E-15, verbosity level: imp=         2
max number of iterations allowed: iter=       100
max number of calls to costf allowed: nap=       100
------------------------------------------------
 iter num    1, nb calls=   1, f= 0.1933E+07
***** leaves -qn code-, gradient norm=  0.0000000000000000E+00
Норма проекции градиента менее   0.0000000D+00.

 err  =
 
    1933114.9  
 coeffs  =
 
    30000.   
    600.     
    90.      
    100000.  
    500.     
    200.     
    10000.   
    1000.    
    650.     
Собственно, ничего не меняется и не считается. ЧЯДНТ?

понятия не имею как там в scilab

У меня предположения 2: 1) функция е неправильная. Она у тебя число выдает? Или массив 2) точная функция gauss3(с0) такова, что в ней сложно вычленить 3 отдельных гаусса. Оно не поймет, в какую сторону менять коэффициенты, чтобы улучшения происходили

sshestov ()
Ответ на: комментарий от NoName

mfile2sci

Я слышал про такую штуку, конечно, но не думаю, что всё автоматом преобразуется как надо. У матлабовского fit вообще нет функции-критерия, точнее, она запрятана куда-то под капот. Позже попробую, может, что и выйдет.

sshestov

функция е неправильная.

Вполне возможно, я её из мануала передрал.

Она у тебя число выдает? Или массив

Да вроде бы как число. И вызывается 100 раз за одну аппроксимацию (по числу точек).

al_exquemelin ★★★ ()
Ответ на: комментарий от al_exquemelin

Частично завелось, но не так, как надо.

Взял за S экспериментальные данные, для аппроксимации которых подбирались co0.

-->[coeffs, err] = datafit(2, GG, [S; T], co0, stop='ar', nap=1e5, iter=1e5)

***** enters -qn code- (without bound cstr)
dimension=         9, epsq=  0.2220446049250313E-15, verbosity level: imp=         2
max number of iterations allowed: iter=    100000
max number of calls to costf allowed: nap=    100000
------------------------------------------------
 iter num    1, nb calls=   1, f= 0.4298E+07
 iter num    2, nb calls=   8, f= 0.1928E+07
 iter num    3, nb calls=   9, f= 0.9908E+05
 iter num    4, nb calls=  10, f=  482.2
 iter num    5, nb calls=  11, f=  1.166
 iter num    6, nb calls=  12, f= 0.8376E-05
 iter num    7, nb calls=  13, f= 0.2028E-12
 iter num    8, nb calls=  14, f= 0.1025E-13
 iter num    9, nb calls=  19, f= 0.8473E-15
 iter num   10, nb calls=  42, f= 0.8472E-15
 iter num   11, nb calls=  64, f= 0.8472E-15
 iter num   12, nb calls=  79, f= 0.8472E-15
 iter num   13, nb calls= 111, f= 0.8472E-15
 iter num   14, nb calls= 140, f= 0.8471E-15
 iter num   15, nb calls= 170, f= 0.8470E-15
 iter num   15, nb calls= 185, f= 0.8470E-15
***** leaves -qn code-, gradient norm=  0.2415759369517540E-05
Конец оптимизации.

 err  =
 
    8.470D-16  
 coeffs  =
 
    30000.     
    600.       
    90.        
    100000.    
    500.       
    200.       
    10002.187  
    1142.8338  
    935.17834

Специально задал количество итераций и вызовов побольше. Меняются, как видно, только 3 коэффициента. В ошибке, err, что-то несуразное.

al_exquemelin ★★★ ()
Ответ на: комментарий от al_exquemelin

Ну ты проверь все-таки смысл/как устроена функция невязки e (она же G). Я о scilab никогда не слышал, но в IDL и, кажется, в математике невязка - это 1 число (число, а не массив размером как и x). И стандартная (широкоиспользуемая) функция невязки должна была б быть типа e=total( (gauss3(x,co1)-gaus3(x,S)) ^2 )

Алгоритм, заложенный в datafit должен менять co1 пока невязка не будет достаточно маленькой. И для проверки поставь в co(2), co(5), co(8) разные значения, чтобы ему было удобно подбирать

sshestov ()
Ответ на: комментарий от sshestov

Хм. Оказывается, там есть встроенная функция под названием G. Вот тут, внутри datafit формируется. Если закомментировать моё определение для G, на это не ругается.

Непонятно, почему у меня не вылезало предупреждение, что переопределяю функцию, и зачем в мануале давать такую же G. Разрабам написать в рассылку, что ли.

al_exquemelin ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.