/// <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)); }
/// <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); }
/// <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]; } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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> /// Выдаёт индекс строки, содержащей максимальный элемент по столбцу 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); }
/// <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); }
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; }
/// <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)); } } }
/// <summary> /// Значение функции от вектора /// </summary> /// <param name="c"></param> /// <returns></returns> public CVectors Value(params Complex[] c) { CVectors v = new CVectors(c); return(this[v]); }
/// <summary> /// Метод, возвращающий значение функции от вектора /// </summary> /// <param name="v"></param> /// <returns></returns> public CVectors Value(CVectors v) => this[v];
/// <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))); }
/// <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); }