protected IVector MultT(IVector x, bool UseDiagonal) { int j; IVector result = new SimpleVector(Size); if (UseDiagonal) { for (int i = 0; i < this.Size; i++) { result[i] = di[i] * x[i]; } } for (int i = 0; i < this.Size; i++) { { for (int k = ig[i]; k < ig[i + 1]; k++) { j = jg[k]; result[j] += al[k] * x[i]; result[i] += au[k] * x[j]; } } } return(result); }
protected IVector SolveUT(IVector x, bool UseDiagonal) { //проверка корректности if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveUT"); } else { IVector result = new SimpleVector(this.Size); double sum; for (int i = 0; i < this.Size; i++) { sum = 0; for (int j = ig[i]; j < ig[i + 1]; j++) { sum += au[j] * result[jg[j]]; } result[i] = (x[i] - sum); if (UseDiagonal == true) { if (extraDiagVal == 0) { result[i] /= di[i]; } else { result[i] /= extraDiagVal; } } } return(result); } }
public IVector MultU(IVector x, bool UseDiagonal) { if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultU"); } else { IVector result = new SimpleVector(Size); for (int i = 0; i < Size; i++) { if (UseDiagonal == true) { if (extraDiagVal == 0) { result[i] = di[i] * x[i]; } else { result[i] = extraDiagVal * x[i]; } } for (int j = ig[i]; j < ig[i + 1]; j++) { result[jg[j]] += au[j] * x[i]; } } return(result); } }
public void normVector() { double[] x = new double[] { 1, 2, 3 }; IVector v = new SimpleVector(x); Assert.AreEqual(v.Norm, Math.Sqrt(14)); }
public IVector Mult(IVector x, bool UseDiagonal) { //проверка на корректное умножение (размеры вектора и матрицы) //допустим все корректно int j; IVector result = new SimpleVector(Size); if (UseDiagonal) { for (int i = 0; i < this.Size; i++) { result[i] = di[i] * x[i]; } } for (int i = 0; i < this.Size; i++) { { for (int k = ig[i]; k < ig[i + 1]; k++) { j = jg[k]; result[i] += al[k] * x[j]; result[j] += au[k] * x[i]; } } } return(result); }
public void createVector() { double[] x = new double[] { 1, 2, 3 }; IVector v = new SimpleVector(x); Assert.IsNotNull(v); }
public IVector Mult(IVector x, bool UseDiagonal = true) { if (this.Size != x.Size) { throw new DifferentSizeException("Размерность матрицы не совпадает с размерностью вектора."); } IVector result = new SimpleVector(Size); if (UseDiagonal) { for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { result[i] += d_matrix[i, j] * x[j]; } } } else { for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { if (i != j) { result[i] += d_matrix[i, j] * x[j]; } } } } return(result); }
/// <summary> /// /// </summary> /// <param name="x"></param> /// <param name="UseDiagonal">различие в делении на диагональ</param> /// <returns></returns> public IVector SolveL(IVector x, bool UseDiagonal) { //проверка корректности if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveL"); } else { IVector result = new SimpleVector(this.Size); double sum; for (int i = 0; i < this.Size; i++) { sum = 0; for (int j = ig[i]; j < ig[i + 1]; j++) { sum += al[j] * result[jg[j]]; } result[i] = (x[i] - sum); if (UseDiagonal == true) { result[i] /= di[i]; } } return(result); } // можно было сделать главное условие if(UseDiagonal==true) и разбиение на два цикла, но так компактнее }
public IVector MultL(IVector x, bool UseDiagonal = true) { if (this.Size != x.Size) { throw new DifferentSizeException("Размерность матрицы не совпадает с размерностью вектора."); } IVector result = new SimpleVector(Size); if (UseDiagonal) { if (extraDiagVal == 0) { for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { //нижний треугольник с диагональю if (i >= j) { result[i] += d_matrix[i, j] * x[j]; } } } } else { for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { if (i > j) { result[i] += d_matrix[i, j] * x[j]; continue; } //диагональ if (i == j) { result[i] += extraDiagVal * x[j]; } } } } } else { for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { if (i > j) { result[i] += d_matrix[i, j] * x[j]; } } } } return(result); }
public IVector SolveU(IVector x, bool UseDiagonal = true) { IVector result = new SimpleVector(Size); if (!UseDiagonal) { if (Math.Abs(x[Size - 1]) < EQU_TO_ZERO) { result[Size - 1] = 0; } else { throw new SlaeNotCompatipableException("Система неразрешима."); } } for (int i = Size - 1; i >= 0; i--) { int line_length = Size - i; result[i] = x[i]; for (int j = i + 1; j < Size; j++) { result[i] -= result[j] * this[i, j]; } try { result[i] /= this[i, i]; } catch (DivideByZeroException) { throw new SlaeNotCompatipableException("Произошло деление на ноль."); } } return(result); }
protected IVector MultT(IVector x, bool UseDiagonal) { int j; if (this.Size != x.Size) { throw new Exception("Ошибка. Различие в размерности вектора и матрицы в функции Mult"); } IVector result = new SimpleVector(Size); if (this.isSymmetric) { result = Mult(x, UseDiagonal); } else { for (int i = 0; i < this.Size; i++) { for (int k = ig[i]; k < ig[i + 1]; k++) { j = jg[k]; if (j != i) { result[j] += al[k] * x[i]; } else if (UseDiagonal) { result[i] += al[k] * x[j]; } } } } return(result); }
protected IVector MultUT(IVector x, bool UseDiagonal) { if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultUT"); } else { int jCol; IVector result = new SimpleVector(this.Size); for (int i = 0; i < Size; i++) { for (int j = ig[i]; j < ig[i + 1]; j++) { jCol = jg[j]; if (i == jCol && UseDiagonal) { if (extraDiagVal == 0) { result[i] += al[i] * x[i]; } else { result[i] = extraDiagVal * x[i]; } break; } result[i] += al[j] * x[jCol]; } } return(result); } }
protected IVector MultT(IVector x, bool UseDiagonal) { if (this.Size != x.Size) { throw new DifferentSizeException("Не удалось выполнить LU-разложение"); } IVector result = new SimpleVector(Size); if (UseDiagonal) { for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { result[i] += d_matrix[j, i] * x[j]; } } } else { for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { if (i != j) { result[i] += d_matrix[j, i] * x[j]; } } } } return(result); }
public IVector MultL(IVector x, bool UseDiagonal) { if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultL"); } else { int jCol; var di = this.Diagonal; IVector result = new SimpleVector(this.Size); for (int i = 0; i < Size; i++) { if (UseDiagonal == true) { result[i] = di[i] * x[i]; } for (int j = ig[i]; j < ig[i + 1]; j++) { jCol = jg[j]; if (jCol < i) { result[i] += al[j] * x[jCol]; } else { break; } } } return(result); } }
protected IVector SolveUT(IVector x, bool UseDiagonal = true) { IVector result = new SimpleVector(Size); if (!UseDiagonal) { if (Math.Abs(x[0]) < EQU_TO_ZERO) { result[0] = 0; } else { throw new SlaeNotCompatipableException("Система неразрешима."); } } for (int i = 0; i < Size; i++) { result[i] = x[i]; for (int j = 0; j < i; j++) { result[i] -= result[j] * this[j, i]; } try { result[i] /= this[i, i]; } catch (DivideByZeroException) { throw new SlaeNotCompatipableException("Произошло деление на ноль."); } } return(result); }
public void wrongSize() { Assert.ThrowsException <WrongSizeException>(() => { IVector v = new SimpleVector(-10); } ); }
public void multVector() { double[] x = new double[] { 1, 2, 3 }; IVector v = new SimpleVector(x); double resultRight = 14; double result = v.ScalarMult(v); Assert.IsTrue(result == resultRight); }
public void addVector() { double[] x = new double[] { 1, 2, 3 }; double[] xx = new double[] { 2, 4, 6 }; IVector v = new SimpleVector(x); IVector resultRight = v.Add(v, 1, 1); IVector result = new SimpleVector(xx); Assert.IsTrue(result.CompareWith(resultRight, 1e-9)); }
public IVector MultD(IVector a) { IVector result = new SimpleVector(Size); for (int i = 0; i < this.Size; i++) { result[i] = a[i] * this[i, i]; } return(result); }
public IVector MultD(IVector a) { IVector di = this.Diagonal; IVector result = new SimpleVector(Size); for (int i = 0; i < Size; i++) { result[i] = a[i] * di[i]; } return(result); }
public IVector SolveD(IVector x) { if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveD"); } IVector result = new SimpleVector(Size); for (int i = 0; i < Size; i++) { result[i] = x[i] / di[i]; } return(result); }
/// <summary> /// Усножение вектора на диагональ матрицы (диагональную матрицу) /// </summary> /// <param name="a">Умножаемый вектор</param> public IVector SolveD(IVector a) { if (this.Size != a.Size) { throw new DifferentSizeException("Размерность матрицы не совпадает с размерностью вектора."); } IVector result = new SimpleVector(Size); for (int i = 0; i < Size; i++) { result[i] = a[i] / this[i, i]; } return(result); }
public IVector MultU(IVector x, bool UseDiagonal) { if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultU"); } else { int jCol; IVector result = new SimpleVector(Size); if (this.isSymmetric) { result = this.MultLT(x, UseDiagonal); } else { for (int i = 0; i < Size; i++) { if (UseDiagonal == true) { var di = this.Diagonal; if (extraDiagVal == 0) { result[i] = di[i] * x[i]; } else { result[i] = x[i]; } } for (int j = ig[i + 1] - 1; j >= ig[i]; j--) { jCol = jg[j]; if (jCol > i) { result[i] += al[j] * x[jCol]; } else { break; } } } } return(result); } }
public void testSparseRowColumnMatrix() { //(int, int)[] coord = new(int, int)[64]; double[] di = new double[8] { 3, 5, 6, 5, 7, 9, 11, 11 }; int[] ig = new int[9] { 1, 1, 2, 3, 3, 5, 7, 8, 9 }; //Индексы начала строк int[] jg = new int[8] { 1, 1, 2, 4, 3, 5, 6, 5 }; //Номера столбцов для элементов double[] al = new double[8] { -1, 1, 3, 3, -2, 2, 1, 4 }; //Элементы нижней диагонали double[] au = new double[8] { 2, 8, 10, 12, -7, 3, 4, 1 }; //Элементы верхней диагонал // //double[] val = new double[64] { 3, 2, 8, 0, 0, 0, 0, 0, // -1, 5, 0, 0, 10, 0, 0, 0, // 1, 0, 6, 0, 0, -7, 0, 0, // 0, 0, 0, 5, 12, 0, 0, 0, // 0, 3, 0, 3, 7, 3, 0, 1, // 0, 0, -2, 0, 2, 9, 4, 0, // 0, 0, 0, 0, 0, 1, 11, 0, // 0, 0, 0, 0, 4, 0, 0, 11 }; //for (int i = 0; i < 64; i++) //{ // coord[i] = (i / 8, i % 8); //} IMatrix matr = new SparseRowColumnMatrix(ig, jg, di, al, au); IVector x = new SimpleVector(new double[8] { 1, 2, 3, 4, 5, 6, 7, 8 }); IVector result = matr.Mult(x); IVector right = new SimpleVector(new double[8] { 31, 59, -23, 80, 79, 86, 83, 108 }); Assert.IsTrue(result.CompareWith(right, 1e-5)); }
protected IVector SolveLT(IVector x, bool UseDiagonal = true) { IVector result = new SimpleVector(Size); for (int i = 0; i < Size; i++) { result[i] = x[i]; } if (!UseDiagonal) { if (Math.Abs(x[Size - 1]) < EQU_TO_ZERO) { result[Size - 1] = 0; } else { throw new SlaeNotCompatipableException("Система неразрешима."); } return(null); } for (int i = Size - 1; i >= 0; i--) { int line_length = i; try { if (extraDiagVal == 0) { result[i] /= this[i, i]; } else { result[i] /= extraDiagVal; } } catch (DivideByZeroException) { throw new SlaeNotCompatipableException("Произошло деление на ноль."); } for (int j = 0; j < line_length; j++) { result[j] -= result[i] * this[i, j]; } } return(result); }
public static void localtest() { double[,] val = new double[4, 4] { { 1, 4, 4, 4 }, { 1, 1, 3, 3 }, { 1, 1, 1, 2 }, { 1, 1, 1, 1 } }; IMatrix mar = new DenseMatrix(val); IPreconditioner pre = new LUPreconditioner(mar); IVector x = new SimpleVector(new double[4] { 1, 2, 3, 4 }); IVector y = mar.Mult(x, true); //should be { 37, 24, 14, 10 } y = pre.MultL(x); //shold be { 1, 3, 6, 10 } y = pre.MultU(x); //shold be { 37, -13, -10, -4 } IVector z = (IVector)y.Clone(); //should do not crash z = pre.SolveL(x); //should be { 1, 1, 1, 1 } z = pre.SolveU(x); //should be { 13, 0.5, 0.5, -4 } IVector ut = mar.T.MultU(x); //should be { 1, 6, 13, 20 } ut = mar.T.MultU(x, false); //should be { 0, 4, 10, 16 } IVector lt = mar.T.MultL(x); //should be { 10, 9, 7, 4 } }
public static void localtest() { Dictionary <string, string> pathFiles = new Dictionary <string, string> { { "ig", "./ig.txt" }, { "jg", "./jg.txt" }, { "al", "./al.txt" }, }; double[] vecval = new double[3] { 3, 2, 2 }; SparseRowMatrix s_matr = new SparseRowMatrix(pathFiles); s_matr.CastToNotSymm(); IVector newV = new SimpleVector(vecval); IVector mult = s_matr.MultL(newV, true); IVector multTT = s_matr.MultU(newV, true); }
private void BTN_Renumber_Click(object sender, RoutedEventArgs e) { Random rnd = new Random(); new UtilCommand(this, new SimpleVector <int>(rnd.Next(0, matr.nCol()), rnd.Next(0, matr.nCol()), rnd.Next(0, matr.nRow()), rnd.Next(0, matr.nRow())), (MainWindow mw, object val) => { SimpleVector <int> vec = (SimpleVector <int>)val; ReAssignMatrix <int> mx; mx = mw.matr is ReAssignMatrix <int>?(ReAssignMatrix <int>)mw.matr: new ReAssignMatrix <int>(mw.matr); if (vec.Get(0) != -1 && vec.Get(1) != -1) { mx.SwapCols(vec.Get(0), vec.Get(1)); } if (vec.Get(2) != -1 && vec.Get(3) != -1) { mx.SwapRows(vec.Get(2), vec.Get(3)); } mw.ApplyMatrix(mx); return(true); } ).Execute(); }
/// <summary> /// /// </summary> /// <param name="x"></param> /// <param name="UseDiagonal">различие в делении на диагональ</param> /// <returns></returns> public IVector SolveL(IVector x, bool UseDiagonal) { //проверка корректности if (this.Size != x.Size) { throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveL"); } else { IVector result = new SimpleVector(this.Size); double sum; int jCol; var di = this.Diagonal; for (int i = 0; i < this.Size; i++) { sum = 0; for (int j = ig[i]; j < ig[i + 1]; j++) { jCol = jg[j]; if (jCol < i) { sum += al[j] * result[jCol]; } else { break; } } result[i] = (x[i] - sum); if (UseDiagonal == true) { result[i] /= di[i]; } } return(result); } }
public static bool SisFrom(string vs, string ws, bool vToW, out bool ortogonal, out bool ortonormal, out double p, out SimpleVector <double> pV, out double ev, out double ew) { SimpleVector <double> v1, w1; if (VectorUtils.TryParseToVector(vs.Trim(), out v1) && VectorUtils.TryParseToVector(ws.Trim(), out w1) && v1.Size == w1.Size) { ev = v1.Sum(vl => System.Math.Pow(vl, 2)); ew = w1.Sum(wl => System.Math.Pow(wl, 2)); var v = vToW ? v1 : w1; var w = !vToW ? v1 : w1; var vMw = System.Math.Abs(v * w); var vMv = System.Math.Abs(v * v); ortogonal = vMw <= 0; ortonormal = ortogonal && (System.Math.Abs(vMv - 1) <= 0 && System.Math.Abs(w * w - 1) <= 0); p = vMw / vMv; p *= 100; p = System.Math.Round(p, 2); p /= 100; pV = p * v; pV.Round(2); return(true); } p = 0; pV = null; ev = 0; ew = 0; ortogonal = false; ortonormal = false; return(false); }