Equations: Array;
Equations: System.Array;
The Equations property determines equations of a system.
Use the ICpNonLinearDecomposition.MethodType property to determine the method of solution search.
The system of non-linear equations is created in this example:
Output variables: x1, x2.
Controlling variables: u, v.
Equations form the system:
x1[t] = 0.3 * x1[t-1] + 0.1 * x2[t+1] + u[t-1] * x1[t+1] *x2[t-1].
x2[t] = -0.2 * x1[t-1] + 0.4 *x2[t+1] + (x1[t+1] * x2[t-1])/(v[t-1]+1).
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;
// Adding 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;
// Adding 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;
// Setting initial approximations for the first controlling variable
For i := 0 To PeriodL - 1 Do
InitApproximation[i] := 1.5 * (i + 1);
End For;
// Adding 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;
// Setting initial approximations for the second controlling variable
For i := 0 To PeriodL - 1 Do
InitApproximation[i] := 2 * (i + 1);
End For;
// Adding 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;
// Creating 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);
// Output of results
If (Res.Status = 0) Then
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 this example a non-linear equation system is created and calculated. Calculation results are shown in the console window.
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;
// Adding 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;
// Adding 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;
// Setting initial approximations for the first controlling variable
For i := 0 To PeriodL - 1 Do
InitApproximation[i] := 1.5 * (i + 1);
End For;
// Adding 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;
// Setting initial approximations for the second controlling variable
For i := 0 To PeriodL - 1 Do
InitApproximation[i] := 2 * (i + 1);
End For;
// Adding 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;
// Creating 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);
// Output of results
If (Res.Status = 0) Then
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: