示例#1
0
        public string Solve()
        {
            Compiler compiler = new Compiler();

            if (frequencies.Count == 0)
            {
                frequencies.Add(0.0);
            }
            for (int i = 0; i < elements.Count; i++)
            {
                (elements[i] as Element).SetIndex(i);
            }
            string equations = GenerateEquations();
            List <IScopeElement> scopeElements = new List <IScopeElement>();

            foreach (var element in elements)
            {
                if (element is IScopeElement)
                {
                    scopeElements.Add(element as IScopeElement);
                }
            }
            SteadyStateSolution solution = new SteadyStateSolution(frequencies.Count, scopeElements.Count);
            int frequencyIndex           = 0;

            foreach (var frequency in frequencies)
            {
                string system = equations;
                system += "//Parameters" + Environment.NewLine;
                system += GenerateParameters(frequency);
                //parse equations
                NonlinearEquationDescription    compiledEquation = compiler.CompileEquations(system);
                NonlinearSystemSymbolicAnalytic nonlinearSystem  = new NonlinearSystemSymbolicAnalytic(compiledEquation);
                //solve
                Vector <double>         values         = solver.Solve(nonlinearSystem, Vector <double> .Build.DenseOfArray(compiledEquation.InitialValues));
                NonlinearSystemSolution systemSolution = compiledEquation.GetSolution(values);
                //save results
                int index = 0;
                foreach (var scope in scopeElements)
                {
                    solution.Set(scope.GetReading(systemSolution), index, frequencyIndex);
                    index++;
                }
                frequencyIndex++;
            }
            return(solution.ToString(scopeElements, frequencies.ToArray()));
        }
