Exemplo n.º 1
0
        private async Task rad2Async()
        {
            chart1.Series.Clear();
            double wold = Convert.ToDouble(textBox13.Text);
            double beg = Convert.ToDouble(textBox4.Text), end = Convert.ToDouble(textBox5.Text);
            int    itcount = абКонсоль.countroot, k = Convert.ToInt32(numericUpDown1.Value);
            double h = (end - beg) / (k - 1);
            double kt1 = k1(wold), kt2 = k2(wold);

            ComplexFunc s1 = (Complex alp) => sigma(alp * alp, kt1);
            ComplexFunc s2 = (Complex alp) => sigma(alp * alp, kt2);

            if (radioButton5.Checked)
            {
                othergraph("Δ", (Complex c) => Deltass(c, wold), beg, k, h);
            }
            if (radioButton6.Checked)
            {
                othergraph("σ1", s1, beg, k, h);
            }
            if (radioButton7.Checked)
            {
                othergraph("σ2", s2, beg, k, h);
            }
        }
Exemplo n.º 2
0
        public void OneRootInDegree(double rootx, double rooty, double degree)
        {
            Complex     root = new Complex(rootx, rooty);
            ComplexFunc f    = (Complex z) => Complex.Pow(z - root, degree);
            Complex     val  = Muller(f, new Complex(0, 1), new Complex(3, 3), new Complex(9, 5), 1e-16);

            Assert.IsTrue((root - val).Abs < 1e-2, message: $"Expected {root}, but was {val} (distance = {(root - val).Abs})");
        }
