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