/// <summary>
        /// This function will be calculate one reduced transfer function from two tfs, which are connected in parallel
        /// This function can not modify the lists of blocks!
        /// </summary>
        /// <param name="tf1"></param>
        /// <param name="tf2"></param>
        /// <param name="sign"></param>
        /// <param name="newtf"></param>
        public static tfBlock parallel(tfBlock tf1, tfBlock tf2, SIGN sign1, SIGN sign2)
        {
            tfBlock newtf;

            newtf.name   = "";
            newtf.input  = "";
            newtf.output = "";

            newtf.num = MathExtended.PolySum(MathExtended.convolution(tf1.num, tf2.den), MathExtended.convolution(tf2.num, tf1.den), sign1, sign2);
            newtf.den = MathExtended.convolution(tf1.den, tf2.den);
            return(newtf);
        }
        /// <summary>
        /// This function will be reduce a parallel connection.
        /// </summary>
        /// <param name="node"></param>
        /// <param name="tf1"></param>
        /// <param name="tf2"></param>
        /// <param name="sum"></param>
        public static void parallel(tfBlock tf1, tfBlock tf2, nodeBlock node, sumBlock sum)
        {
            tfBlock newtf = new tfBlock();

            newtf.num    = MathExtended.PolySum(MathExtended.convolution(tf1.num, tf2.den), MathExtended.convolution(tf2.num, tf1.den), sum.sign1, sum.sign2);
            newtf.den    = MathExtended.convolution(tf1.den, tf2.den);
            newtf.name   = blockmanager.NameCounter("parallel", Blocktypes.tf);
            newtf.input  = blockmanager.InputChange(node.input, newtf.name, node.name);
            newtf.output = blockmanager.OutputChange(sum.output, newtf.name, sum.name);
            blockmanager.Change_Tf(tf1, newtf);
            blockmanager.RemoveBlockFromList(tf2.name, Blocktypes.tf);
            blockmanager.RemoveBlockFromList(node.name, Blocktypes.node);
            blockmanager.RemoveBlockFromList(sum.name, Blocktypes.sum);

            Console.WriteLine("\tSimplified a parallel connection: ({0})", newtf.name);
            ConsistencyResult result;

            result = Check.consistency();
            if (!result.success)
            {
                Check.ReadConsistencyResult(result);
            }
        }
        /// <summary>
        /// This function will be reduce a series connection.
        /// </summary>
        /// <param name="tf1"></param>
        /// <param name="tf2"></param>

        public static tfBlock series(tfBlock tf1, tfBlock tf2, params bool[] virtual_switcher)
        {
            tfBlock newtf;

            if ((virtual_switcher.Length > 0) && (virtual_switcher[0] == true))
            {
                newtf.num = MathExtended.convolution(tf1.num, tf2.num);
                newtf.den = MathExtended.convolution(tf1.den, tf2.den);

                newtf.name   = "";
                newtf.input  = "";
                newtf.output = "";
            }
            else
            {
                newtf.num = MathExtended.convolution(tf1.num, tf2.num);
                newtf.den = MathExtended.convolution(tf1.den, tf2.den);

                newtf.name   = blockmanager.NameCounter("series", Blocktypes.tf);
                newtf.input  = blockmanager.InputChange(tf1.input, newtf.name, tf1.name);
                newtf.output = blockmanager.OutputChange(tf2.output, newtf.name, tf2.name);
                blockmanager.Change_Tf(tf1, newtf);
                blockmanager.RemoveBlockFromList(tf2.name, Blocktypes.tf);

                Console.WriteLine("\tSimplified a series connection: ({0})", newtf.name);
                blockmanager.SystemStat();
                ConsistencyResult result;
                result = Check.consistency();
                if (!result.success)
                {
                    Check.ReadConsistencyResult(result);
                    Console.ReadKey();
                }
            }
            return(newtf);
        }