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();
        }
Beispiel #2
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;
        }
        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();
        }
Beispiel #4
0
        internal void RunNonlinearExpressionTest(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);
                outputList.Add("Variables:");
                outputList.Add(compiledEquation.PrintVariables());
                outputList.Add(compiledEquation.PrintEquations());
                outputList.Add(compiledEquation.PrintJacobiMatrix(false));
            }
            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;
        }