예제 #1
0
        private void SolveMainTask_Click(object sender, EventArgs e)
        {
            if (!ParseArguments())
            {
                MessageBox.Show("ERROR!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            double maxDif     = 0.0;
            double maxAccMain = acc_max;
            double maxAccHalf = acc_max;
            uint   IterMain   = Nmax;
            uint   IterHalf   = Nmax;
            uint   maxI       = 0u;
            uint   maxJ       = 0u;


            Method main, half;

            if (SimpleIterButton.Checked == true)
            {
                main = new SimpleIteration();
                half = new SimpleIteration();
            }
            else
            {
                main = new ConjGradient();
                half = new ConjGradient();
            }

            main.Init(Xo, Xn, Yo, Yn, N, M, approximationType);
            main.SetFunctions(mu1Main, mu2Main, mu3Main, mu4Main, FunctionMain);
            main.Run(ref IterMain, ref maxAccMain);

            SimpleIterationParameterLabel.Text = "Параметр метода: " + main.GetMethodParameter();

            half.Init(Xo, Xn, Yo, Yn, N * 2u, M * 2u, approximationType);
            half.SetFunctions(mu1Main, mu2Main, mu3Main, mu4Main, FunctionMain);
            half.Run(ref IterHalf, ref maxAccHalf);

            FindMax(CalculateDifferenceTableForMainTask(main.data, half.data, N, M), out maxDif, out maxI, out maxJ);


            ChangeLabelValue(MaxDifLabelMain, maxDif.ToString());
            ChangeLabelValue(ResidualMainTextBox, main.CalculateResidual().ToString());
            ChangeLabelValue(IterLabelMain, IterMain.ToString());
            ChangeLabelValue(AccMaxLabelMain, maxAccMain.ToString());
            ChangeLabelValue(ResidualHalfTextBox, half.CalculateResidual().ToString());
            ChangeLabelValue(IterLabelMainHalf, IterHalf.ToString());
            ChangeLabelValue(AccMaxLabelMainHalf, maxAccHalf.ToString());
            ChangeLabelValue(DotLabel, "Соответствует узлу x = " + Math.Abs(Math.Round(main.X(maxI), 3)).ToString() +
                             "  y = " + Math.Abs(Math.Round(main.Y(maxJ), 3)).ToString());

            tableCreator.Init(N * 2 + 1u, M * 2 + 1u);
            ChangeTableValues(TableHalf, half.data);

            tableCreator.Init(N + 1u, M + 1u);
            ChangeTableValues(TableMain, main.data);
            ChangeTableValues(TableDiffMain, CalculateDifferenceTableForMainTask(main.data, half.data, N, M));
        }
예제 #2
0
        private void SolveTestTask_Click(object sender, EventArgs e)
        {
            if (!ParseArguments())
            {
                MessageBox.Show("ERROR!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            double maxDif    = 0.0;
            double maxAcc    = acc_max;
            uint   iterCount = Nmax;
            uint   maxI      = 0u;
            uint   maxJ      = 0u;
            Method task;

            if (SimpleIterButton.Checked == true)
            {
                task = new SimpleIteration();
            }
            else
            {
                task = new ConjGradient();
            }


            task.Init(Xo, Xn, Yo, Yn, N, M, approximationType);
            task.SetFunctions(mu1Test, mu2Test, mu3Test, mu4Test, FunctionTest, ExactFunction);

            task.Run(ref iterCount, ref maxAcc);

            SimpleIterationParameterLabel.Text = "Параметр метода: " + task.GetMethodParameter();


            FindMax(
                CalculateDifferenceTableForTestTask(
                    task.data, task.GetExactTable(), task.N, task.M),
                out maxDif, out maxI, out maxJ);

            ChangeLabelValue(ResidualTextBox, task.CalculateResidual().ToString());
            ChangeLabelValue(IterLabel, iterCount.ToString());
            ChangeLabelValue(AccMaxLabel, maxAcc.ToString());
            ChangeLabelValue(maxDifLabel, maxDif.ToString());
            ChangeLabelValue(DotLabelTest, "Соответствует узлу x = " + Math.Abs(Math.Round(task.X(maxI), 3)).ToString() +
                             "  y = " + Math.Abs(Math.Round(task.Y(maxJ), 3)).ToString());

            tableCreator.Init(N + 1u, M + 1u);

            ChangeTableValues(Table, task.data);
            ChangeTableValues(TableExact, task.GetExactTable());
            ChangeTableValues(TableDiffTest,
                              CalculateDifferenceTableForTestTask(task.data, task.GetExactTable(), N, M));
        }