コード例 #1
0
        private void btn_phaseInit_Click(object sender, RoutedEventArgs e)
        {
            int    t_int;
            double t_double;

            phase_length  = int.TryParse(txt_len.Text, out t_int) ? t_int : phase_length;
            phase_obsmult = double.TryParse(txt_fact.Text, out t_double) ? t_double : phase_obsmult;
            attempts      = int.TryParse(txt_attempts.Text, out t_int) ? t_int : attempts;
            tau           = double.TryParse(txt_tau.Text, out t_double) ? t_double : tau;
            tauM          = double.TryParse(txt_tauM.Text, out t_double) ? t_double : tauM;
            mu            = double.TryParse(txt_mu.Text, out t_double) ? t_double : mu;
            ceil          = double.TryParse(txt_ceil.Text, out t_double) ? t_double : ceil;
            ceilby        = int.TryParse(txt_ceilby.Text, out t_int) ? t_int : ceilby;
            seed          = int.TryParse(txt_seed.Text, out t_int) ? t_int : seed;

            btn_phaseStep.IsEnabled = true;

            mainCanvas.ClearCanvas();
            double width = mainCanvas.Width;

            ExUtility.SetSeed(seed);

            phase_signal = new Point[phase_length];
            for (int i = 0; i < phase_length; i++)
            {
                phase_signal[i] = new Point(ExUtility.RandRange(-1, 1), ExUtility.RandRange(-1, 1));
            }

            double maxN = phase_signal.Max(p => ExUtility.NormComplex(p.X, p.Y));

            Point[] pts = new Point[phase_length];
            for (int i = 0; i < phase_length; i++)
            {
                pts[i] = new Point(i / (double)(phase_length - 1) * width, (ExUtility.NormComplex(phase_signal[i].X, phase_signal[i].Y) - maxN / 2) * width * 0.25 + width / 2);
            }

            mainCanvas.DrawPath(Colors.DarkSlateBlue, Colors.LightSteelBlue, 5, 2, pts);
        }
コード例 #2
0
        private void btn_phaseStep_Click(object sender, RoutedEventArgs e)
        {
            mainCanvas.ClearCanvas();
            double width = mainCanvas.Width;

            dc_Model model = new dc_Model();

            dc_Var[][] x = new dc_Var[phase_length][]; for (int i = 0; i < phase_length; i++)
            {
                x[i] = model.AddVarArray("X", -1, 1, 2, ExUtility.RandRange);
            }

            int phase_obs = (int)(phase_length * phase_obsmult);

            for (int i = 0; i < phase_obs; i++)
            {
                double[] aix = ExUtility.RandomDoubles(-1, 1, phase_length);
                double[] aiy = ExUtility.RandomDoubles(-1, 1, phase_length);

                double yx = 0;
                double yy = 0;
                for (int j = 0; j < phase_length; j++)
                {
                    yx += phase_signal[j].X * aix[j] + phase_signal[j].Y * aiy[j];
                    yy += -phase_signal[j].X * aiy[j] + phase_signal[j].Y * aix[j];
                }

                double y = yx * yx + yy * yy;

                dc_Func[] zx = new dc_Func[phase_length];
                dc_Func[] zy = new dc_Func[phase_length];
                for (int j = 0; j < phase_length; j++)
                {
                    zx[j] = model.Fn_Dot(new double[] { aix[j], aiy[j] }, x[j]);
                    zy[j] = model.Fn_Dot(new double[] { -aiy[j], aix[j] }, x[j]);
                }

                dc_Func zxsum = model.Fn_Sum(zx);
                dc_Func zysum = model.Fn_Sum(zy);

                model.AddGE(model.Fn_Negative(model.Fn_SumSquares(zxsum, zysum)), model.Fn_Const(-y));
                model.AddGE(model.Fn_SumSquares(zxsum, zysum), model.Fn_Const(y));
            }

            model.SetObjective(model.Fn_Const(0), model.Fn_Const(0));

            model.param_tau    = tau;
            model.param_tauM   = tauM;
            model.param_mu     = mu;
            model.param_ceil   = ceil;
            model.param_ceilby = ceilby;

            model.Solve(attempts, ExUtility.RandRange);
            model.CleanUp();

            double maxN = phase_signal.Max(p => ExUtility.NormComplex(p.X, p.Y));

            Point[] pts = new Point[phase_length];
            for (int i = 0; i < phase_length; i++)
            {
                pts[i] = new Point(i / (double)(phase_length - 1) * width, (ExUtility.NormComplex(phase_signal[i].X, phase_signal[i].Y) - maxN / 2) * width * 0.25 + width / 2);
            }

            mainCanvas.DrawPath(Colors.DarkSlateBlue, Colors.LightSteelBlue, 5, 2, pts);

            for (int i = 0; i < phase_length; i++)
            {
                pts[i] = new Point(i / (double)(phase_length - 1) * width, (ExUtility.NormComplex(x[i][0].lastValue, x[i][1].lastValue) - maxN / 2) * width * 0.25 + width / 2);
            }

            mainCanvas.DrawPath(Colors.Red, Colors.LightSalmon, 5, 2, pts);
        }