/// <summary> /// Вычисление предела комплексной матричной функции в точке через окружности /// </summary> /// <param name="f">Функция</param> /// <param name="point">Точка, где нужно найти предел</param> /// <param name="begeps">Начальный радиус</param> /// <param name="count">Число усредняющихся точек</param> /// <returns></returns> public static CSqMatrix LimitCircle(Func <Complex, CSqMatrix> f, Complex point, double begeps = 0.1, int count = 10, int kmax = 40) { double h = 2 * Math.PI / (count - 1), arg; double[] cos = new double[count], sin = new double[count]; for (int i = 0; i < count; i++) { arg = i * h; cos[i] = Math.Cos(arg); sin[i] = Math.Sin(arg); } CSqMatrix[] mas = new CSqMatrix[count], tmp; CSqMatrix res = f(point + 2), sum; while (true) { for (int i = 0; i < count; i++) { mas[i] = f(new Complex(point.Re + begeps * cos[i], point.Im + begeps * sin[i])); } tmp = mas.Where(n => !Double.IsNaN(n.CubeNorm)).ToArray(); if (tmp.Length == 0) { return(res); } sum = new CSqMatrix(tmp[0]); for (int i = 1; i < tmp.Length; i++) { sum += tmp[i]; } sum /= tmp.Length; res = new CSqMatrix(sum); begeps /= 2; kmax--; if (kmax == 0) { return(res); } } }
/// <summary> /// Вычисление предела комплексной матричной функции в точке при случайном разбросе /// </summary> /// <param name="f">Функция</param> /// <param name="point">Точка, где нужно найти предел</param> /// <param name="radius">Радиус приближения</param> /// <param name="count">Число усредняющихся точек</param> /// <returns></returns> public static CSqMatrix LimitRandom(Func <Complex, CSqMatrix> f, Complex point, double radius = 0.01, int count = 100, bool onlyReplusAxis = true) { double p = 2 * Math.PI, ro, fi; CSqMatrix[] mas = new CSqMatrix[count]; CSqMatrix sum; Random r = new Random(); if (onlyReplusAxis) { for (int i = 0; i < count; i++) { ro = r.NextDouble() * radius; mas[i] = f(new Complex(point.Re + ro, point.Im)); } } else { for (int i = 0; i < count; i++) { ro = r.NextDouble() * radius; fi = r.NextDouble() * p; mas[i] = f(new Complex(point.Re + ro * Math.Cos(fi), point.Im + ro * Math.Sin(fi))); } } mas = mas.Where(n => !Double.IsNaN(n.CubeNorm)).ToArray(); if (mas.Length == 0) { return(LimitRandom(f, point, radius * 2, count, onlyReplusAxis)); } sum = new CSqMatrix(mas[0]); for (int i = 1; i < mas.Length; i++) { sum += mas[i]; } (sum / mas.Length).Show(); return(sum / mas.Length); }