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];
        }
Example #4
0
        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;
 }