/// <summary> /// Задать унитарную функции как произведение унитарной функции на комплексную матрицу /// </summary> /// <param name="M"></param> /// <param name="F"></param> public CkToCnFunc(CSqMatrix M, CkToCnFunc F) { this.FuncMas = new CnToCFunction[F.EDimention]; for (int i = 0; i < this.EDimention; i++) { this.FuncMas[i] = (CVectors v) => M.GetLine(i) * F.Value(v); } }
/// <summary> /// Перевод матрицы в массив System.Numerics.Complex /// </summary> /// <param name="mat"></param> /// <returns></returns> public static System.Numerics.Complex[,] ToSystemNumComplex(this CSqMatrix mat) { System.Numerics.Complex[,] mas = new System.Numerics.Complex[mat.ColCount, mat.ColCount]; for (int i = 0; i < mat.ColCount; i++) { for (int j = 0; j < mat.ColCount; j++) { mas[i, j] = new System.Numerics.Complex(mat[i, j].Re, mat[i, j].Im); } } return(mas); }
/// <summary> /// Задать унитарную функции как произведение унитарной функции на кматричную функцию /// </summary> /// <param name="M"></param> /// <param name="F"></param> public CkToCnFunc(CVecToCMatrix M, CkToCnFunc F) { this.FuncMas = null; func = (CVectors v) => { CSqMatrix Mat = M(v); CVectors Vec = F.Value(v); CVectors res = new CVectors(Vec.Degree); for (int i = 0; i < this.EDimention; i++) { res[i] = new Complex(Mat.GetLine(i) * Vec); } return(res); }; }
/// <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); }
/// <summary> /// Конструктор по матрице и свободному вектору /// </summary> /// <param name="M"></param> /// <param name="v"></param> public CSLAU(CSqMatrix M, CVectors v) { x = new CVectors(v.Degree); b = new CVectors(v); A = new CSqMatrix(M); }