Ejemplo n.º 1
0
        public override RearrangedControlEquation GetRearrangedEquation(EquationArgument subject)
        {
            if (subject == null)
            {
                throw new ArgumentException("Subject cannot be equal to null");
            }

            if (subject == Uj)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qji = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Sqrt((Qij - 1 / (1 - X * B) * Qji + 1 / R * (-(X - B / 2 * (Math.Pow(X, 2) - Math.Pow(R, 2))) * Pij + (X - B / 2 * (Math.Pow(X, 2) + Math.Pow(R, 2))) * Pji)) * 2 * (1 - X * B) / B);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Pji, Qji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qji = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = 1 / (1 - X * B) * (Qji + Math.Pow(Uj, 2)) - 1 / R * (-(X - B / 2 * (Math.Pow(X, 2) - Math.Pow(R, 2))) * Pij + (X - B / 2 * (Math.Pow(X, 2) + Math.Pow(R, 2))) * Pji);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Uj, Pji, Qji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qij = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = (Qij - 1 / (1 - X * B) * Math.Pow(Uj, 2) * B / 2 + 1 / R * (-(X - B / 2 * (Math.Pow(X, 2) - Math.Pow(R, 2))) * Pij + (X - B / 2 * (Math.Pow(X, 2) + Math.Pow(R, 2))) * Pji)) * (1 - X * B);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Uj, Pji, Qij
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Qji = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qij = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = (Qij - 1 / (1 - X * B) * (Qji + Math.Pow(Uj, 2) * B / 2) + 1 / R * Pji * (X - B / 2 * (Math.Pow(X, 2) + Math.Pow(R, 2)))) / (1 / R * (X - B / 2 * (Math.Pow(X, 2) - Math.Pow(R, 2))));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Qji, Uj, Pji, Qij
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Qji = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Pij = equationArguments[2].Value;
                    var Qij = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = -(Qij - 1 / (1 - X * B) * (Qji + Math.Pow(Uj, 2) * B / 2) - 1 / R * Pij * (X - B / 2 * (Math.Pow(X, 2) - Math.Pow(R, 2)))) / (1 / R * (X - B / 2 * (Math.Pow(X, 2) + Math.Pow(R, 2))));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Qji, Uj, Pij, Qij
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            throw new ArgumentException("The argument that is supposed to be the subject wasn't found among ControlEquation arguments");
        }
        public override RearrangedControlEquation GetRearrangedEquation(EquationArgument subject)
        {
            if (subject == null)
            {
                throw new ArgumentException("Subject cannot be equal to null");
            }

            if (subject == Ui)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var D = Math.Pow((-Pij + Pji + 2 * Qij * B / 2), 2) - 4 * (Math.Pow(B, 2) / 4) * (Math.Pow(Pij, 2) + Math.Pow(Qij, 2));

                    if (D <= 0)
                    {
                        return(double.NaN);
                    }

                    var res = Math.Sqrt((-(-Pij + Pji + 2 * Qij * B / 2)) / (2 * Math.Pow(B, 2) / 4));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Pji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Ui  = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var D = Math.Pow(-Math.Pow(Ui, 2), 2) - 4 * 1 * (Pji * Math.Pow(Ui, 2) + Math.Pow(Qij, 2) + 2 * Qij * Math.Pow(Ui, 2) * B / 2 + Math.Pow(Ui, 4) * Math.Pow(B, 2) / 4);

                    if (D <= 0)
                    {
                        return(double.NaN);
                    }

                    var res = (-(-Math.Pow(Ui, 2)) - Math.Sqrt(D)) / 2;

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Ui, Qij, Pji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Ui  = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Pij = equationArguments[2].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Pij - (Math.Pow(Pij, 2) + Math.Pow(Qij, 2) + 2 * Qij * Math.Pow(Ui, 2) * B / 2 + Math.Pow(Ui, 4) * Math.Pow(B, 2) / 4) * R / Math.Pow(Ui, 2);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Ui, Qij, Pij
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Ui  = equationArguments[0].Value;
                    var Pij = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var D = Math.Pow((2 * Math.Pow(Ui, 2) * B / 2), 2) - 4 * 1 * ((-Pij + Pji) * Math.Pow(Ui, 2) + Math.Pow(Pij, 2) + Math.Pow(Ui, 4) * Math.Pow(B, 2) / 4);

                    if (D <= 0)
                    {
                        return(double.NaN);
                    }

                    var res = (-(2 * Math.Pow(Ui, 2) * B / 2) - Math.Sqrt(D)) / 2;

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Ui, Pij, Pji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            throw new ArgumentException("The argument that is supposed to be the subject wasn't found among ControlEquation arguments");
        }
