コード例 #1
0
ファイル: CSqMatrix.cs プロジェクト: PasaOpasen/MathClasses
        /// <summary>
        /// Замена колонны указанным вектором (для метода Крамера)
        /// </summary>
        /// <param name="ColumnNumber">Номер колонны</param>
        /// <param name="newColumn">Новая колонна</param>
        /// <returns></returns>
        public CSqMatrix ColumnSwap(int ColumnNumber, CVectors newColumn)
        {
            SqMatrix R = this.Re.ColumnSwap(ColumnNumber, newColumn.Re);
            SqMatrix I = this.Im.ColumnSwap(ColumnNumber, newColumn.Im);

            return(new CSqMatrix(R, I));
        }
コード例 #2
0
ファイル: CSqMatrix.cs プロジェクト: PasaOpasen/MathClasses
        /// <summary>
        /// Характеристический многочлен заданной матрицы
        /// </summary>
        /// <param name="M"></param>
        /// <returns></returns>
        private static CVectors CharactPol(CSqMatrix M)
        {
            CVectors p = new CVectors(M.ColCount + 1);

            Complex   sum;
            CSqMatrix A = new CSqMatrix(M);

            //заполнение массива треков
            Complex[] tr = new Complex[A.ColCount];
            for (int i = 0; i < A.ColCount; i++)
            {
                tr[i] = A.Track;
                A    *= M;
            }

            p[p.Degree - 1] = 1 * Math.Pow(-1, A.ColCount);
            int k = 0;

            for (int i = p.Degree - 2; i >= 0; i--)
            {
                sum = 0; k++;
                for (int j = 0; j < k; j++)
                {
                    sum += tr[k - j - 1] * p[p.Degree - j - 1];
                }
                sum *= -1;
                sum /= k;
                p[i] = new Complex(sum);
            }

            return(p);
        }
コード例 #3
0
ファイル: CSqMatrix.cs プロジェクト: PasaOpasen/MathClasses
 /// <summary>
 /// Отнять от строки матрицы вектор
 /// </summary>
 /// <param name="i"></param>
 /// <param name="c"></param>
 public void MinusVector(int i, CVectors c)
 {
     for (int j = 0; j < this.ColCount; j++)
     {
         matr[i, j] -= c[j];
     }
 }
コード例 #4
0
        /// <summary>
        /// Сумма ряда от -inf до inf
        /// </summary>
        /// <param name="f">Функция, сопоставляющая член ряда номеру</param>
        /// <param name="eps">Точность</param>
        /// <param name="ndo">Минимальное количество членов, которые должны быть суммированы в одну сторону</param>
        /// <returns></returns>
        public static CVectors Sum(Func <int, CVectors> f, double eps = 1e-8, int ndo = 10)
        {
            Func <int, CVectors> f2 = (int n) => f(-n);
            CVectors             sum1 = null, sum2 = null;

            Parallel.Invoke(() => sum1 = Sum(0, f, eps, ndo), () => sum2 = Sum(1, f2, eps, ndo));
            return(sum1 + sum2);
        }
コード例 #5
0
ファイル: CSqMatrix.cs プロジェクト: PasaOpasen/MathClasses
        /// <summary>
        /// Вернуть столбец матрицы
        /// </summary>
        /// <param name="k">Номер столбца, начиная от 0</param>
        /// <returns></returns>
        public CVectors GetColumn(int k)
        {
            CVectors ew = new CVectors(this.RowCount);

            for (int i = 0; i < ew.Degree; i++)
            {
                ew[i] = new Complex(this[i, k]);
            }
            return(ew);
        }
コード例 #6
0
ファイル: CSqMatrix.cs プロジェクト: PasaOpasen/MathClasses
        /// <summary>
        /// Вернуть строку матрицы
        /// </summary>
        /// <param name="k">Номер строки, начиная от 0</param>
        /// <returns></returns>
        public CVectors GetLine(int k)
        {
            CVectors ew = new CVectors(this.ColCount);

            for (int i = 0; i < ew.Degree; i++)
            {
                ew[i] = new Complex(this[k, i]);
            }
            return(ew);
        }
コード例 #7
0
        /// <summary>
        /// Сумма бесконечного ряда
        /// </summary>
        /// <param name="n0">Начальный номер члена ряда</param>
        /// <param name="f">Функция, сопоставляющая член ряда номеру</param>
        /// <param name="eps">Точность</param>
        /// <param name="ndo">Минимальное количество членов, которые должны быть суммированы</param>
        /// <returns></returns>
        public static CVectors Sum(int n0, Func <int, CVectors> f, double eps = 1e-8, int ndo = 10, int ndomax = 1000)
        {
            CVectors sum  = Sum(n0, n0 + ndo, f);
            int      i    = 1;
            CVectors sum2 = new CVectors(sum.Degree);
            CVectors tmp  = f(n0 + ndo + i);

            do
            {
                sum2 += tmp;
                i++;
                tmp = f(ndo + i);
            }while (tmp.Abs >= eps && i + ndo <= ndomax);
            return(sum + sum2);
        }
