public static bool Invertible(SquareMatrix q)
        {
            var a = new GaussMod();

            a.Init(q, null, false);

            return(a.IsSuccessfully());
        }
        static void MechanicalInit()
        {
            if (!mech)
            {
                mech = true;
                MechanicalGreeting();
                Table.Init();
                SetCell(f0, ff);
                SetLength(f0, Printer.f);
            }
            else
            {
                Reset();
            }

            FindGaussQuadrature();

            var f = new Vector(n);

            for (int i = 0; i < n; i++)
            {
                f[i] = F(node[i]);
            }

            var G = new SquareMatrix(n);

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    G[i, j] = -A[j] * K(node[i], node[j]);
                }
            }

            for (int i = 0; i < n; i++)
            {
                G[i, i] += 1;
            }

            un = GaussMod.Do(G, f, false);
        }
        static void DegenerateInit()
        {
            if (!degenerate)
            {
                degenerate = true;
                DegenerateGreeting();
                Table.Init();
                SetCell(f0, ff);
                SetLength(f0, Printer.f);
            }
            else
            {
                Reset();
            }

            var    H = SquareMatrix.Id(n);
            var    B = new Vector(n);
            double d = h / m;

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    for (int l = 0; l < m * m; l++)
                    {
                        H[i, j] -= d * Beta(i, a + (0.5 + l) * d)
                                   * Alpha(j, a + (0.5 + l) * d);
                    }
                }

                for (int l = 0; l < m * m; l++)
                {
                    B[i] += d * Beta(i, a + (0.5 + l) * d)
                            * F(a + (0.5 + l) * d);
                }
            }

            A = GaussMod.Do(H, B, false).X;
        }
Esempio n. 4
0
        static void Main(string[] args)
        {
            Init();
            Title          = "Task1.2";
            OutputEncoding = Encoding.GetEncoding(1251);

            Left("Рассмотрим исходную систему AX = B");

            var A = new SquareMatrix(6.5176E-06, -8.0648E-03, 4.23528,
                                     5.9176E-03, -0.80648, 1.46528,
                                     0.87176, 0.79352, 0.91528);

            var B = new Vector(3.61628, 1.52097, 1.81150);

            Right(A, B);

            var ord = GaussOrd.Do(A, B, true);
            var mod = GaussMod.Do(A, B, true);
            var det = SquareMatrix.Determinant(A, true);
            var inv = GaussMod.Invert(A, true);

            Line();

            var x = inv * B;

            AlwaysLeft("X = A^(-1) * B");
            AlwaysRight(x);
            Line();

            OutputResidual(A * x - B);
            Line();

            AlwaysLeft("Число обусловленности матрицы A (куб.)");
            AlwaysRight(A.Cond1);
            AlwaysLeft("Число обусловленности матрицы A (окт.)");
            AlwaysRight(A.Cond8);

            ReadKey();
        }
Esempio n. 5
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();
        }