コード例 #1
0
ファイル: SHSystem.cs プロジェクト: thisiscam/formula
        /// <summary>
        /// Obtain the Taylor Model for the non-linear ODE after substituting the controller response at the current state.
        /// </summary>
        private TaylorModelVec GetODEExpanded(State current)
        {
            // extract current values
            Dictionary <string, DoubleInterval> x0 = current.ToDictionary();

            x0.Add("time", new DoubleInterval(current.step * period));

            // add controlled variables
            var controlled = Hold(current);

            foreach (var kvp in controlled)
            {
                x0.Add(kvp.Key, kvp.Value);
            }

            // update ODEs with the controlled variables
            TaylorModel[] taylorModels = new TaylorModel[ode.Count];
            for (int i = 0; i < expandedOde.Count; ++i)
            {
                // calculate ODE
                Polynomial p = TaylorExpansion.Expansion(expandedOde[i], tmVarNamesWithout0, x0, order);
                // Should calculate the error bounds...
                taylorModels[i] = new TaylorModel(p, new DoubleInterval(0));

                Console.Write("Polynomial: {0} ->", ode[i]);
                p.Dump(tmVarNames, true);
            }

            return(new TaylorModelVec(taylorModels));
        }
コード例 #2
0
ファイル: SHSystem.cs プロジェクト: thisiscam/formula
        /// <summary>
        /// Obtain the Taylor Model for the non-linear ODE after substituting the controller response at the current state.
        /// </summary>
        private TaylorModelVec GetODE(State current)
        {
            var controlled = Hold(current);

            string[] varNames = new string[current.continuousNames.Length + 1];
            varNames[0] = "time";
            current.continuousNames.CopyTo(varNames, 1);

            // update ODEs with the controlled variables
            TaylorModel[] taylorModels = new TaylorModel[ode.Count];
            for (int i = 0; i < ode.Count; ++i)
            {
                var odeC = ode[i];
                foreach (var kvp in controlled)
                {
                    //Log.WriteLine("Controlled {0} = {1}", kvp.Key, kvp.Value);
                    odeC = odeC.Substitute(kvp.Key, new REAL(kvp.Value));
                }

                // calculate ODE
                Polynomial p = TaylorExpansion.ConvertPolynomial(odeC, current.continuousNames);
                taylorModels[i] = new TaylorModel(p, new DoubleInterval(0));
            }

            return(new TaylorModelVec(taylorModels));
        }
コード例 #3
0
ファイル: SHSystem.cs プロジェクト: thisiscam/formula
        public void Initialize(string[] continuousNames, DoubleInterval[] continuousInitialState, string[] discreteNames, FPIntegerInterval[] discreteInitialState, int order, double period)
        {
            this.initialState = new State(0, continuousNames, new DoubleBoundingBox(continuousInitialState), discreteNames, new FPIntegerBoundingBox(discreteInitialState));

            this.period            = period;
            this.order             = order;
            this.discreteVariables = this.initialState.discreteNames;

            IsPolynomial = true;
            ContainsSqrt = false;
            for (int i = 0; i < ode.Count; ++i)
            {
                if (!ode[i].IsPolynomial())
                {
                    IsPolynomial = false;
                }
                if (ode[i].ContainsSqrt())
                {
                    ContainsSqrt = true;
                }
            }

            // since flow* doesn't handle sqrt, do taylor expansion
            if (ContainsSqrt)
            {
                string[] varNames = new string[continuousNames.Length + 1];
                varNames[0] = "time";
                continuousNames.CopyTo(varNames, 1);
                expandedOde = new List <List <TaylorExpansion.TaylorStructure> >();
                for (int i = 0; i < ode.Count; ++i)
                {
                    var e = TaylorExpansion.GetExpansionStruct(ode[i], varNames, order);
                    expandedOde.Add(e.Item1);
                }
            }

            foreach (string s in continuousNames)
            {
                Flowstar.DeclareStateVariable(s);
            }
            Flowstar.SetCutoff(cutoffThreshold);

            estimate = new double[initialState.continuousNames.Length];
            for (int i = 0; i < estimate.Length; ++i)
            {
                estimate[i] = errorEstimate;
            }

            localVarNames = new string[continuousNames.Length];
            continuousNames.CopyTo(localVarNames, 0);
            stateVarNames = new string[continuousNames.Length];
            for (int i = 0; i < continuousNames.Length; ++i)
            {
                stateVarNames[i] = continuousNames[i] + "'";
            }
            tmVarNames    = new string[continuousNames.Length + 1];
            tmVarNames[0] = "local_t";
            for (int i = 0; i < continuousNames.Length; ++i)
            {
                tmVarNames[i + 1] = continuousNames[i] + "0";
            }
            tmVarNamesWithout0    = new string[continuousNames.Length + 1];
            tmVarNamesWithout0[0] = "time";
            continuousNames.CopyTo(tmVarNamesWithout0, 1);
        }