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())); }
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; * } * }*/ }