Кто-нибудь разбирался с реализацией алгоритма Левенберга-Марквардта в библиотеке ALGLIB? Мне кажется, пример не соответствует описанию! Вот код (на C#): | Код | for(rkind=0; rkind<=2; rkind++) { x[0] = 100*AP.Math.RandomReal()-50; x[1] = 100*AP.Math.RandomReal()-50; x[2] = 100*AP.Math.RandomReal()-50; if( rkind==0 ) { minlm.minlmfj(n, m, ref x, 0.0, 0.0, 0, ref state); } if( rkind==1 ) { minlm.minlmfgj(n, m, ref x, 0.0, 0.0, 0, ref state); } if( rkind==2 ) { minlm.minlmfgh(n, ref x, 0.0, 0.0, 0, ref state); } while( minlm.minlmiteration(ref state) ) { // // (x-2)^2 + y^2 + (z-x)^2 // state.f = AP.Math.Sqr(state.x[0]-2)+AP.Math.Sqr(state.x[1])+AP.Math.Sqr(state.x[2]-state.x[0]); if( state.needfg | state.needfgh ) { state.g[0] = 2*(state.x[0]-2)+2*(state.x[0]-state.x[2]); state.g[1] = 2*state.x[1]; state.g[2] = 2*(state.x[2]-state.x[0]); } if( state.needfij ) { state.fi[0] = state.x[0]-2; state.fi[1] = state.x[1]; state.fi[2] = state.x[2]-state.x[0]; state.j[0,0] = 1; state.j[0,1] = 0; state.j[0,2] = 0; state.j[1,0] = 0; state.j[1,1] = 1; state.j[1,2] = 0; state.j[2,0] = -1; state.j[2,1] = 0; state.j[2,2] = 1; } if( state.needfgh ) { state.h[0,0] = 4; state.h[0,1] = 0; state.h[0,2] = -2; state.h[1,0] = 0; state.h[1,1] = 2; state.h[1,2] = 0; state.h[2,0] = -2; state.h[2,1] = 0; state.h[2,2] = 2; } scerror = scerror | !rkindvsstatecheck(rkind, ref state); } minlm.minlmresults(ref state, ref x, ref rep); referror = referror | rep.terminationtype<=0 | Math.Abs(x[0]-2)>0.001 | Math.Abs(x[1])>0.001 | Math.Abs(x[2]-2)>0.001; }
|
Судя по всему, в этом методе минимизируется функция (x-2)^2 + y^2 + (z-x)^2 В инструкции написано, что | Цитата | В зависимости от того, что именно требуется вычислить, подпрограмма MinLMIteration может устанавливать в True одно и только одно из следующих полей:
* NeedF – сигнализирует о том, что требуется вычислить значение функции F (не путайте с вектором fi ) * NeedFG – сигнализирует о том, что требуется вычислить значения функции F и градиента F * NeedFiJ – сигнализирует о том, что требуется вычислить вектор функций fi и матрицу Якоби * NeedFGH – сигнализирует о том, что требуется вычислить значение функции F, градиент F и гессиан F
|
Однако по коду явно видно, что, например, когда if( state.needfgh ) то градиенты вообще не вычисляются.
|