INonLoVariable.InitApproximation

Syntax

InitApproximation: Array;

Description

The InitApproximation property determines array of initial approximations for controlling variable. If calculation could not be completed because of array elements lack, then values of the IVarConstraint.LowerBound property are used as values of missing elements. If value of the IVarConstraint.LowerBound property is not defined, initial approximation "0,01" is taken.

Example

Add a link to the Cp system assembly.

Sub UserProc;
Var
    Optima: NonLinearOptimization;
    Vars: INonLoVariables; //variables list
    Vrbl: INonLoVariable; //variable
    VarConstr: IVarConstraint; //variable constraint
    VarConstrs: IVarConstraints; //list of variable constraints
    RetroX1: Array[3Of Double;
    RetroX2: Array[3Of Double;
    RetroU: Array[3Of Double;
    RetroV: Array[3Of Double;
    Funstions: Array[2Of String;
    InitAp: Array[3Of Double;
    Res: INonLoResults;
    TimeInterval: Integer;
    s: String;
    ci: ICultureInfo;
    j, i: Integer;
    val: Double;
Begin
    Optima := New NonLinearOptimization.Create;
// Values of variables
    RetroX1[0] := 2;
    RetroX1[1] := 2.1;
    RetroX1[2] := 2.2;
    RetroX2[0] := 1;
    RetroX2[1] := 0.9;
    RetroX2[2] := 0;
    RetroU[0] := 1;
    RetroU[1] := 1.5;
    RetroU[2] := 0;
    RetroV[0] := 0.5;
    RetroV[1] := 0.75;
    RetroV[2] := 0;
// Variables and constraints
    Vars := Optima.Variables;
    Vrbl := Vars.Add("x1");
    Vrbl.Retrospective := RetroX1;
    Vrbl.CoefficientsOrder := "x1[t];x1[t-1];x1[t-2];x1[t-3]";
    VarConstrs := Vrbl.Constraints;
    
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -101;
    VarConstr.UpperBound := 101;
    VarConstr.Lag := 3;
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -102;
    VarConstr.UpperBound := 102;
    VarConstr.Lag := 2;
    
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -10030;
    VarConstr.UpperBound := 10030;
    VarConstr.Lag := 1;
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -13040;
    VarConstr.UpperBound := 13040;
    VarConstr.Lag := 0;
    Vars := Optima.Variables;
    Vrbl := Vars.Add("x2");
    Vrbl.Retrospective := RetroX2;
    Vrbl.CoefficientsOrder := "x2[t];x2[t-1];x2[t-2]";
    VarConstrs := Vrbl.Constraints;
    
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -201;
    VarConstr.UpperBound := 201;
    VarConstr.Lag := 3;
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -202;
    VarConstr.UpperBound := 202;
    VarConstr.Lag := 2;
    
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -203;
    VarConstr.UpperBound := 203;
    VarConstr.Lag := 1;
    VarConstr := VarConstrs.Add;
    VarConstr.LowerBound := -12040;
    VarConstr.UpperBound := 12040;
    VarConstr.Lag := 0;
//Controlling variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add("u");
    Vrbl.Name := "Controlling variable 1";
    Vrbl.Retrospective := RetroU;
    Vrbl.ControlVariable := True;
    Vrbl.CoefficientsOrder := "u[t];u[t-1]";
    For i := 0 To 2 Do
        InitAp[i] := 0.1 * i;
    End For;
    Vrbl.InitApproximation := InitAp;
    VarConstrs := Vrbl.Constraints;
    For i := 0 To 3 Do
        VarConstr := VarConstrs.Add;
        VarConstr.LowerBound := 0;
        VarConstr.UpperBound := 1;
        VarConstr.Lag := i;
    End For;
//Controlling variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add("v");
    Vrbl.Name := "Controlling variable 2";
    Vrbl.Retrospective := RetroV;
    Vrbl.ControlVariable := True;
    Vrbl.CoefficientsOrder := "v[t];v[t-1]";
    For i := 0 To 2 Do
        InitAp[i] := 8.8 * i;
    End For;
    Vrbl.InitApproximation := InitAp;
    VarConstrs := Vrbl.Constraints;
    For i := 0 To 3 Do
        VarConstr := VarConstrs.Add;
        VarConstr.LowerBound := 0.8;
        VarConstr.UpperBound := 4;
        VarConstr.Lag := i;
    End For;
    
    Funstions := New string[2];
    Funstions[0] := "0.3 * x1[t-1] + 0.1 * x2[t-2] + u[t-1] * x1[t-1] *x2[t-1]";
    Funstions[1] := "-0.2 * x1[t-1] + 0.4 *x2[t-1] + (x1[t-1] * x2[t-2])/v[t-1]";
    Optima.Equations := Funstions;
&nbsp;&nbsp;&nbsp;&nbsp;Optima.CriterionFunction&nbsp;:=&nbsp;<font color="#800000">&quot;x1[t]&nbsp;*&nbsp;x1[t]&nbsp;-&nbsp;x1[t]&nbsp;*&nbsp;x2[t]&quot;</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;TimeInterval&nbsp;:=&nbsp;<font color="#008000">4</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Optima.NodesCount&nbsp;:=&nbsp;<font color="#008000">2</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Optima.MaxIterationsCount&nbsp;:=&nbsp;<font color="#008000">5000</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Optima.MethodType&nbsp;:=&nbsp;CpNonLinearMethodType.SequentialQP;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Optima.Tolerance&nbsp;:=&nbsp;<font color="#008000">0</font>.<font color="#008000">1</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Optima.Extremum&nbsp;:=&nbsp;ExtremumType.Maximum;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Res&nbsp;:=&nbsp;Optima.Evaluate(TimeInterval)&nbsp;<font color="#008080">As</font>&nbsp;INonLoResults;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<br/> &nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;<font color="#800000">&quot;Optimal&nbsp;value:&nbsp;&quot;</font>&nbsp;+&nbsp;Res.OptimalValue.ToString;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Debug.WriteLine(s);<br/> &nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;<font color="#800000">&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">For</font>&nbsp;j&nbsp;:=&nbsp;<font color="#008000">1</font>&nbsp;<font color="#008080">To</font>&nbsp;Vars.Count&nbsp;<font color="#008080">Do</font><br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vrbl&nbsp;:=&nbsp;Vars.Item(j&nbsp;-&nbsp;<font color="#008000">1</font>);<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;s&nbsp;+&nbsp;Vrbl.Id&nbsp;+&nbsp;<font color="#800000">&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">End</font>&nbsp;<font color="#008080">For</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Debug.WriteLine(s);<br/> &nbsp;&nbsp;&nbsp;&nbsp;<br/> &nbsp;&nbsp;&nbsp;&nbsp;ci&nbsp;:=&nbsp;CultureInfo.Current;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">For</font>&nbsp;i&nbsp;:=&nbsp;<font color="#008000">1</font>&nbsp;<font color="#008080">To</font>&nbsp;TimeInterval&nbsp;<font color="#008080">Do</font><br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;<font color="#800000">&quot;t=&quot;</font>&nbsp;+&nbsp;i.ToString&nbsp;+&nbsp;<font color="#800000">&quot;,&nbsp;&quot;</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">For</font>&nbsp;j&nbsp;:=&nbsp;<font color="#008000">1</font>&nbsp;<font color="#008080">To</font>&nbsp;Vars.Count&nbsp;<font color="#008080">Do</font><br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vrbl&nbsp;:=&nbsp;Vars.Item(j&nbsp;-&nbsp;<font color="#008000">1</font>);<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Val&nbsp;:=&nbsp;Res.VarValues(Vrbl.Id)[i&nbsp;-&nbsp;<font color="#008000">1</font>];<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;s&nbsp;+&nbsp;ci.FormatDoublePrec(Val,&nbsp;<font color="#008000">6</font>)&nbsp;+&nbsp;<font color="#800000">&quot;,&nbsp;&quot;</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">End</font>&nbsp;<font color="#008080">For</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.WriteLine(s);<br/> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">End</font>&nbsp;<font color="#008080">For</font>;<br/> &nbsp;&nbsp;&nbsp;&nbsp;<br/> &nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;<font color="#800000">&quot;Status&nbsp;:&nbsp;&quot;</font>&nbsp;+&nbsp;Res.Status.ToString;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Debug.WriteLine(s);<br/> &nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;<font color="#800000">&quot;Error&nbsp;:&nbsp;&quot;</font>&nbsp;+&nbsp;Res.ErrorMsg;<br/> &nbsp;&nbsp;&nbsp;&nbsp;Debug.WriteLine(s);<br/> <font color="#008080">End</font>&nbsp;<font color="#008080">Sub</font>&nbsp;UserProc;

After executing this example the calculation results are displayed in console window:

Optimal value:- 5222824.6794125168
     x1        x2        u        v        
t=12,6900003,6000001,0000000,800000
t=210,5910004,2645001,0000000,800000
t=348,70262047,2471001,0000004,000000
t=4, 2 316,09477061,0815680,0000000,800000
Status : 21
Error: The solution is found, but the iteration sequence did not converge with the required accuracy

See also:

INonLoVariable