Я тут продолжаю благородное дело — переписываю кое-какие учебные причиндалы с древнего 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.