示例#1
0
 private void ValueChanged(object sender, EventArgs e)
 {
     chart1.Series.Clear();
     for (int rank = MatrixRankMinimum; rank <= MatrixRankMaximum; rank++)
     {
         double    a     = IntervalStart;
         double    b     = IntervalEnd;
         const int count = 10000; // Количество отсчётов при рисовании графика
         chart1.ChartAreas[0].AxisX.Minimum = a;
         chart1.ChartAreas[0].AxisX.Maximum = b;
         var list = new StackListQueue <KeyValuePair <double, double> >();
         Parallel.ForEach(Enumerable.Range(0, count), i =>
         {
             double x = (i * a + (count - i) * b) / count;
             double y = Math.Log10(Math.Abs(LaplaceSolver.Det(x, rank)));
             if (double.IsNegativeInfinity(y) || double.IsPositiveInfinity(y))
             {
                 return;
             }
             lock (list) list.Add(new KeyValuePair <double, double>(x, y));
         });
         list.Sort(new KeyValuePairDoubleDoubleComparer());
         chart1.DataBindTable(list, "Key");
         chart1.Series.Last().ChartType = SeriesChartType.FastPoint;
         chart1.Series.Last().Name      = string.Format("Rank = {0}", rank);
     }
 }
示例#2
0
        public OptimazerForm()
        {
            InitializeComponent();
            chart1.SuppressExceptions = true;
            chart2.SuppressExceptions = true;
            chart1.Series.Clear();
            chart2.Series.Clear();
            chart1.ChartAreas[0].AxisX.IntervalAutoMode  = IntervalAutoMode.VariableCount;
            chart1.ChartAreas[0].AxisY.IntervalAutoMode  = IntervalAutoMode.VariableCount;
            chart2.ChartAreas[0].AxisX.IntervalAutoMode  = IntervalAutoMode.VariableCount;
            chart2.ChartAreas[0].AxisY.IntervalAutoMode  = IntervalAutoMode.VariableCount;
            chart1.ChartAreas[0].AxisX.IsStartedFromZero = false;
            chart1.ChartAreas[0].AxisY.IsStartedFromZero = false;
            chart2.ChartAreas[0].AxisX.IsStartedFromZero = false;
            chart2.ChartAreas[0].AxisY.IsStartedFromZero = false;
            chart1.ChartAreas[0].AxisX2.Enabled          = AxisEnabled.False;
            chart1.ChartAreas[0].AxisY2.Enabled          = AxisEnabled.False;

            const int n     = 2;
            const int count = 100;

            chart2.ChartAreas[0].AxisX.Minimum = n;
            chart2.ChartAreas[0].AxisX.Maximum = n + count - 1;
            var list = new StackListQueue <OptimalValues>();

            Parallel.ForEach(Enumerable.Range(n, count), i =>
            {
                var values = new OptimalValues
                {
                    Rank     = i,
                    Det2nAt1 = (Math.Abs(LaplaceSolver.Det2n(1, i))),
                    Det2nAt2 = (Math.Abs(LaplaceSolver.Det2n(2, i))),
                    Det2nAt3 = (Math.Abs(LaplaceSolver.Det2n(3, i))),
                };
                lock (list) list.Add(values);
            });
            list.Sort(new OptimalValuesComparer());
            dataGridView1.DataSource = new BindingList <OptimalValues>(list);
            chart2.DataBindTable(
                new StackListQueue <OptimalValues>(
                    list.Where(
                        i => !double.IsPositiveInfinity(i.Det2nAt1) &&
                        !double.IsPositiveInfinity(i.Det2nAt2) &&
                        !double.IsPositiveInfinity(i.Det2nAt3) &&
                        !double.IsNegativeInfinity(i.Det2nAt1) &&
                        !double.IsNegativeInfinity(i.Det2nAt2) &&
                        !double.IsNegativeInfinity(i.Det2nAt3))), "Rank");
            foreach (Series series in chart2.Series)
            {
                series.ChartType = SeriesChartType.FastPoint;
            }
        }