ICpNonLinearDecomposition.Equations

Fore Syntax

Equations: Array;

Fore.NET Syntax

Equations: System.Array;

Description

The Equations property determines system equations.

Comments

Use the ICpNonLinearDecomposition.MethodType property to determine a method of solution search.

Fore Example

The system of non-linear equations is created in this example:

Add links to the Cp, Stat system assemblies.

Sub UserProc;
Var
    Optima: NonLinearDecomposition;
    PeriodL, j, i: Integer;
    Vars: INonLDVariables;
    Vrbl: INonLDVariable;
    RetroX1, ForestX1: Array 
Of Double;
    RetroX2, ForestX2: Array 
Of Double;
    RetroU, ForestU: Array 
Of Double;
    RetroV, ForestV, InitApproximation: Array 
Of Double;
    Funstions: Array 
Of String;
    Res: INonLoResults;
    val: Double;
Begin
    Optima := 
New NonLinearDecomposition.Create;
    
// Set value of calculation period
    PeriodL := 4;
    RetroX1 := 
New Double[PeriodL]; ForestX1 := New Double[PeriodL];
    RetroX2 := 
New Double[PeriodL]; ForestX2 := New Double[PeriodL];
    RetroU := 
New Double[PeriodL]; ForestU := New Double[PeriodL];
    RetroV := 
New Double[PeriodL]; ForestV := New Double[PeriodL];
    InitApproximation := 
New Double[PeriodL];
    
For i := 0 To PeriodL - 1 Do
    RetroX1[i] := -
2.1 - i; ForestX1[i] := 1.9 + i;
    RetroX2[i] := -
2.2 - i; ForestX2[i] := 1.8 + i;
    RetroU[i] := -
2.3 - i; ForestU[i] := 1.7 + i;
    RetroV[i] := -
2.4 - i; ForestV[i] := 1.6 + i;
    InitApproximation[i] := 
0.1;
    
End For;
    
// Add the first variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add(
"x1");
    Vrbl.Retrospective := RetroX1;
    Vrbl.CoefficientsOrderRetrospective := 
"x1[t];x1[t-1]";
    Vrbl.Forestall := ForestX1;
    Vrbl.CoefficientsOrderForestall := 
"x1[t];x1[t+1]";
    Vrbl.InitApproximation := InitApproximation;
    
// Add the second variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add(
"x2");
    Vrbl.Retrospective := RetroX2;
    Vrbl.CoefficientsOrderRetrospective := 
"x2[t];x2[t-1]";
    Vrbl.Forestall := ForestX2;
    Vrbl.CoefficientsOrderForestall := 
"x2[t];x2[t+1]";
    Vrbl.InitApproximation := InitApproximation;
    
// Set initial approximations for the first controlling variable
    For i := 0 To PeriodL - 1 Do
    InitApproximation[i] := 
1.5 * (i + 1);
    
End For;
    
// Add the first controlling variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add(
"u");
    Vrbl.Retrospective := RetroU;
    Vrbl.CoefficientsOrderRetrospective := 
"u[t];u[t-1]";
    Vrbl.Forestall := ForestU;
    Vrbl.CoefficientsOrderForestall := 
"u[t];u[t+1]";
    Vrbl.ControlVariable := 
True;
    Vrbl.InitApproximation := InitApproximation;
    
// Set initial approximations for the second controlling variable
    For i := 0 To PeriodL - 1 Do
    InitApproximation[i] := 
2 * (i + 1);
    
End For;
    
// Add the second controlling variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add(
"v");
    Vrbl.Retrospective := RetroV;
    Vrbl.CoefficientsOrderRetrospective := 
"v[t];v[t-1]";
    Vrbl.Forestall := ForestV;
    Vrbl.CoefficientsOrderForestall := 
"v[t];v[t+1]";
    Vrbl.ControlVariable := 
True;
    Vrbl.InitApproximation := InitApproximation;
    
// Create a system of non-linear equations
    Funstions := New String[2];
    Funstions[
0] := "0.3 * x1[t-1] + 0.1 * x2[t+1] + 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-1])/(v[t-1]+1)";
    Optima.Equations := Funstions;
    Optima.NodesCount := 
2;
    Optima.Extremum := ExtremumType.Minimum;
    Optima.MaxIteration := 
250;
    Optima.Tolerance := 
0.000001;
    Optima.MethodType := NonLinearEquationsType.HMethod;
    
// System calculation
    Res := Optima.Evaluate(PeriodL) As INonLoResults;
    Debug.WriteLine(Res.ErrorMsg);
    