Exemplo n.º 3
0
        /// <summary>
        /// Примерный максимум модуля функции на отрезке
        /// </summary>
        /// <param name="f"></param>
        /// <param name="beg"></param>
        /// <param name="end"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        public static double MaxApproxAbs(ComplexFunc f, double beg, double end, double step = 0.01)
        {
            double m(double c) => f(c).Abs;

            double max = m(beg), tmp;

            while (beg <= end)
            {
                beg += step;
                tmp  = m(beg);
                if (tmp > max)
                {
                    max = tmp;  //max.Show();
                }
            }
            return(max);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Простой поиск корней комплексной функции на действительном отрезке методом дихотомии
        /// </summary>
        /// <param name="f"></param>
        /// <param name="beg"></param>
        /// <param name="end"></param>
        /// <param name="step"></param>
        /// <param name="eps"></param>
        /// <returns></returns>
        public static Vectors MyHalfc(ComplexFunc f, double beg, double end, double step = 0.01, double eps = 1e-12)
        {
            List <double> list = new List <double>();
            double        a = beg, a2 = beg + step, b = end, t1, t2, s;
            Complex       fa = f(a), fa2 = f(a2), fc;

            while (a < b)
            {
                if (fa.Abs < eps)
                {
                    list.Add(a);
                }
                else
                if (Math.Sign(fa.Re) * Math.Sign(fa2.Re) <= 0 && Math.Sign(fa.Im) * Math.Sign(fa2.Im) <= 0)//написал условие именно так, чтобы избежать переполнения
                {
                    t1 = a; t2 = a2;
                    while (t2 - t1 > eps)
                    {
                        s  = (t1 + t2) / 2;
                        fc = f(s);//fc.Show();
                        if (fc.Abs < eps)
                        {
                            break;
                        }
                        if (Math.Sign(fa.Re) * Math.Sign(fc.Re) <= 0 && Math.Sign(fa.Im) * Math.Sign(fc.Im) <= 0)
                        {
                            t2 = s;
                        }
                        else
                        {
                            t1 = s;
                        }
                    }
                    s = (t1 + t2) / 2;
                    if (f(s).Abs < 3)
                    {
                        list.Add(s);
                    }
                }
                a   = a2;
                a2 += step;
                fa  = new Complex(fa2);
                fa2 = f(a2);
            }
            return(new Vectors(list.ToArray()));
        }
        public Energy()
        {
            InitializeComponent();
            Библиотека_графики.ForChart.SetToolTips(ref chart1);
            Библиотека_графики.ForChart.ClearPointsAndHideLegends(ref chart1);

            Ez0 = (double z) =>
            {
                ComplexFunc us = (Number.Complex x) => (абКонсоль.uRes(x.Re, 0).Conjugate *абКонсоль.q(x.Re) + абКонсоль.uRes(-x.Re, 0).Conjugate *абКонсоль.q(-x.Re)) / абКонсоль.m1;
                return((FuncMethods.DefInteg.GaussKronrod.DINN_GK(us, 0, 0, 0, 0, 0, 0)).Re);
            };
            Ez = (double z) =>
            {
                //ComplexFunc us = (Number.Complex x) => РабКонсоль.uRes(x.Re, z).Conjugate * (РабКонсоль.uRes(x.Re, z+ РабКонсоль.eps) - РабКонсоль.uRes(x.Re , z- РабКонсоль.eps)) / (2 * РабКонсоль.eps);
                //ComplexFunc us_ = (Number.Complex x) => РабКонсоль.uRes(-x.Re, z).Conjugate * (РабКонсоль.uRes(-x.Re, z + РабКонсоль.eps) - РабКонсоль.uRes(-x.Re, z - РабКонсоль.eps)) / (2 * РабКонсоль.eps);
                //return (FuncMethods.DefInteg.GaussKronrod.DINN_GK(us, 0, 0, 0, 0, 0, 0) + FuncMethods.DefInteg.GaussKronrod.DINN_GK(us_, 0, 0, 0, 0, 0, 0)).Abs;

                //ComplexFunc us = (Number.Complex x) => (РабКонсоль.uRes(x.Re, z).Conjugate * (РабКонсоль.uRes(x.Re, z + РабКонсоль.eps) - РабКонсоль.uRes(x.Re, z - РабКонсоль.eps)) + РабКонсоль.uRes(-x.Re, z).Conjugate * (РабКонсоль.uRes(-x.Re, z + РабКонсоль.eps) - РабКонсоль.uRes(-x.Re, z - РабКонсоль.eps))) / (2 * РабКонсоль.eps);
                //return (FuncMethods.DefInteg.GaussKronrod.DINN_GK(us, 0, 0, 0, 0, 0, 0)).Abs;

                //ComplexFunc us = (Number.Complex x) => РабКонсоль.uRes(x.Re, z).Conjugate * РабКонсоль.uResdz(x.Re, z) + РабКонсоль.uRes(-x.Re, z).Conjugate * РабКонсоль.uResdz(-x.Re, z);
                //return (FuncMethods.DefInteg.GaussKronrod.DINN_GK(us, 0, 0, 0, 0, 0, 0)).Re;

                //ComplexFunc us = (Number.Complex x) => РабКонсоль.u(x.Re, z).Conjugate * РабКонсоль.u_(x.Re, z).Re + РабКонсоль.u(-x.Re, z).Conjugate * РабКонсоль.u_(-x.Re, z).Re;
                //return (FuncMethods.DefInteg.GaussKronrod.DINN_GK(us, 0, 0, 0, 0, 0, 0)).Re;

                ComplexFunc us = (Number.Complex x) => абКонсоль.U_(x, z) * абКонсоль.U(x.Conjugate, z).Conjugate + абКонсоль.U_(-x, z) * абКонсоль.U(-x.Conjugate, z).Conjugate;
                return((FuncMethods.DefInteg.GaussKronrod.DINN_GK(us, абКонсоль.t1, абКонсоль.t2, абКонсоль.t3, абКонсоль.t4, абКонсоль.tm)).Im / 2 / Math.PI);
            };
            Ex = (double x) =>
            {
                //ComplexFunc u = (Number.Complex z) => (РабКонсоль.uRes(x + РабКонсоль.eps, z.Re) - РабКонсоль.uRes(x - РабКонсоль.eps, z.Re)) / (2 * РабКонсоль.eps) * РабКонсоль.uRes(x, z.Re).Conjugate;
                //return FuncMethods.DefInteg.GaussKronrod.MySimpleGaussKronrod(u, -РабКонсоль.h, 0).Re;

                ComplexFunc u = (Number.Complex z) => абКонсоль.uResdx(x, z.Re) * абКонсоль.uRes(x, z.Re).Conjugate;
                return(FuncMethods.DefInteg.GaussKronrod.MySimpleGaussKronrod(u, -абКонсоль.h, 0).Im);

                //RealFunc ureal = (double z) => u(z).Re;
                //return FuncMethods.DefInteg.GaussKronrod.Integral(ureal, -РабКонсоль.h, 0);
            };
        }
Exemplo n.º 6
0
 private void othergraph(string func, ComplexFunc f, double beg, int k, double hh)
 {
     prbar = new int[k];
     chart1.Series.Add($"Re {func}"); chart1.Series[0].Color  = Color.Red;
     chart1.Series.Add($"Im {func}"); chart1.Series[1].Color  = Color.Green;
     chart1.Series.Add($"Abs {func}"); chart1.Series[2].Color = Color.Blue;
     for (int i = 0; i < 3; i++)
     {
         chart1.Series[i].BorderWidth = 3;
         chart1.Series[i].ChartType   = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
         chart1.Series[i].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
         chart1.Series[i].ToolTip     = "X = #VALX, Y = #VALY";
     }
     for (int i = 0; i < k; i++)
     {
         double         arg = beg + i * hh;
         Number.Complex val = f(arg); //val.Show();
         chart1.Series[0].Points.AddXY(arg, val.Re);
         chart1.Series[1].Points.AddXY(arg, val.Im);
         chart1.Series[2].Points.AddXY(arg, val.Abs);
         prbar[i] = 1;
     }
     chart1.Titles[0].Text = $"График {func}(ω)";
 }
        private void button1_Click(object sender, EventArgs e)
        {
            абКонсоль.GRFORM.Init();
            //РабКонсоль.GRFORM.chart1.Series[0].Points.Clear(); РабКонсоль.GRFORM.chart1.Series[1].Points.Clear();

            count = Convert.ToInt32(numericUpDown1.Value);
            x     = Convert.ToDouble(textBox1.Text);
            z     = Convert.ToDouble(textBox2.Text);
            string s1 = "", s2 = "";

            if (radioButton1.Checked)
            {
                a = new Number.Complex(0); b = new Number.Complex(абКонсоль.t1); s1 = $" на отрезке [0,t1={b}]";
            }
            if (radioButton2.Checked)
            {
                a = new Number.Complex(абКонсоль.t1, 0); b = new Number.Complex(абКонсоль.t1, -абКонсоль.tm); s1 = $" на отрезке [t1={a},t1-itm={b}]";
            }
            if (radioButton3.Checked)
            {
                a = new Number.Complex(абКонсоль.t1, -абКонсоль.tm); b = new Number.Complex(абКонсоль.t4, -абКонсоль.tm); s1 = $" на отрезке [t1-itm={a},t4-itm={b}]";
            }
            if (radioButton4.Checked)
            {
                a = new Number.Complex(абКонсоль.t4, -абКонсоль.tm); b = new Number.Complex(абКонсоль.t4); s1 = $" на отрезке [t4-itm={a},t4={b}]";
            }
            if (radioButton5.Checked)
            {
                a = new Number.Complex(абКонсоль.t4); b = new Number.Complex(абКонсоль.gr); s1 = $" на отрезке [t4={a},gr={b}]";
            }

            h  = (b - a) / (count - 1);
            h1 = (b - a).Abs / (count - 1);

            if (radioButton6.Checked)
            {
                f = (Number.Complex ee) => абКонсоль.K1(ee, z) * абКонсоль.Q(ee) * Number.Complex.Ch(Number.Complex.I * x * ee); s2 = $"K1(α,{z})Q(α)Ch(iα*{x})";
            }
            if (radioButton7.Checked)
            {
                f = (Number.Complex ee) => абКонсоль.K2(ee, z) * абКонсоль.Q(ee) * Number.Complex.Ch(Number.Complex.I * x * ee); s2 = $"K2(α,{z})Q(α)Ch(iα*{x})";
            }
            if (radioButton8.Checked)
            {
                f = (Number.Complex ee) => абКонсоль.K1_(ee, z) * абКонсоль.Q(ee) * Number.Complex.Ch(Number.Complex.I * x * ee); s2 = $"K1'(α,{z})Q(α)Ch(iα*{x})";
            }
            if (radioButton9.Checked)
            {
                f = (Number.Complex ee) => абКонсоль.K2_(ee, z) * абКонсоль.Q(ee) * Number.Complex.Ch(Number.Complex.I * x * ee); s2 = $"K2'(α,{z})Q(α)Ch(iα*{x})";
            }
            if (radioButton10.Checked)
            {
                f = (Number.Complex ee) => абКонсоль.sigma1(ee); s2 = $"σ1(α)";
            }
            if (radioButton11.Checked)
            {
                f = (Number.Complex ee) => абКонсоль.sigma1(ee).Sqr(); s2 = $"σ1(α)^2";
            }

            абКонсоль.GRFORM.chart1.Series[0].Name = "Re " + s2 + s1;
            абКонсоль.GRFORM.chart1.Series[1].Name = "Im " + s2 + s1;

            for (int i = 0; i < count; i++)
            {
                double         arg  = i * h1;
                Number.Complex arg1 = a + i * h;
                Number.Complex fx   = f(arg1); $"f(при {arg}) = {fx}".Show();
                абКонсоль.GRFORM.chart1.Series[0].Points.AddXY(arg, fx.Re);
                абКонсоль.GRFORM.chart1.Series[1].Points.AddXY(arg, fx.Im);
            }


            ForChart.SetAxisesY(ref абКонсоль.GRFORM.chart1);
            абКонсоль.GRFORM.Refresh();
        }
Exemplo n.º 8
0
        /// <summary>
        /// Простой поиск корней как поиск минимумов модуля функции (которые должны быть равны 0)
        /// </summary>
        /// <param name="f"></param>
        /// <param name="beg"></param>
        /// <param name="end"></param>
        /// <param name="step"></param>
        /// <param name="eps"></param>
        /// <returns></returns>
        public static Vectors RootsByMinAbs(ComplexFunc f, double beg, double end, double step = 0.01, double eps = 1e-12)
        {
            Func <double, double> fabs = (double c) => f(c).Abs;
            List <double>         list = new List <double>();

            double a = beg, a2 = beg + step, t1, t2, s, d1, d2, ds;
            double fa = fabs(a), fa2 = fabs(a2), fc;

            double der(double c) => fabs(c + eps) - fabs(c - eps);

            while (a < end)
            {
                d1 = der(a);
                d2 = der(a2);
                //$"{d1} {d2}".Show();
                if (fa < eps)
                {
                    list.Add(a);
                }
                else if (fa2 < eps)
                {
                    list.Add(a2);
                }
                else if (d1 < 0 && d2 > 0)
                {
                    t1 = a; t2 = a2;
                    while (t2 - t1 > eps)
                    {
                        //$"{d1} {d2}".Show();
                        s  = (t1 + t2) / 2;
                        fc = fabs(s);//fc.Show();
                        ds = der(s);
                        if (fc < eps)
                        {
                            break;
                        }
                        if (ds > 0)
                        {
                            t2 = s; d2 = ds;
                        }
                        else
                        {
                            t1 = s; d1 = ds;
                        }
                    }
                    s = (t1 + t2) / 2;
                    list.Add(s);
                }

                a   = a2;
                a2 += step;
                fa  = fa2;
                fa2 = fabs(a2);
            }

            for (int i = 0; i < list.Count; i++)
            {
                if (fabs(list[i]) > eps)
                {
                    list.RemoveAt(i);
                    i--;
                }
            }

            return(new Vectors(list.Distinct().ToArray()));
        }
Exemplo n.º 9
0
        /// <summary>
        /// Поиск корней одним из специальных методов
        /// </summary>
        /// <param name="f"></param>
        /// <param name="beg"></param>
        /// <param name="end"></param>
        /// <param name="step"></param>
        /// <param name="eps"></param>
        /// <param name="m">Метод</param>
        /// <param name="withMuller">Дополнять ли корни корнями метода парабол</param>
        /// <param name="countpoles">Требуемое количество корней. Если это число заранее известно, его указание может сильно ускорить вычисление. Иначе надо взять большое число</param>
        /// <returns></returns>
        public static Vectors OtherMethod(ComplexFunc f, double beg, double end, double step = 0.01, double eps = 1e-12, MethodRoot m = MethodRoot.Brent, bool withMuller = false, int countpoles = 2)
        {
            List <double>         list = new List <double>();
            Func <double, double> func = (double c) => f(c).ReIm;
            double  a = beg, b = beg + step;
            Complex fa = f(a), fb = f(b);
            MethodR g;

            //MethodR half = (Func<double, double> ff, double begf, double endf, double epsf, uint N) => Optimization.Halfc((double c) => f(c).ReIm, begf, endf, step, eps);
            switch (m)
            {
            case MethodRoot.Brent:
                g = BrentMethod;
                break;

            case MethodRoot.Bisec:
                g = bisectionMethod;
                break;

            case MethodRoot.Secant:
                g = secantMethod;
                break;

            case MethodRoot.NewtonRaphson:
                g = secantNewtonRaphsonMethod;
                break;

            default:
                g = BroydenMethod;
                break;
            }

            if (withMuller)
            {
                while (a < end)
                {
                    if (fa.Re * fb.Re <= 0 && fa.Im * fb.Im <= 0)
                    {
                        if (m == MethodRoot.Combine)
                        {
                            list.Add(BrentMethod(func, a, b, 1e-12, N: 1000));
                            list.Add(BroydenMethod(func, a, b, 1e-12, N: 1000));
                            list.Add(secantMethod(func, a, b, 1e-12, N: 1000));
                        }
                        else
                        {
                            list.Add(g(func, a, b, 1e-12, N: 1000));
                        }
                        //Optimization.Muller(f, a, new Complex((a + b) / 2, 0), new Complex(b, 0)).Re.Show();
                        list.Add(Optimization.Muller(f, a, new Complex((a + b) / 2, 0.01), new Complex((a + b) / 2, -0.01)).Re);
                    }
                    if (list.Count == countpoles)
                    {
                        break;
                    }

                    a  = b;
                    b += step;
                    fa = new Complex(fb);
                    fb = f(b);
                }
            }
            else
            {
                while (a < end)
                {
                    if (fa.Re * fb.Re <= 0 && fa.Im * fb.Im <= 0)
                    {
                        if (m == MethodRoot.Combine)
                        {
                            list.Add(BrentMethod(func, a, b, 1e-12, N: 1000));
                            list.Add(BroydenMethod(func, a, b, 1e-12, N: 1000));
                            list.Add(secantMethod(func, a, b, 1e-12, N: 1000));
                        }
                        else
                        {
                            list.Add(g(func, a, b, 1e-12, N: 1000));
                        }
                    }

                    if (list.Count == countpoles)
                    {
                        break;
                    }
                    a  = b;
                    b += step;
                    fa = new Complex(fb);
                    fb = f(b);
                }
            }

            //new Vectors(list.ToArray()).Show();

            return(new Vectors(list.Distinct().Where(n => !Double.IsNaN(n) && f(n).Abs <= eps && n >= beg && n <= end).ToArray()));
        }