public static void Jacobi(SquareMatrix q, double e, bool write) { if (write) { Start("Найдём все собственные числа и вектора", "методом Якоби", " с заданной погрешностью", e); } A = q.DeepClone; int n = A.Rows; SquareMatrix X = Id(n); while (true) { double max = 0; int mi = 0, mj = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if ((i != j) & (Abs(A[i, j]) > max)) { max = Abs(A[i, j]); mi = i; mj = j; } } } if (max < e) { JacobiEnd(q, X.T); return; } double d = Sqrt((A[mi, mi] - A[mj, mj]) * (A[mi, mi] - A[mj, mj]) + 4 * A[mi, mj] * A[mi, mj]); double ds = Sqrt(0.5 * (1 + Abs(A[mi, mi] - A[mj, mj]) / d)); double dc = Sign(A[mi, mj] * (A[mi, mi] - A[mj, mj])) * Sqrt(0.5 * (1 - Abs(A[mi, mi] - A[mj, mj]) / d)); var L = new SquareMatrix(n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if ((i == j) & (j != mi) & (j != mj)) { L[i, j] = 1; } else if ((i != mj) & (i != mi) & (j != mj) & (j != mi)) { L[i, j] = 0; } else if ((i == mi) & (j == mi)) { L[i, j] = dc; } else if ((i == mj) & (j == mj)) { L[i, j] = dc; } else if ((i == mi) & (j == mj)) { L[i, j] = ds; } else if ((i == mj) & (j == mi)) { L[i, j] = -ds; } } } X = X * L; SquareMatrix B = A.DeepClone; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if ((i == mi) & (j == mj)) { B[i, j] = 0; } else if ((i == mj) & (j == mi)) { B[i, j] = 0; } else if ((i == mi) & (j != mj) & (j != mi)) { B[i, j] = dc * A[j, mi] - ds * A[j, mj]; } else if ((i != mj) & (i != mi) & (j == mi)) { B[i, j] = dc * A[i, mi] - ds * A[i, mj]; } else if ((i == mj) & (j != mi) & (j != mj)) { B[i, j] = ds * A[j, mi] + dc * A[j, mj]; } else if ((i != mi) & (i != mj) & (j == mj)) { B[i, j] = ds * A[i, mi] + dc * A[i, mj]; } else if ((i == mi) & (j == mi)) { B[i, j] = dc * dc * A[mi, mi] - 2 * ds * dc * A[mi, mj] + ds * ds * A[mj, mj]; } else if ((i == mj) & (j == mj)) { B[i, j] = ds * ds * A[mi, mi] + 2 * ds * dc * A[mi, mj] + dc * dc * A[mj, mj]; } else { B[i, j] = A[i, j]; } } } A = B; } }
public static T Do <T>(SquareMatrix q, T t, bool write) where T : class, IMatrix { return(new GaussMod().Start(q, t, write)); }
protected override void Init(SquareMatrix q, IMatrix t, bool write) { base.Init(q, t, write); index = new int[n]; }
static void Main(string[] args) { Init(); Title = "Task2 Итерационные методы решения линейных систем"; OutputEncoding = Encoding.GetEncoding(1251); var A = new SquareMatrix(100, 6, 2, 2, 100, 5, 3, 4, 100); var B = new Vector(60, 70, 80); Left("Рассмотрим исходную систему AX = B"); Right(A, B); if (!CheckConvergenceCondition(A)) { return; } xGauss = GaussMod.Do(A, B, false); Left("Решение модифицированным методом Гаусса"); Right(xGauss); OutputResidual(A * xGauss - B); Line(); var D = A.DiagonalInvert(); var H = Id(A.Rows) - D * A; var g = D * B; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i != j) { H[i, j] = 1 / System.Math.Pow(2, System.Math.Abs(i - j) + 1); } else { H[i, j] = 0; } } } g = new Vector(3); for (int i = 0; i < 3; i++) { g[i] = 1; } Left("Приведём систему к виду X = HX + G"); Right(H, g); Iteration.A = A; Iteration.B = B; FixedPoint(H, g, steps); FixedPoint(H, g, e); Seidel(H, g, steps); Seidel(H, g, e); SuccessiveOverRelaxation(H, g, steps); ReadKey(); }
public static bool DiagonallyDominant(this SquareMatrix q) { return(q.X.Select((x, i) => 2 * x[i] - x.N8).All(x => x > 0)); }
public static bool Seidel(SquareMatrix q, Vector u, double e) { return(new Iteration(q, u, e).SeidelByE()); }
public static void SuccessiveOverRelaxation(SquareMatrix q, Vector u, int steps) { new Iteration(q, u, steps).SuccessiveOverRelaxationBySteps(); }
public static bool Seidel(SquareMatrix q, Vector u, int steps) { return(new Iteration(q, u, steps).SeidelBySteps()); }
public static bool FixedPoint(SquareMatrix q, Vector u, int steps) { return(new Iteration(q, u, steps).FixedPointBySteps()); }
public static bool FixedPoint(SquareMatrix q, Vector u, double e) { return(new Iteration(q, u, e).FixedPointByE()); }
Iteration(SquareMatrix q, Vector u, int steps) : this(q, u) { this.steps = steps; }
Iteration(SquareMatrix q, Vector u, double e) : this(q, u) { this.e = e; }