Ejemplo n.º 3
0
        public override RearrangedControlEquation GetRearrangedEquation(EquationArgument subject)
        {
            if (subject == null)
            {
                throw new ArgumentException("Subject cannot be equal to null");
            }

            if (subject == Ui)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qji = equationArguments[3].Value;
                    var Uj  = equationArguments[4].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Sqrt((-Qij + Qji + Math.Pow(Uj, 2) * B / 2 + X * (Pij - Pji) / R) * 2 / B);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Pji, Qji, Uj
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Uj)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qji = equationArguments[3].Value;
                    var Ui  = equationArguments[4].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Sqrt((Qij - Qji + Math.Pow(Ui, 2) * B / 2 + X * (Pij - Pji) / R) * 2 / B);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Pji, Qji, Ui
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qji = equationArguments[3].Value;
                    var Ui  = equationArguments[4].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = -Math.Pow(Ui, 2) * B / 2 + Qji + Math.Pow(Uj, 2) * B / 2 + X * (Pij - Pji) / R;

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Uj, Pji, Qji, Ui
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Pji = equationArguments[2].Value;
                    var Qij = equationArguments[3].Value;
                    var Ui  = equationArguments[4].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Pow(Ui, 2) * B / 2 + Qij - Math.Pow(Uj, 2) * B / 2 - X * (Pij - Pji) / R;

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Uj, Pji, Qij, Ui
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;
                    var Qij = equationArguments[3].Value;
                    var Ui  = equationArguments[4].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Pij - R / X * (Qij + Math.Pow(Ui, 2) * B / 2 - Qji - Math.Pow(Uj, 2) * B / 2);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Uj, Qji, Qij, Ui
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pji = equationArguments[0].Value;
                    var Uj  = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;
                    var Qij = equationArguments[3].Value;
                    var Ui  = equationArguments[4].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Pji + R / X * (Qij + Math.Pow(Ui, 2) * B / 2 - Qji - Math.Pow(Uj, 2) * B / 2);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pji, Uj, Qji, Qij, Ui
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            throw new ArgumentException("The argument that is supposed to be the subject wasn't found among ControlEquation arguments");
        }
        public override RearrangedControlEquation GetRearrangedEquation(EquationArgument subject)
        {
            if (subject == null)
            {
                throw new ArgumentException("Subject cannot be equal to null");
            }

            if (subject == Ui)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Qij = equationArguments[0].Value;
                    var Qji = equationArguments[1].Value;
                    var Pij = equationArguments[2].Value;
                    var Pji = equationArguments[3].Value;

                    var X = equationConstants[0].Value;
                    var R = equationConstants[1].Value;

                    var qijPlusQji = Qij + Qji;
                    var pijPlusPji = Pij + Pji;

                    if (IsCloseToZero((qijPlusQji * X + pijPlusPji * R), NearZeroMarginPowerFlow))
                    {
                        return(double.NaN);
                    }

                    var res = Math.Sqrt(((Math.Pow(R, 2) + Math.Pow(X, 2)) * (Math.Pow(Pij, 2) + Math.Pow(Qij, 2)) / (qijPlusQji * X + pijPlusPji * R)));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Qij, Qji, Pij, Pji
                };
                var constants = new List <Constant>()
                {
                    X, R
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Ui  = equationArguments[0].Value;
                    var Pij = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;
                    var Pji = equationArguments[3].Value;

                    var X = equationConstants[0].Value;
                    var R = equationConstants[1].Value;

                    var pijPlusPji = Pij + Pji;

                    if (IsCloseToZero(Ui, NearZeroMarginVoltage))
                    {
                        return(double.NaN);
                    }

                    var D = 1 - 4 * R * (Math.Pow(R, 2) + Math.Pow(X, 2)) / (Math.Pow(Ui, 2) * Math.Pow(X, 2)) * (Math.Pow(Pij, 2) * (Math.Pow(R, 2) + Math.Pow(X, 2)) / (Math.Pow(Ui, 2) * Math.Pow(X, 2)) - (pijPlusPji / X) * R - Qji);

                    if (D <= 0)
                    {
                        return(double.NaN);        // D should be bigger that a=1
                    }
                    var result = (-1 - Math.Sqrt(D)) / (2 * (Math.Pow(R, 2) + Math.Pow(X, 2)) / (Math.Pow(Ui, 2) * Math.Pow(X, 2)));

                    return(result);
                }

                var arguments = new List <EquationArgument>()
                {
                    Ui, Pij, Qji, Pji
                };
                var constants = new List <Constant>()
                {
                    X, R
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Ui  = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Pij = equationArguments[2].Value;
                    var Pji = equationArguments[3].Value;

                    var X = equationConstants[0].Value;
                    var R = equationConstants[1].Value;

                    var pijPlusPji = Pij + Pji;

                    if (IsCloseToZero(Ui, NearZeroMarginVoltage))
                    {
                        return(double.NaN);
                    }

                    var res = -Qij - pijPlusPji * R / X + (Math.Pow(R, 2) + Math.Pow(X, 2)) * ((Math.Pow(Pij, 2) + Math.Pow(Qij, 2)) / Math.Pow(Ui, 2) * X);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Ui, Qij, Pij, Pji
                };
                var constants = new List <Constant>()
                {
                    X, R
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Qij = equationArguments[0].Value;
                    var Ui  = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;

                    var X = equationConstants[0].Value;

                    var qijPlusQji = Qij + Qji;

                    var res = Math.Sqrt(qijPlusQji * Math.Pow(Ui, 2) / X - Math.Pow(Qij, 2));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Ui, Qji
                };
                var constants = new List <Constant>()
                {
                    X
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            throw new ArgumentException("The argument that is supposed to be the subject wasn't found among ControlEquation arguments");
        }
        public override RearrangedControlEquation GetRearrangedEquation(EquationArgument subject)
        {
            if (subject == null)
            {
                throw new ArgumentException("Subject cannot be equal to null");
            }

            if (subject == Ui)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Uj  = equationArguments[2].Value;
                    var Pji = equationArguments[3].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Sqrt((-Qij - (-(Math.Pow(X, 2) + Math.Pow(R, 2)) * Pij + (Math.Pow(X, 2) + Math.Pow(R, 2)) * Pji) / (2 * R * X) - Math.Pow(Uj, 2) / (2 * X)) / (B / 2 - 1 / (2 * X)));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Uj, Pji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Uj)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Ui  = equationArguments[2].Value;
                    var Pji = equationArguments[3].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Sqrt((Qij + Math.Pow(Ui, 2) * B / 2 + (-(Math.Pow(X, 2) + Math.Pow(R, 2)) * Pij + (Math.Pow(X, 2) + Math.Pow(R, 2)) * Pji) / (2 * R * X) - Math.Pow(Ui, 2) / (2 * X)) * 2 * X);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Ui, Pji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Uj  = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Ui  = equationArguments[2].Value;
                    var Pji = equationArguments[3].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = (Qij + Math.Pow(Ui, 2) * B / 2 + ((Math.Pow(X, 2) + Math.Pow(R, 2)) * Pji) / (2 * R * X) - (Math.Pow(Ui, 2) - Math.Pow(Uj, 2)) / (2 * X)) * 2 * R * X / (Math.Pow(X, 2) + Math.Pow(R, 2));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Uj, Qij, Ui, Pji
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Uj  = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Ui  = equationArguments[2].Value;
                    var Pij = equationArguments[3].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = -(Qij + Math.Pow(Ui, 2) * B / 2 + (-(Math.Pow(X, 2) + Math.Pow(R, 2)) * Pij) / (2 * R * X) - (Math.Pow(Ui, 2) - Math.Pow(Uj, 2)) / (2 * X)) * 2 * R * X / (Math.Pow(X, 2) + Math.Pow(R, 2));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Uj, Qij, Ui, Pij
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Uj  = equationArguments[0].Value;
                    var Pji = equationArguments[1].Value;
                    var Ui  = equationArguments[2].Value;
                    var Pij = equationArguments[3].Value;


                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = -(Math.Pow(Ui, 2) * B / 2 + (-(Math.Pow(X, 2) + Math.Pow(R, 2)) * Pij + (Math.Pow(X, 2) + Math.Pow(R, 2)) * Pji) / (2 * R * X) - (Math.Pow(Ui, 2) - Math.Pow(Uj, 2)) / (2 * X));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Uj, Pji, Ui, Pij
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            throw new ArgumentException("The argument that is supposed to be the subject wasn't found among ControlEquation arguments");
        }
        public override RearrangedControlEquation GetRearrangedEquation(EquationArgument subject)
        {
            if (subject == null)
            {
                throw new ArgumentException("Subject cannot be equal to null");
            }

            if (subject == Ui)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;
                    var Uj  = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var D = Math.Pow((Qij - Qji - Math.Pow(Uj, 2) * B / 2 - 2 * Qij * X * B / 2), 2) - 4 * (B / 2 - Math.Pow(B, 2) * X / 4) * (-Math.Pow(Pij, 2) * X - Math.Pow(Qij, 2) * X);

                    if (D <= 0)
                    {
                        return(double.NaN);
                    }

                    var res = Math.Sqrt(((-(Qij - Qji - Math.Pow(Uj, 2) * B / 2 - 2 * Qij * X * B / 2)) - Math.Sqrt(D)) / (2 * (B / 2 - Math.Pow(B, 2) * X / 4)));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Qji, Uj
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Uj)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;
                    var Ui  = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Sqrt((Math.Pow(Ui, 2) * Qij + Math.Pow(Ui, 4) * B / 2 - Qji * Math.Pow(Ui, 2) - Math.Pow(Pij, 2) * X - Math.Pow(Qij, 2) * X - 2 * Qij * X * Math.Pow(Ui, 2) * B / 2 - Math.Pow(Ui, 4) * Math.Pow(B, 2) * X / 4) / (Math.Pow(Ui, 2) * B / 2));

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Qij, Qji, Ui
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Pij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Uj  = equationArguments[0].Value;
                    var Qij = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;
                    var Ui  = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = Math.Sqrt((Math.Pow(Ui, 2) * Qij + Math.Pow(Ui, 4) * B / 2 - Qji * Math.Pow(Ui, 2) - Math.Pow(Ui, 2) * Math.Pow(Uj, 2) * B / 2 - Math.Pow(Qij, 2) * X - 2 * Qij * X * Math.Pow(Ui, 2) * B / 2 - Math.Pow(Ui, 4) * Math.Pow(B, 2) * X / 4) / X);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Uj, Qij, Qji, Ui
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qij)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Ui  = equationArguments[1].Value;
                    var Qji = equationArguments[2].Value;
                    var Uj  = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var D = Math.Pow((Math.Pow(Ui, 2) - 2 * X * Math.Pow(Ui, 2) * B / 2), 2) - 4 * (-X) * (Math.Pow(Ui, 4) * B / 2 - Qji * Math.Pow(Ui, 2) - Math.Pow(Ui, 2) * Math.Pow(Uj, 2) * B / 2 - Math.Pow(Pij, 2) * X - Math.Pow(Ui, 4) * Math.Pow(B, 2) * X / 4);

                    if (D <= 0)
                    {
                        return(double.NaN);
                    }

                    var res = (-(Math.Pow(Ui, 2) - 2 * X * Math.Pow(Ui, 2) * B / 2) - Math.Sqrt(D)) / (-2 * X);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Ui, Qji, Uj
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            if (subject == Qji)
            {
                double calcSubjectValue(List <EquationArgument> equationArguments, List <Constant> equationConstants)
                {
                    var Pij = equationArguments[0].Value;
                    var Ui  = equationArguments[1].Value;
                    var Qij = equationArguments[2].Value;
                    var Uj  = equationArguments[3].Value;

                    var R = equationConstants[0].Value;
                    var X = equationConstants[1].Value;
                    var B = equationConstants[2].Value;

                    var res = (Math.Pow(Ui, 2) * Qij + Math.Pow(Ui, 4) * B / 2 - Math.Pow(Ui, 2) * Math.Pow(Uj, 2) * B / 2 - Math.Pow(Pij, 2) * X - Math.Pow(Qij, 2) * X - 2 * Qij * X * Math.Pow(Ui, 2) * B / 2 - Math.Pow(Ui, 4) * Math.Pow(B, 2) * X / 4) / Math.Pow(Ui, 2);

                    return(res);
                }

                var arguments = new List <EquationArgument>()
                {
                    Pij, Ui, Qij, Uj
                };
                var constants = new List <Constant>()
                {
                    R, X, B
                };
                return(new RearrangedControlEquation(subject, arguments, constants, calcSubjectValue, this));
            }

            throw new ArgumentException("The argument that is supposed to be the subject wasn't found among ControlEquation arguments");
        }