// Display results
    If (Res.Status = 0Then
        Vars := Optima.Variables;
        
For j := 0 To Vars.Count - 1 Do
            Vrbl := Vars.Item(j);
            Debug.WriteLine(
"Variable: " + Vrbl.Id);
            Debug.Indent;
            
For i := 0 To PeriodL - 1 Do
                Val := Res.VarValues(Vrbl.Id)[i];
                Debug.WriteLine(Val);
            
End For;
            Debug.Unindent;
        
End For;
    
End If;
End Sub UserProc;

After executing the example a system of non-linear equations is created and calculated. Calculation results are displayed in the console window.

Fore.NET Example

The requirements and result of the Fore.NET Example execution match with those in the Fore Example.

Imports Prognoz.Platform.Interop.Cp;
Imports Prognoz.Platform.Interop.Stat;

Public Shared Sub Main(Params: StartParams);
Var
    Optima: NonLinearDecomposition;
    PeriodL, j, i: Integer;
    Vars: INonLDVariables;
    Vrbl: INonLDVariable;
    RetroX1, ForestX1: Array Of Double;
    RetroX2, ForestX2: Array Of Double;
    RetroU, ForestU: Array Of Double;
    RetroV, ForestV, InitApproximation: Array Of Double;
    Funstions: Array Of String;
    Res: INonLoResults;
    val: Double;
Begin
    Optima := New NonLinearDecomposition.Create();
    // Set calculation period value
    PeriodL := 4;
    RetroX1 := New Double[PeriodL]; ForestX1 := New Double[PeriodL];
    RetroX2 := New Double[PeriodL]; ForestX2 := New Double[PeriodL];
    RetroU := New Double[PeriodL]; ForestU := New Double[PeriodL];
    RetroV := New Double[PeriodL]; ForestV := New Double[PeriodL];
    InitApproximation := New Double[PeriodL];
    For i := 0 To PeriodL - 1 Do
    RetroX1[i] := -2.1 - i; ForestX1[i] := 1.9 + i;
    RetroX2[i] := -2.2 - i; ForestX2[i] := 1.8 + i;
    RetroU[i] := -2.3 - i; ForestU[i] := 1.7 + i;
    RetroV[i] := -2.4 - i; ForestV[i] := 1.6 + i;
    InitApproximation[i] := 0.1;
    End For;
    // Add the first variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add("x1");
    Vrbl.Retrospective := RetroX1;
    Vrbl.CoefficientsOrderRetrospective := "x1[t];x1[t-1]";
    Vrbl.Forestall := ForestX1;
    Vrbl.CoefficientsOrderForestall := "x1[t];x1[t+1]";
    Vrbl.InitApproximation := InitApproximation;
    // Add the second variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add("x2");
    Vrbl.Retrospective := RetroX2;
    Vrbl.CoefficientsOrderRetrospective := "x2[t];x2[t-1]";
    Vrbl.Forestall := ForestX2;
    Vrbl.CoefficientsOrderForestall := "x2[t];x2[t+1]";
    Vrbl.InitApproximation := InitApproximation;
    // Set initial approximations for the first controlling variable
    For i := 0 To PeriodL - 1 Do
    InitApproximation[i] := 1.5 * (i + 1);
    End For;
    // Add the first controlling variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add("u");
    Vrbl.Retrospective := RetroU;
    Vrbl.CoefficientsOrderRetrospective := "u[t];u[t-1]";
    Vrbl.Forestall := ForestU;
    Vrbl.CoefficientsOrderForestall := "u[t];u[t+1]";
    Vrbl.ControlVariable := True;
    Vrbl.InitApproximation := InitApproximation;
    // Set initial approximations for the second controlling variable
    For i := 0 To PeriodL - 1 Do
    InitApproximation[i] := 2 * (i + 1);
    End For;
    // Add the second controlling variable
    Vars := Optima.Variables;
    Vrbl := Vars.Add("v");
    Vrbl.Retrospective := RetroV;
    Vrbl.CoefficientsOrderRetrospective := "v[t];v[t-1]";
    Vrbl.Forestall := ForestV;
    Vrbl.CoefficientsOrderForestall := "v[t];v[t+1]";
    Vrbl.ControlVariable := True;
    Vrbl.InitApproximation := InitApproximation;
    // Create a system of non-linear equations
    Funstions := New String[2];
    Funstions[0] := "0.3 * x1[t-1] + 0.1 * x2[t+1] + 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-1])/(v[t-1]+1)";
    Optima.Equations := Funstions;
    Optima.NodesCount := 2;
    Optima.Extremum := ExtremumType.tetMinimum;
    Optima.MaxIteration := 250;
    Optima.Tolerance := 0.000001;
    Optima.MethodType := NonLinearEquationsType.nletHMethod;
    // System calculation
    Res := Optima.Evaluate(PeriodL) As INonLoResults;
    System.Diagnostics.Debug.WriteLine(Res.ErrorMsg);
    // Display results
    If (Res.Status = 0Then
        Vars := Optima.Variables;
        For j := 0 To Vars.Count - 1 Do
            Vrbl := Vars.Item[j];
            System.Diagnostics.Debug.WriteLine("Variable: " + Vrbl.Id);
            System.Diagnostics.Debug.Indent();
            For i := 0 To PeriodL - 1 Do
                Val := Res.VarValues[Vrbl.Id][i] As double;
                System.Diagnostics.Debug.WriteLine(Val);
            End For;
            System.Diagnostics.Debug.Unindent();
        End For;
    End If;
End Sub;

See also:

ICpNonLinearDecomposition