forum.alglib.net
http://forum.alglib.net/

Levenberg Max. State.NeedF and NeedFiJ deprecated?
http://forum.alglib.net/viewtopic.php?f=2&t=3822
Page 1 of 1

Author:  DarkDudae [ Mon Nov 13, 2017 1:48 pm ]
Post subject:  Levenberg Max. State.NeedF and NeedFiJ deprecated?

Hi everyone:

I used old AlgLib versions (when source code was provided), where Levenberg functions were used like this:

Code:

minlm_fj2 example

var
    State : MinLMState;
    Rep : MinLMReport;
    I : AlglibInteger;
    S : TReal1DArray;
    X : TReal1DArray;
    Y : TReal1DArray;
    FI : Double;
    N : AlglibInteger;
    M : AlglibInteger;
begin
   
    //
    // Example of solving polynomial approximation task using FJ scheme.
    //
    // Data points:
    //     xi are random numbers from [-1,+1],
    //
    // Function being fitted:
    //     yi = exp(xi) - sin(xi) - x^3/3
    //
    // Function being minimized:
    //     F(a,b,c) =
    //         (a + b*x0 + c*x0^2 - y0)^2 +
    //         (a + b*x1 + c*x1^2 - y1)^2 + ...
    //
    N := 3;
    SetLength(S, N);
    I:=0;
    while I<=N-1 do
    begin
        S[I] := RandomReal-0.5;
        Inc(I);
    end;
    M := 100;
    SetLength(X, M);
    SetLength(Y, M);
    I:=0;
    while I<=M-1 do
    begin
        X[I] := AP_Double(2*I)/(M-1)-1;
        Y[I] := Exp(X[I])-Sin(X[I])-X[I]*X[I]*X[I]/3;
        Inc(I);
    end;
   
    //
    // Now S stores starting point, X and Y store points being fitted.
    //
    MinLMCreateFJ(N, M, S, State);
    MinLMSetCond(State, 0.0, 0.0, 0.001, 0);
    while MinLMIteration(State) do
    begin
        if State.NeedF then
        begin
            State.F := 0;
        end;
        I:=0;
        while I<=M-1 do
        begin
           
            //
            // "a" is stored in State.X[0]
            // "b" - State.X[1]
            // "c" - State.X[2]
            //
            FI := State.X[0]+State.X[1]*X[I]+State.X[2]*AP_Sqr(X[I])-Y[I];
            if State.NeedF then
            begin
               
                //
                // F is equal to sum of fi squared.
                //
                State.F := State.F+AP_Sqr(FI);
            end;
            if State.NeedFiJ then
            begin
               
                //
                // Fi
                //
                State.Fi[I] := FI;
               
                //
                // dFi/da
                //
                State.J[I,0] := 1;
               
                //
                // dFi/db
                //
                State.J[I,1] := X[I];
               
                //
                // dFi/dc
                //
                State.J[I,2] := AP_Sqr(X[I]);
            end;
            Inc(I);
        end;
    end;
    MinLMResults(State, S, Rep);
   
    //
    // output results
    //
    Write(Format('A = %4.2f'#13#10'',[
        S[0]]));
    Write(Format('B = %4.2f'#13#10'',[
        S[1]]));
    Write(Format('C = %4.2f'#13#10'',[
        S[2]]));
    Write(Format('TerminationType = %0d (should be 2 - stopping when step is small enough)'#13#10'',[
        Rep.TerminationType]));
end.


However, in dll version I can?t use this code anymore, since the State.NeedF or State.NeedFiJ are deprecated (not recognized).
How could I get the same results with new versions? I guess I should use minlmoptimize function, but I don?t know how to do that since examples provided are not suitable for my needs.

Thank you in advance

Author:  Sergey.Bochkanov [ Tue Nov 14, 2017 8:48 am ]
Post subject:  Re: Levenberg Max. State.NeedF and NeedFiJ deprecated?

1. Yes, you can get same results with new version - although you can't access optimizer internals like in old unsupported ALGLIB version. Can you tell me what is wrong with examples and why you can't apply them to your task?

From what I see, it is pretty standard optimization process which is well covered by examples in manual.

2. Just for your information. If you want to perform polynomial fitting, it may be easier to use http://www.alglib.net/translator/man/manual.delphi.html#sub_polynomialfit followed by conversion from barycentic representation into power basis.

Author:  DarkDudae [ Thu Nov 16, 2017 8:18 am ]
Post subject:  Re: Levenberg Max. State.NeedF and NeedFiJ deprecated?

Thanks for the reply!

I already managed to get it using the minlmoptimize(state, function1_fvec, function1_jac, nil, MyMatrixWithValues).
I just had to create the function1_fvec and function1_jac (with its derivatives) and pass them my own Matrix.

I am not trying to perform polynomial fitting, but finding "peaks" in a wave. So I need Levenberg because I am just looking for gaussians or gaussians group.
(The example I provided in the first post is one sample included in old alglib versions, but the structure was similar to the one I needed)

Now everything is working as expected.

Thanks again.

Page 1 of 1 All times are UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/