示例#2
0
        public string TestEquationGeneration(bool useCompiledEquation = false)
        {
            string result = "";

            foreach (float frequency in frequencies)
            {
                float  hz        = (float)(frequency);
                string equations = acGraph.EquationGeneration(frequency);
                result += equations + Environment.NewLine;
                if (useCompiledEquation)
                {
                    Compiler compiler = new Compiler();
                    NonlinearEquationDescription compiledEquation = compiler.CompileEquations(equations);
                    result += compiledEquation.PrintVariables() + Environment.NewLine;
                    result += compiledEquation.PrintEquations() + Environment.NewLine;
                    result += compiledEquation.PrintJacobiMatrix() + Environment.NewLine;
                }
                result += Environment.NewLine;
            }
            return(result);
        }
        static public void TestNonlinearEquationSolver()
        {
            Stream       StdoutStream = Console.OpenStandardOutput();
            StreamWriter Stdout       = new StreamWriter(StdoutStream);

            Stdout.WriteLine("\tTest nonlinear equation solver");
            Equations.Nonlinear.Compiler compiler = new Equations.Nonlinear.Compiler();
            string equation1 = @"constant a = 2;x*x+a=e()^x*sin(x);x(0)=0;";
            string equation2 = @"x*x+2=e()^x*sin(x);x(0)=2;";
            string equation3 = @"x*x+2=e()^x*sin(x);x(0)=5;";
            string equation4 = @"6*x^5+-3*x^4+7*x^3+2*x^2+-5*x+7.13=0.;x(0)=-0.8;";

            try
            {
                {
                    NonlinearEquationDescription compiledEquation    = compiler.CompileEquations(equation1);
                    MathUtils.NonlinearSystemSymbolicAnalytic system = new MathUtils.NonlinearSystemSymbolicAnalytic(compiledEquation);
                    //calc solution
                    Vector <double> solution = MathUtils.NewtonRaphsonSolver.Solve(
                        system,
                        Vector <double> .Build.DenseOfArray(compiledEquation.InitialValues),
                        20,
                        0.01,
                        1.0
                        );
                    Stdout.WriteLine("Equation:" + equation1);
                    Stdout.WriteLine("Solution:");
                    Stdout.WriteLine(PrintSolution(solution, compiledEquation.VariableNames, compiledEquation));
                }
                {
                    NonlinearEquationDescription compiledEquation    = compiler.CompileEquations(equation2);
                    MathUtils.NonlinearSystemSymbolicAnalytic system = new MathUtils.NonlinearSystemSymbolicAnalytic(compiledEquation);
                    //calc solution
                    Vector <double> solution = MathUtils.NewtonRaphsonSolver.Solve(
                        system,
                        Vector <double> .Build.DenseOfArray(compiledEquation.InitialValues),
                        20,
                        0.01,
                        1.0
                        );
                    Stdout.WriteLine("Equation:" + equation2);
                    Stdout.WriteLine("Solution:");
                    Stdout.WriteLine(PrintSolution(solution, compiledEquation.VariableNames, compiledEquation));
                }
                {
                    NonlinearEquationDescription compiledEquation    = compiler.CompileEquations(equation3);
                    MathUtils.NonlinearSystemSymbolicAnalytic system = new MathUtils.NonlinearSystemSymbolicAnalytic(compiledEquation);
                    //calc solution
                    Vector <double> solution = MathUtils.NewtonRaphsonSolver.Solve(
                        system,
                        Vector <double> .Build.DenseOfArray(compiledEquation.InitialValues),
                        20,
                        0.01,
                        1.0
                        );
                    Stdout.WriteLine("Equation:" + equation3);
                    Stdout.WriteLine("Solution:");
                    Stdout.WriteLine(PrintSolution(solution, compiledEquation.VariableNames, compiledEquation));
                }
                {
                    NonlinearEquationDescription compiledEquation    = compiler.CompileEquations(equation4);
                    MathUtils.NonlinearSystemSymbolicAnalytic system = new MathUtils.NonlinearSystemSymbolicAnalytic(compiledEquation);
                    //calc solution
                    Vector <double> solution = MathUtils.NewtonRaphsonSolver.Solve(
                        system,
                        Vector <double> .Build.DenseOfArray(compiledEquation.InitialValues),
                        20,
                        0.01,
                        1.0
                        );
                    Stdout.WriteLine("Equation:" + equation4);
                    Stdout.WriteLine("Solution (-0.96):");
                    Stdout.WriteLine(PrintSolution(solution, compiledEquation.VariableNames, compiledEquation));
                }
            }
            catch (CompilerException exc)
            {
                Stdout.WriteLine(exc.Message);
                var errors = exc.Errors;
                foreach (var error in errors)
                {
                    Stdout.WriteLine(error.Message + " Line: " + error.Line + " Position: " + error.Position);
                }
            }
            catch (Exception exc)
            {
                Stdout.WriteLine(exc.Message);
            }
            Stdout.Flush();
            Stdout.Close();
        }
        static public string PrintSolution(Vector <double> solution, string[] variables, NonlinearEquationDescription system)
        {
            string result = "";

            for (int i = 0; i < solution.Count; i++)
            {
                result += variables[i] + " = " + solution[i].ToString() + Environment.NewLine;
            }
            double[] x = solution.ToArray();
            for (int i = 0; i < system.Equations.Count; i++)
            {
                result += $"F{i}(X) = {system.Equations[i].Execute(x)}" + Environment.NewLine;
            }
            return(result);
        }
        static public void TestNonlinearEquationParser()
        {
            //create file

            /*
             * x*x+2=e^x*sin(x);
             * x(0)=0;
             * x(0)=2;
             * solution at approx 1.4 and 2.33
             *
             * 6x^5+-3x^4+7x^3+2x^2+-5x+7.13=0.
             * 1 root at -0.963
             */
            string equation1 = @"constant a = 2;x*x+a=e()^x*sin(x);x(0)=0;";
            string equation2 = @"x*x+2=e()^x*sin(x);x(0)=2;";
            string equation3 = @"x*x+2=e()^x*sin(x);x(0)=5;";
            string equation4 = @"6*x^5+-3*x^4+7*x^3+2*x^2+-5*x+7.13=0.;x(0)=0;";

            Stream       StdoutStream = Console.OpenStandardOutput();
            StreamWriter Stdout       = new StreamWriter(StdoutStream);

            Stdout.WriteLine("\tTest nonlinear equation parser");
            try
            {
                Equations.Nonlinear.Compiler compiler         = new Equations.Nonlinear.Compiler();
                NonlinearEquationDescription compiledEquation = compiler.CompileEquations(equation1);
                Stdout.WriteLine("Equation 1: x=0");
                Stdout.WriteLine("x*x+2-e^x*sin(x)");
                Stdout.WriteLine("Derivative: 2x-e^x*sin(x)-e^x*cos(x)");
                Stdout.WriteLine(compiledEquation.PrintVariables());
                Stdout.WriteLine(compiledEquation.PrintEquations());
                Stdout.WriteLine(compiledEquation.PrintJacobiMatrix());
                compiledEquation = compiler.CompileEquations(equation2);
                Stdout.WriteLine("Equation 2 x=2");
                Stdout.WriteLine(compiledEquation.PrintVariables());
                Stdout.WriteLine(compiledEquation.PrintEquations());
                Stdout.WriteLine(compiledEquation.PrintJacobiMatrix());
                compiledEquation = compiler.CompileEquations(equation3);
                Stdout.WriteLine("Equation 3 x=5");
                Stdout.WriteLine(compiledEquation.PrintVariables());
                Stdout.WriteLine(compiledEquation.PrintEquations());
                Stdout.WriteLine(compiledEquation.PrintJacobiMatrix());
                compiledEquation = compiler.CompileEquations(equation4);
                Stdout.WriteLine("Equation 4 x=0");
                Stdout.WriteLine(compiledEquation.PrintVariables());
                Stdout.WriteLine(compiledEquation.PrintEquations());
                Stdout.WriteLine(compiledEquation.PrintJacobiMatrix());
            }
            catch (CompilerException exc)
            {
                Stdout.WriteLine(exc.Message);
                var errors = exc.Errors;
                foreach (var error in errors)
                {
                    Stdout.WriteLine(error.Message + " Line: " + error.Line + " Position: " + error.Position);
                }
            }
            catch (Exception exc)
            {
                Stdout.WriteLine(exc.Message);
            }
            Stdout.Flush();
            Stdout.Close();
        }
 public NonlinearSystemSymbolicNumerical(NonlinearEquationDescription system)
 {
     this.equations = system.Equations;
     this.Size      = this.equations.Count;
 }
 public NonlinearSystemSymbolicAnalytic(NonlinearEquationDescription system)
 {
     this.equations   = system.Equations;
     this.derivatives = system.JacobiMatrix;
     this.Size        = this.equations.Count;
 }
        public ACGraphSolution SolveEquationsAC(float frequency)
        {
            string equations = EquationGeneration(frequency);
            //create solver
            Compiler compiler = new Compiler();
            NonlinearEquationDescription compiledEquation = compiler.CompileEquations(equations);

            MathUtils.NonlinearSystemSymbolicAnalytic system = new MathUtils.NonlinearSystemSymbolicAnalytic(compiledEquation);
            //calc solution
            Vector <double> values = MathUtils.NewtonRaphsonSolver.Solve(
                system,
                Vector <double> .Build.DenseOfArray(compiledEquation.InitialValues),
                25,
                0.005,
                1.0
                );
            NonlinearSystemSolution solution = compiledEquation.GetSolution(values);

            ACGraphSolution acSolution = new ACGraphSolution();

            acSolution.frequency = frequency;

            for (int i = 0; i < nodesList.Count; i++)
            {
                var real = $"v_{i}_re";
                var im   = $"v_{i}_im";
                acSolution.voltages.Add(new Complex32((float)solution.GetValue(real),
                                                      (float)solution.GetValue(im)));
            }
            foreach (var element in elements)
            {
                acSolution.currents.Add(element.GetCurrent(solution, frequency));
                acSolution.voltageDrops.Add(element.GetVoltageDrop(solution));
            }
            return(acSolution);

            /*for (int i = 0; i < elements.Count; i++)
             * {
             *  ElementsAC.Element element = elements[i];
             *  switch (element.ElementType)
             *  {
             *      case ElementsAC.ElementTypeEnum.Capacitor:
             *          {
             *              Complex32 voltageDrop = solution.voltages[element.nodes[1]] - solution.voltages[element.nodes[0]];
             *              Complex32 current = voltageDrop * new Complex32(0.0f, frequency * ((ElementsAC.Capacitor)element).capacity);
             *              solution.currents.Add(current);
             *              break;
             *          }
             *      case ElementsAC.ElementTypeEnum.Resistor:
             *          {
             *              Complex32 voltageDrop = solution.voltages[element.nodes[1]] - solution.voltages[element.nodes[0]];
             *              solution.currents.Add(voltageDrop / ((ElementsAC.Resistor)element).resistance);
             *              break;
             *          }
             *      case ElementsAC.ElementTypeEnum.CurrentSource:
             *          ElementsAC.CurrentSource csel = (ElementsAC.CurrentSource)element;
             *          solution.currents.Add(Complex32.FromPolarCoordinates(csel.current, csel.phase));
             *          break;
             *      case ElementsAC.ElementTypeEnum.Transformer2w:
             *          solution.currents.Add(0.0f);
             *          break;
             *      case ElementsAC.ElementTypeEnum.Inductor:
             *      case ElementsAC.ElementTypeEnum.Ground:
             *      case ElementsAC.ElementTypeEnum.Line:
             *      case ElementsAC.ElementTypeEnum.VoltageSource:
             *          solution.currents.Add(0.0f);//Пропуск значений, поскольку данные токи присутствуют в векторе решения
             *          break;
             *  }
             * }*/
        }