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;
             *  }
             * }*/
        }
        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();
        }
Example #3
0
        internal void RunNonlinearEquationsTest(MainWindow window)
        {
            FileTabItem tab = null;

            window.Dispatcher.Invoke(() =>
            {
                tab = window.FileTab.SelectedItem as FileTabItem;
            });
            if (tab == null)
            {
                return;
            }
            List <ErrorMessage> errorList = new List <ErrorMessage>();

            window.Dispatcher.Invoke(() =>
            {
                window.FileTab.Focus();
                window.StatusText = "Расчёт";
            });
            //Thread.Sleep(4000); //Test of UI
            List <string> outputList = new List <string>();

            try
            {
                string text = "";
                window.Dispatcher.Invoke(() => { text = tab.Document.Text; });
                Equations.Nonlinear.Compiler compiler = new Equations.Nonlinear.Compiler();
                Equations.Nonlinear.NonlinearEquationDescription compiledEquation = compiler.CompileEquations(text);
                MathUtils.NonlinearSystemSymbolicAnalytic        system           = new MathUtils.NonlinearSystemSymbolicAnalytic(compiledEquation);
                //calc solution
                MathNet.Numerics.LinearAlgebra.Vector <double> solution = MathUtils.NewtonRaphsonSolver.Solve(
                    system,
                    MathNet.Numerics.LinearAlgebra.Vector <double> .Build.DenseOfArray(compiledEquation.InitialValues),
                    20,
                    0.01,
                    1.0
                    );
                outputList.Add("Упрощённое представление");
                outputList.Add(compiledEquation.PrintEquations());
                outputList.Add("Решение");
                FormOutput(solution, compiledEquation, ref outputList);
            }
            catch (Equations.CompilerException exc)
            {
                outputList.Add(exc.Message);
                var errors = exc.Errors;
                foreach (var error in errors)
                {
                    errorList.Add(error);
                }
            }
            catch (Exception exc)
            {
                window.Dispatcher.Invoke(() =>
                {
                    window.OutputText += exc.Message;
                    window.OutputText += "\n";
                    window.OutputText += exc.StackTrace;
                });
                return;
            }
            try
            {
                window.Dispatcher.Invoke(() =>
                {
                    foreach (ErrorMessage error in errorList)
                    {
                        window.errors.Add(error);
                    }
                    foreach (var output in outputList)
                    {
                        window.OutputText += output;
                        window.OutputText += "\n";
                    }
                    window.StatusText = "Готово";
                }
                                         );
            }
            catch (Exception exc)
            {
                Console.Write(exc.Message);
            }
            return;
        }