Ejemplo n.º 1
0
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var eq = new Equestion(
                    Convert.ToDouble(alpha.Text),
                    Convert.ToDouble(beta.Text),
                    Convert.ToDouble(gamma.Text),
                    F.Text,
                    Convert.ToDouble(a.Text),
                    Convert.ToDouble(b.Text),
                    Convert.ToDouble(A.Text),
                    Convert.ToDouble(B.Text),
                    Convert.ToInt32(r.Text),
                    Convert.ToInt32(N.Text),
                    Convert.ToDouble(epsilon.Text));
                closer.Visibility = Visibility.Visible;

                var solution = await eq.SolveUnlinearAsyncFake(w => 2 *w *w + 3);

                closer.Visibility = Visibility.Hidden;
                var n = Convert.ToInt32(N.Text);
                var h = (Convert.ToDouble(b.Text) - Convert.ToDouble(a.Text)) / n;
                ExpressionEvaluator evaluator = new ExpressionEvaluator();

                double[] realSol = null;
                if (!string.IsNullOrEmpty(xReal.Text))
                {
                    realSol = Enumerable.Range(0, Convert.ToInt32(N.Text) + 1).Select(w => w * h).Select(w => (double)evaluator.Evaluate(xReal.Text, new { t = w })).ToArray();
                }

                resultView.Items.Clear();
                resultView.Items.Add(GenerateItem("t", "Численное решение", "Точное решение", "Норма"));
                for (int i = 0; i < n + 1; i++)
                {
                    resultView.Items.Add(GenerateItem((h * i).ToString(), solution[i].ToString(), realSol == null ? "(none)" : realSol[i].ToString(), realSol == null ? "(none)" : (Math.Abs(realSol[i] - solution[i])).ToString()));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Проверьте корректность введенных данных\n" + ex.Message);
            }
        }
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            abortBtn.IsEnabled = true;
            IsContinueSolving  = true;
            try
            {
                sw.Start();
                eq = new Equestion(
                    Convert.ToDouble(alpha.Text),
                    Convert.ToDouble(beta.Text),
                    Convert.ToDouble(gamma.Text),
                    F.Text,
                    Convert.ToDouble(a.Text),
                    Convert.ToDouble(b.Text),
                    Convert.ToDouble(A.Text),
                    Convert.ToDouble(B.Text),
                    Convert.ToInt32(r.Text),
                    Convert.ToInt32(N.Text),
                    Convert.ToDouble(epsilon.Text));
                closer.Visibility = Visibility.Visible;

                solution = await eq.SolveUnlinearAsync();

                n = Convert.ToInt32(N.Text);
                h = (Convert.ToDouble(b.Text) - Convert.ToDouble(a.Text)) / n;
                ExpressionEvaluator evaluator = new ExpressionEvaluator();

                realSol = null;
                if (!string.IsNullOrEmpty(xReal.Text))
                {
                    realSol = Enumerable.Range(0, Convert.ToInt32(N.Text) + 1).Select(w => w * h).Select(w => (double)evaluator.Evaluate(xReal.Text, new { t = w })).ToArray();
                }

                // Ищем нужное N
                if (!string.IsNullOrEmpty(epsilon2.Text))
                {
                    currentN.Visibility = Visibility.Visible;
                    var  firstInt   = eq.N;
                    bool isContinue = true;
                    while (isContinue)
                    {
                        isContinue         = false;
                        currentNValue.Text = eq.N.ToString();
                        var eps2 = Convert.ToDouble(epsilon2.Text);
                        eq.N = eq.N * 2;
                        eq.h = eq.h / 2;

                        var k      = eq.N / firstInt;
                        var newSol = (await eq.SolveUnlinearAsync()).Where((w, i) => i % k == 0).ToArray();
                        if (!IsContinueSolving)
                        {
                            return;
                        }
                        var summ = 0.0;
                        for (int i = 0; i < solution.Length; i++)
                        {
                            summ += Math.Pow(newSol[i] - solution[i], 2.0);
                        }
                        summ = Math.Sqrt(summ);
                        if (summ > eps2)
                        {
                            isContinue = true;
                        }
                        solution = newSol;
                    }
                    eq.N = eq.N / 2;
                    closer.Visibility = Visibility.Hidden;
                }

                SomeWork();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Проверьте корректность введенных данных\n" + ex.Message);
            }
        }