コード例 #8
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);
            };
        }
コード例 #9
0
ファイル: CSqMatrix.cs プロジェクト: PasaOpasen/MathClasses
        /// <summary>
        /// Выдаёт индекс строки, содержащей максимальный элемент по столбцу column в диапазоне rowbeg...column.Len
        /// </summary>
        /// <param name="rowbeg"></param>
        /// <param name="column"></param>
        /// <returns></returns>
        private int MaxLine(int rowbeg, int column)
        {
            CVectors v = this.GetColumn(column);
            double   max = v[rowbeg].Abs, tmp;
            int      k = rowbeg;

            for (int i = rowbeg + 1; i < v.Degree; i++)
            {
                tmp = v[i].Abs;
                if (tmp > max)
                {
                    max = tmp;
                    k   = i;
                }
            }
            return(k);
        }
コード例 #10
0
        /// <summary>
        /// Сумма частичного ряда
        /// </summary>
        /// <param name="n0">Начальный номер члена ряда</param>
        /// <param name="nmax">Конечный номер члена ряда</param>
        /// <param name="f">Функция, сопоставляющая член ряда по номеру</param>
        /// <returns></returns>
        public static CVectors Sum(int n0, int nmax, Func <int, CVectors> f)
        {
            int tmp = nmax - n0 + 1;

            CVectors[] mas = new CVectors[tmp];
            for (int i = 0; i < tmp; i++)
            {
                mas[i] = f(n0 + i);
            }
            Array.Sort(mas);
            CVectors sum = new CVectors(mas[0].Degree);

            for (int i = 0; i < sum.Degree; i++)
            {
                sum += mas[i];
            }
            return(sum);
        }
コード例 #11
0
ファイル: CSqMatrix.cs プロジェクト: PasaOpasen/MathClasses
        public static CVectors operator *(CSqMatrix A, CVectors x)
        {
            CVectors res = new CVectors(x.Degree);

            for (int i = 0; i < res.Degree; i++)
            {
                for (int j = 0; j < res.Degree; j++)
                {
                    res[i] += A[i, j] * x[j];
                }
            }
            return(res);

            //if (A.ColCount != x.Degree) throw new Exception("Размерность матрицы и вектора не совпадают");
            //CVectors res = new CVectors(x.Degree);
            //for (int i = 0; i < res.Degree; i++)
            //    res[i] = A.GetLine(i) * x;
            //return res;
        }
コード例 #12
0
 /// <summary>
 /// Значение функции от вектора через индексатор
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public CVectors this[CVectors v]
 {
     get
     {
         if (func == null)
         {
             CVectors res = new CVectors(EDimention);
             for (int i = 0; i < EDimention; i++)
             {
                 res[i] = FuncMas[i](v);
             }
             return(res);
         }
         else
         {
             return(func(v));
         }
     }
 }
コード例 #13
0
        /// <summary>
        /// Значение функции от вектора
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        public CVectors Value(params Complex[] c)
        {
            CVectors v = new CVectors(c);

            return(this[v]);
        }
コード例 #14
0
 /// <summary>
 /// Метод, возвращающий значение функции от вектора
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public CVectors Value(CVectors v) => this[v];
コード例 #15
0
 /// <summary>
 /// Интеграл от отображения по одному аргументу (другие зафиксированы)
 /// </summary>
 /// <param name="beforeArg">Фиксированные аргументы до изменяемого</param>
 /// <param name="afterArg">Фиксированные аргументы после изменяемого</param>
 /// <param name="t1"></param>
 /// <param name="t2"></param>
 /// <param name="t3"></param>
 /// <param name="t4"></param>
 /// <param name="tm"></param>
 /// <param name="tp"></param>
 /// <param name="eps"></param>
 /// <param name="pr"></param>
 /// <param name="gr"></param>
 /// <returns></returns>
 public CVectors IntegralAmoutOneArg(CVectors beforeArg, CVectors afterArg, double t1, double t2, double t3, double t4, double tm, double tp, double eps, double pr, double gr)
 {
     FuncMethods.DefInteg.GaussKronrod.ComplexVectorFunc tmp = (Complex x, int N) => this.Value(Expendator.Union(beforeArg.ComplexMas, new Complex[] { x }, afterArg.ComplexMas)).ComplexMas;
     return(new CVectors(FuncMethods.DefInteg.GaussKronrod.DINN5_GK(tmp, t1, t2, t3, t4, tm, tp, eps, pr, gr, this.EDimention)));
 }
コード例 #16
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);
 }