Beispiel #1
0
        /// <summary>
        /// Check whether given substrate feed Q qualifies for the manure bonus
        ///
        /// Güllebonus wird ab jetzt immer während simulation geprüft, wird von manurebonus_sensor
        /// aufgezeichnet. eine überprüfung vor einer simulation wäre auch möglich, sollte aber
        /// nicht mehr durch geführt werden. zumindest sollte ein negatives ergebnis für den
        /// güllebonus nicht daran hindern eine simulaion durchzuführen.
        /// wenn sich substratzufuhr über prädiktionshorizont verändert, müsste aktuell diese
        /// methode für jeden neuen substratmix einzeln aufgerufen werden. d.h. Q enthält immer nur
        /// ein element je substrat und nicht mehrere elemente zu verschiedenen zeitpunkten
        /// </summary>
        /// <param name="mySubstrates"></param>
        /// <param name="Q">substrate feed on plant in m³/d</param>
        /// <param name="A">linear constraint vector of A * Q &lt;= b</param>
        /// <param name="b">right side of cosntraint</param>
        /// <param name="dist_bonus">distance of given feed Q to bonus, must be negative such that
        /// bonus is satisfied</param>
        /// <returns></returns>
        public static bool check_manurebonus(biogas.substrates mySubstrates, double[] Q,
                                             out double[] A, out double b, out double dist_bonus)
        {
            //
            // linear inequality constraints for the substrate flow
            // Gülle Bonus
            //
            // Erklärung zum Gülle Bonus:
            //
            // Für Strom aus Biogasanlagen kann nach den Vorschriften des "EEG
            // 2009" ein erhöhter NaWaRo Bonus gewährt werden, wenn der Anlage ein
            // Mindestanteil an Gülle zugeführt wird. Gemäß Anlage 2, Ziffer VI
            // des EEG 2009 besteht der Anspruch nur dann, wenn der Anteil von
            // Gülle (dazu zählt auch Festmist) JEDERZEIT (stimmt das WIRKLICH???) mindestens 30
            // Masseprozent beträgt.
            //
            // Quelle:
            //
            // http://www.dlr.rlp.de/internet/global/themen.nsf/ALL/26C1BE11D99FE329C12575270048A024?OpenDocument
            //
            //
            // Summe über Gülle [kg/d] >= 0,3 * ( Summe aller Substrate [kg/d] )
            //
            // -0.7 * ( Summe über Gülle [kg/d] ) + 0.3 ( Summe restlicher
            // Substrate [kg/d] ) <= 0
            //
            // -0.7 * ( Summe über Gülle [m³/d] * rho_gülle [kg/m³] ) + 0.3 (
            // Summe restlicher Substrate [m³/d] * rho_substrat [kg/m³] ) <= 0
            //
            // In der Form Ax <= b
            //
            // b= 0;
            //
            // A= -0.7 * rho_gülle für alle Gülleformen und 0.3 * rho_substrat für
            // den Rest, hier ein liegender Vektor
            //

            int n_substrates = mySubstrates.getNumSubstrates();

            // substrate_ineq= [A, b]
            double[] substrate_ineq = new double[n_substrates + 1];

            //

            for (int isubstrate = 0; isubstrate < n_substrates; isubstrate++)
            {
                substrate mySubstrate = mySubstrates.get(isubstrate + 1);

                double rho = mySubstrate.get_param_of("rho"); // get density of substrate in kg/m^3

                if (mySubstrate.ismanure)
                {
                    substrate_ineq[isubstrate] = -0.7 * rho;
                }
                else
                {
                    substrate_ineq[isubstrate] = 0.3 * rho;
                }
            }

            //

            bool is_manure_bonus = false;

            // linear constraint: A * Q <= b      A * Q - b <= 0
            A = math.getrows(substrate_ineq, 0, n_substrates - 1);
            b = substrate_ineq[n_substrates];

            // MATLAB syntax: if (substrate_ineq(1:end-1) * Q <= substrate_ineq(end))
            // this is the distance of the given feed Q to the manure bonus hyperplane
            dist_bonus = math.mtimes(A, Q) - b;

            // MATLAB syntax: if (substrate_ineq(1:end-1) * Q <= substrate_ineq(end))
            if (dist_bonus <= 0)
            {
                is_manure_bonus = true;
            }
            else
            {
                is_manure_bonus = false;
            }

            //

            return(is_manure_bonus);
        }