Exemplo n.º 1
0
 /// <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);
     }
 }
Exemplo n.º 2
0
 /// <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);
 }
Exemplo n.º 3
0
        /// <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);
            };
        }
Exemplo n.º 4
0
        /// <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);
                }
            }
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
 /// <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);
 }