public static void WriteSolutionIntoFile(FullSolution solution, string filename) { var text = "Optimal value: " + solution.SolutionWithoutChange.FunctionValue + V + V; text += "A: " + solution.A + V; text += "B: " + solution.B + V; text += "L: " + solution.L + V; text += "Alphas: " + solution.SolutionWithoutChange.Alpha + V; if (solution.SolutionWithoutChange.Alpha != solution.SolutionWithoutChange.AlphaChanged) { text += "Alphas: " + solution.SolutionWithoutChange.AlphaChanged + V; } text += "\nOptimal X:\n"; text += solution.SolutionWithoutChange.OptimalX + V + V; for (var i = 0; i < solution.SolutionWithoutChange.Cs.Length; i++) { text += $"Matrix C[{i + 1}]:\n"; text += solution.SolutionWithoutChange.Cs[i] + V; text += $"Solution for matrix C[{i + 1}]:\n"; text += solution.SolutionWithoutChange.Xs[i] + V; text += "F = " + solution.SolutionWithoutChange.FsForX[i] + V; text += "F (with optimal Xs) = " + solution.SolutionWithoutChange.FsForXs[i] + V; text += "Delta = " + solution.SolutionWithoutChange.Deltas[i] + V; text += "Y = " + solution.SolutionWithoutChange.Ys[i] + V; text += "Distance = " + solution.SolutionWithoutChange.Distances[i] + V + V + V; } text += $"After changes ({solution.PersentOfChange}%) " + $"Optimal Value:\t{solution.SolutionWithChange.FunctionValue}" + V + V; if (solution.SolutionWithoutChange.AlphaChanged != solution.SolutionWithChange.AlphaChanged) { text += "Alpha changed: " + solution.SolutionWithChange.AlphaChanged + V + V; } text += "Optimal X changed:\n"; text += solution.SolutionWithChange.OptimalX + V + V; for (var i = 0; i < solution.SolutionWithChange.Cs.Length; i++) { text += $"Matrix C[{i + 1}] after changes:\n"; text += solution.SolutionWithChange.Cs[i] + V; text += $"Solution for matrix C[{i + 1}] after changes:\n"; text += solution.SolutionWithChange.Xs[i] + V; text += "F = " + solution.SolutionWithChange.FsForX[i] + V; text += "F (with optimal Xs) = " + solution.SolutionWithChange.FsForXs[i] + V; text += "Delta = " + solution.SolutionWithChange.Deltas[i] + V; text += "Y = " + solution.SolutionWithChange.Ys[i] + V; text += "Distance = " + solution.SolutionWithChange.Distances[i] + V + V + V; } File.WriteAllText(filename, text); }
public static FullSolution SolveEquation(Polynomial f, Polynomial g, Polynomial c) { FullSolution solution = new FullSolution(); //f=0; g=0; c=0 | c!=0 if (f.IsNull() && g.IsNull()) { if (c.IsNull()) { solution.zeroSolution = new Solution(new Polynomial(), new Polynomial()); solution.solutionStep = new Solution(null, null); solution.areCoefsIndependent = true; } else { solution.isDefined = false; } return(solution); } if (c.IsNull() && f.IsNull() != g.IsNull()) { solution.zeroSolution = new Solution(new Polynomial(), new Polynomial()); if (f.IsNull() && !g.IsNull()) { solution.solutionStep = new Solution(null, new Polynomial()); } else if (!f.IsNull() && g.IsNull()) { solution.solutionStep = new Solution(new Polynomial(), null); } return(solution); } else if (f.IsNull() != g.IsNull()) { if (f.IsNull()) { DividionResult divres = c / g; if (!divres.Reminder.IsNull()) { solution.isDefined = false; return(solution); } solution.solutionStep = new Solution(null, new Polynomial { 0 }); solution.zeroSolution = new Solution(new Polynomial { 0 }, divres.Quotient); } else { DividionResult divres = c / f; if (!divres.Reminder.IsNull()) { solution.isDefined = false; return(solution); } solution.solutionStep = new Solution(new Polynomial { 0 }, null); solution.zeroSolution = new Solution(divres.Quotient, new Polynomial { 0 }); } return(solution); } Polynomial gcd = new Polynomial(); GCDResult expCoefs = GCD(f, g, out gcd); DividionResult tempX0 = (expCoefs.Coef1 * c / gcd); DividionResult tempY0 = (expCoefs.Coef2 * c / gcd); // К этому моменту f и g не нулевые (ветвление для c) if (c.IsNull()) { solution.zeroSolution = new Solution(new Polynomial(), new Polynomial()); solution.solutionStep = new Solution((g / gcd).Quotient, -(f / gcd).Quotient); } else { if (tempX0.Reminder.IsNull() && tempY0.Reminder.IsNull()) { solution.zeroSolution = new Solution(tempX0.Quotient, tempY0.Quotient); solution.solutionStep = new Solution((g / gcd).Quotient, -(f / gcd).Quotient); } else { return(new FullSolution() { isDefined = false }); } } return(solution); }
public SolutionWindow(FullSolution solution, Problem data) { _data = data; _fullSolution = solution; InitializeComponent(); SaveInputButton.Margin = new Thickness(Width - 100, 77, 0, 0); OptimalValueBlock.Text = solution.SolutionWithoutChange.FunctionValue; OptimalValueBlock.Margin = new Thickness(13 + ValueLabel.Content.ToString().Length * 9, 13, 0, 0); AlphaBlock.Text = solution.SolutionWithoutChange.Alpha; if (solution.SolutionWithoutChange.Alpha != solution.SolutionWithoutChange.AlphaChanged) { AlphaBlockChanged.Text = solution.SolutionWithoutChange.AlphaChanged; } else { AlphaBlockChangedLable.Content = ""; } ABlock.Text = solution.A; BBlock.Text = solution.B; LBlock.Text = solution.L; OutputBlock.Text = solution.SolutionWithoutChange.OptimalX; OutputBlock.VerticalAlignment = VerticalAlignment.Top; OutputBlock.HorizontalAlignment = HorizontalAlignment.Left; SaveInputButton.Margin = new Thickness(23, 77, 0, 0); SaveInputButton.Width = 200; SaveResult.Margin = new Thickness(23, 135, 0, 0); SaveResult.Width = 200; AccuracyLabel.Margin = new Thickness(23, 199, 0, 0); AccuracyComboBox.Margin = new Thickness(275, 204, 0, 0); FindPercentButton.Margin = new Thickness(275, 241, 0, 0); var startHeight = 80; OptimalXsLabel.Margin = new Thickness(23, FindPercentButton.Margin.Top + 40, 0, 0); OutputBlock.Margin = new Thickness(23, FindPercentButton.Margin.Top + startHeight, 0, 0); //OutputBlock.Width = 65 * solution.SolutionWithoutChange.N; //OutputBlock.Height = 35 * solution.SolutionWithoutChange.N; MatrixesCLabel.VerticalAlignment = VerticalAlignment.Top; MatrixesCLabel.HorizontalAlignment = HorizontalAlignment.Left; var labelsHeight = FindPercentButton.Margin.Top + startHeight + 24 * solution.SolutionWithoutChange.N + 20; MatrixesCLabel.Margin = new Thickness(23, labelsHeight, 0, 0); var XsLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(50 + 65 * solution.SolutionWithoutChange.N, labelsHeight, 0, 0), Content = Properties.Resources.SolutionsXLabel }; CoolGrid.Children.Add(XsLabel); for (var i = 0; i < solution.SolutionWithoutChange.Cs.Length; i++) { var newTxtBlock = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithoutChange.N, Width = 65 * solution.SolutionWithoutChange.N, Text = solution.SolutionWithoutChange.Cs[i], Margin = new Thickness(23, labelsHeight + 50 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0) }; var newXBlock = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithoutChange.N, Width = 65 * solution.SolutionWithoutChange.N, Text = solution.SolutionWithoutChange.Xs[i], Margin = new Thickness(50 + 65 * solution.SolutionWithoutChange.N, labelsHeight + 50 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0) }; var FsForXLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 50 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Content = "F:" }; var FsForXValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 50 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Text = solution.SolutionWithoutChange.FsForX[i] }; var FsForXsLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 67 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Content = "F':" }; var FsForXsValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 70 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Text = solution.SolutionWithoutChange.FsForXs[i] }; var DeltasLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 85 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Content = "Δ:" }; var DeltasValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 90 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Text = solution.SolutionWithoutChange.Deltas[i] }; var YsLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 105 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Content = "Y:" }; var YsValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 110 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Text = solution.SolutionWithoutChange.Ys[i] }; var DistancesLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 125 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Content = Properties.Resources.DistanceLabel }; var DistancesValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N, labelsHeight + 130 + (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0), Text = solution.SolutionWithoutChange.Distances[i] }; labelsHeight += 40; CoolGrid.Children.Add(newTxtBlock); CoolGrid.Children.Add(newXBlock); CoolGrid.Children.Add(FsForXLabel); CoolGrid.Children.Add(FsForXValues); CoolGrid.Children.Add(FsForXsLabel); CoolGrid.Children.Add(FsForXsValues); CoolGrid.Children.Add(DeltasLabel); CoolGrid.Children.Add(DeltasValues); CoolGrid.Children.Add(YsLabel); CoolGrid.Children.Add(YsValues); CoolGrid.Children.Add(DistancesLabel); CoolGrid.Children.Add(DistancesValues); } var height = labelsHeight + 60 + (solution.SolutionWithoutChange.Cs.Length * 24 * (solution.SolutionWithoutChange.N)); var ChangesLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(23, height , 0, 0), Content = $"{Properties.Resources.AfterChanges} ({solution.PersentOfChange}%) {Properties.Resources.OptimalValueLabel}\t{solution.SolutionWithChange.FunctionValue}" }; CoolGrid.Children.Add(ChangesLabel); var optimalXLabel = new Label() { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithChange.N, Width = 65 * solution.SolutionWithChange.N, Content = Properties.Resources.OptimalXLabel, Margin = new Thickness(23, height + 45, 0, 0) }; CoolGrid.Children.Add(optimalXLabel); var alphaChangedLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithChange.N, Width = 65 * solution.SolutionWithChange.N, Content = Properties.Resources.AlphaChangedLabel, Margin = new Thickness(50 + 65 * solution.SolutionWithChange.N, height + 45, 0, 0) }; CoolGrid.Children.Add(alphaChangedLabel); var changedOtimalX = new TextBlock() { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithChange.N, Width = 65 * solution.SolutionWithChange.N, Text = solution.SolutionWithChange.OptimalX, Margin = new Thickness(23, height + 90, 0, 0) }; CoolGrid.Children.Add(changedOtimalX); var alphaChanged = new TextBlock() { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithChange.N, Width = 65 * solution.SolutionWithChange.N, Text = solution.SolutionWithChange.AlphaChanged, Margin = new Thickness(200 + 65 * solution.SolutionWithChange.N, height + 50, 0, 0) }; if (solution.SolutionWithoutChange.AlphaChanged == solution.SolutionWithChange.AlphaChanged) { alphaChanged.Text = ""; alphaChangedLabel.Content = ""; } CoolGrid.Children.Add(alphaChanged); height += 50; var CsMatrixesChanged = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(23, height + 50 + 24 * solution.SolutionWithChange.N, 0, 0), Content = Properties.Resources.MatrixesCLabel }; CoolGrid.Children.Add(CsMatrixesChanged); var XsChangedLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(50 + 65 * solution.SolutionWithoutChange.N, height + 50 + 24 * solution.SolutionWithChange.N, 0, 0), Content = Properties.Resources.OptimalXLabel }; CoolGrid.Children.Add(XsChangedLabel); for (var i = 0; i < solution.SolutionWithChange.Cs.Length; i++) { var newTxtBlock = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithChange.N, Width = 65 * solution.SolutionWithChange.N, Text = solution.SolutionWithChange.Cs[i], Margin = new Thickness(23, height + 100 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0) }; var newXBlock = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Height = 24 * solution.SolutionWithChange.N, Width = 65 * solution.SolutionWithChange.N, Text = solution.SolutionWithChange.Xs[i], Margin = new Thickness(50 + 65 * solution.SolutionWithChange.N, height + 100 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0) }; var FsForXLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N, height + 95 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Content = "F:" }; var FsForXValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N, height + 100 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Text = solution.SolutionWithChange.FsForX[i] }; var FsForXsLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N, height + 115 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Content = "F':" }; var FsForXsValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N, height + 120 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Text = solution.SolutionWithChange.FsForXs[i] }; var DeltasLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N, height + 135 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Content = "Δ:" }; var DeltasValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N, height + 140 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Text = solution.SolutionWithChange.Deltas[i] }; var YsLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N, height + 155 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Content = "Y:" }; var YsValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N, height + 160 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Text = solution.SolutionWithChange.Ys[i] }; var DistancesLabel = new Label { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N, height + 175 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Content = Properties.Resources.DistanceLabel }; var DistancesValues = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N, height + 180 + 24 * solution.SolutionWithChange.N + (i * 24 * (solution.SolutionWithChange.N)), 0, 0), Text = solution.SolutionWithChange.Distances[i] }; height += 40; CoolGrid.Children.Add(newTxtBlock); CoolGrid.Children.Add(newXBlock); CoolGrid.Children.Add(FsForXLabel); CoolGrid.Children.Add(FsForXValues); CoolGrid.Children.Add(FsForXsLabel); CoolGrid.Children.Add(FsForXsValues); CoolGrid.Children.Add(DeltasLabel); CoolGrid.Children.Add(DeltasValues); CoolGrid.Children.Add(YsLabel); CoolGrid.Children.Add(YsValues); CoolGrid.Children.Add(DistancesLabel); CoolGrid.Children.Add(DistancesValues); } }