ICpNonLinearOptimization.Explanatories

Синтаксис

Explanatories: INonLinearExplanatories;

Описание

Свойство Explanatories возвращает коллекцию объясняющих (сценарных) переменных.

Комментарии

Элементы коллекции реализованы интерфейсом INonLinearExplanatory. Значения каждой переменной должны быть заданы до расчета метода.

Пример

Ниже приведено описание процедуры, задающей все необходимые параметры для расчета методом нелинейной оптимизации. Используются две объясняющие переменные: «i» и «j», для каждой из которых будут заданы значения и коэффициенты.

Для выполнения примера необходимо добавить ссылку на системную сборку «Cp».

Sub UserProc;
Var
    Optima: NonLinearOptimization;
    Vars: INonLoVariables; //список переменных
    Vrbl: INonLoVariable; //переменная
    VarConstr: IVarConstraint; //ограничение на переменную
    VarConstrs: IVarConstraints; //список ограничений на переменную
    RetroX1: Array[3Of Double;
    RetroX2: Array[3Of Double;
    RetroU: Array[3Of Double;
    RetroV: Array[3Of Double;
    ValuesI: Array[4Of Double;
    Funstions: Array[2Of String;
    Res: INonLoResults;
    TimeInterval: Integer;
    s: String;
    ci: ICultureInfo;
    j, i: Integer;
    val: Double;
    Expl: INonLinearExplanatory;
Begin
    Optima := New NonLinearOptimization.Create;
    // Задаем значения переменных
    RetroX1[0] := 2; RetroX2[0] := 1;
    RetroX1[1] := 2.1; RetroX2[1] := 0.9;
    RetroX1[2] := 2.2; RetroX2[2] := 0;
    RetroU[0] := 1;      RetroV[0] := 0.5;
    RetroU[1] := 1.5; RetroV[1] := 0.75;
    RetroU[2] := 0;      RetroV[2] := 0;
    // Задаем переменную «x1»
    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;
    // Задаем ограничения на переменную «x1»
    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;
    // Задаем переменную «x2»
    Vars := Optima.Variables;
    Vrbl := Vars.Add("x2");
    Vrbl.Retrospective := RetroX2;
    Vrbl.CoefficientsOrder := "x2[t];x2[t-1];x2[t-2]";
    VarConstrs := Vrbl.Constraints;
    // Задаем ограничения на переменную «x2»
    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;
    // Задаем управляющую переменную «u» и ограничения на нее
    Vars := Optima.Variables;
    Vrbl := Vars.Add("u");
    Vrbl.Retrospective := RetroU;
    Vrbl.ControlVariable := True;
    Vrbl.CoefficientsOrder := "u[t];u[t-1]";
    VarConstrs := Vrbl.Constraints;
    For i := 0 To 3 Do
        VarConstr := VarConstrs.Add;
        VarConstr.LowerBound := 0;
        VarConstr.UpperBound := 1;
        VarConstr.Lag := i;
    End For;
    // Задаем управляющую переменную «v» и ограничения на нее
    Vars := Optima.Variables;
    Vrbl := Vars.Add("v");
    Vrbl.Retrospective := RetroV;
    Vrbl.ControlVariable := True;
    Vrbl.CoefficientsOrder := "v[t];v[t-1]";
    VarConstrs := Vrbl.Constraints;
    For i := 0 To 3 Do
        VarConstr := VarConstrs.Add;
        VarConstr.LowerBound := 0.8;
        VarConstr.UpperBound := 4;
        VarConstr.Lag := i;
    End For;
    // Задаем объясняющий ряд «i»
    Expl := Optima.Explanatories.Add;
    Expl.VariableName := "i";
    Expl.CoefficientsOrder := "i[t]";
    ValuesI := New Double[4];
    ValuesI[0] := 11;
    ValuesI[1] := 11;
    ValuesI[2] := 11;
    ValuesI[3] := 11;
    Expl.Series := ValuesI;

    // Задаем объясняющий ряд «j»
    Expl := Optima.Explanatories.Add;
    Expl.VariableName := "j";
    Expl.CoefficientsOrder := "j[t]";
    ValuesI := New Double[4];
    ValuesI[0] := -1;
    ValuesI[1] := -1;
    ValuesI[2] := -1;
    ValuesI[3] := -1;
    Expl.Series := ValuesI;
    // Задаем способ вычисления фазовых переменных
    Optima.VariablesCalculationTechnique := StateVariablesCalculationTechniqueType.IterativeCalculation;
    // Задаем уравнения и целевую функцию нелинейной оптимизации
    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] + i[t]+j[t]";
    Funstions[1] := "-0.2 * x1[t-1] + 0.4 *x2[t-1] + (x1[t-1] * x2[t-2])/v[t-1]+i[t]+j[t]";
    Optima.Equations := Funstions;
    Optima.CriterionFunction := "x1[t] * x1[t] - x1[t] * x2[t]+i[t]+j[t]";
    // Задаем метод оптимизации и прочие параметры
    TimeInterval := 4;
    Optima.NodesCount := 2;
    Optima.MaxIterationsCount := 150;
    Optima.MethodType := CpNonLinearMethodType.SequentialQP;
    Optima.Tolerance := 0.05;
    Optima.Extremum := ExtremumType.Maximum;
    // Осуществляем расчет
    Res := Optima.Evaluate(TimeInterval) As INonLoResults;
    If Res.Status = 0 Then
        // Выводим результаты
        s := "Оптимальное значение: " + Res.OptimalValue.ToString;
        Debug.WriteLine(s);
        s := "      ";
        For j := 1 To Vars.Count Do
            Vrbl := Vars.Item(j - 1);
            s := s + Vrbl.Id + "         ";
        End For;
        Debug.WriteLine(s);
        ci := CultureInfo.Current;
        For i := 1 To TimeInterval Do
            s := "t=" + i.ToString + ", ";
            For j := 1 To Vars.Count Do
                Vrbl := Vars.Item(j - 1);
                Val := Res.VarValues(Vrbl.Id)[i - 1];
                s := s + ci.FormatDoublePrec(Val, 6) + ", ";
            End For;
            Debug.WriteLine(s);
        End For;
    Else
        Debug.WriteLine(Res.ErrorMsg);
    End If;
End Sub UserProc;

После выполнения примера результаты расчета будут выведены в окно консоли:

Оптимальное значение: 1249.3495956170168
      x1         x2         u         v         
t=112,69000013,6000000,0000004,000000,
t=213,90700016,0745000,0000004,000000,
t=315,53210060,9322000,0000004,000000,
t=416,26708093,6843520,0000000,800000,

См. также:

ICpNonLinearOptimization