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); } }
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})"); }
/// <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); }
/// <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); }; }
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(); }
/// <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())); }
/// <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())); }