예제 #1
0
        // Modified Newton's method with LU decomposition
        public double[] ModifiedMethod()
        {
            Console.Out.Write("Модифицированный метод Ньютона :" + "\n");
            sw.Start();
            x.InitX();
            iter            = 0;
            numOfOperations = 0;
            //J = new SquareMatrix(InitializationExtension.InitJ(x),size);
            J = new SquareMatrix(InitializationExtension.InitializationJ(x), size);

            J.LUDecomposition();
            numOfOperations += J.numOfOperations;
            //J.Reverse();

            while (true)
            {
                iter++;
                norm = 0;
                //F.InitF(x);
                F1.InitializationF(x);
                for (int i = 0; i < size; i++)
                {
                    F[0, i] = F1[i];
                }
                var a = J.SolutionSystem(F1);
                for (int i = 0; i < size; i++)
                {
                    currentX[i] = a[0, i];
                }
                for (int i = 0; i < size; i++)
                {
                    xk1[i] = x[i] - currentX[i];

                    //norm += (xk1[i] - x[i]) * (xk1[i] - x[i]);

                    if (Math.Abs(xk1[i] - x[i]) > norm)
                    {
                        norm = Math.Abs(xk1[i] - x[i]);
                    }

                    x[i] = xk1[i];

                    numOfOperations += 5;
                }

                if (norm < eps)
                {
                    break;
                }
            }
            sw.Stop();
            Console.Out.Write("Количество итераций :" + iter + "\n");
            Console.Out.Write("Число арифметических операций :" + numOfOperations + "\n");
            Console.Out.Write("Затраченное время :" + sw.Elapsed + "\n");

            return(xk1);
        }
예제 #2
0
        // method with recounting reverse matrix every k iterations
        public double[] MethodWithRewriteRevMat()
        {
            int step = 7;

            Console.Out.Write("Поиск обратной матрицы каждые k = " + step + " итераций :" + "\n");


            x.InitX();
            //J = new SquareMatrix(InitializationExtension.InitJ(x),size);
            J = new SquareMatrix(InitializationExtension.InitializationJ(x), size);

            J.LUDecomposition();
            numOfOperations += J.numOfOperations;

            iter            = 0;
            numOfOperations = 0;
            sw.Start();
            while (true)
            {
                iter++;
                norm = 0;
                F1.InitializationF(x);
                for (int i = 0; i < size; i++)
                {
                    F[0, i] = F1[i];
                }
                if (iter % step == 1)
                {
                    //J = new SquareMatrix(InitializationExtension.InitJ(x),size);
                    J = new SquareMatrix(InitializationExtension.InitializationJ(x), size);

                    J.LUDecomposition();
                    numOfOperations += J.numOfOperations;

                    J.Reverse();
                }
                var a = J.SolutionSystem(F1);
                for (int i = 0; i < size; i++)
                {
                    currentX[i] = a[0, i];
                }

                for (int i = 0; i < size; i++)
                {
                    xk1[i] = x[i] - currentX[i];

                    //norm += (xk1[i] - x[i]) * (xk1[i] - x[i]);

                    if (Math.Abs(xk1[i] - x[i]) > norm)
                    {
                        norm = Math.Abs(xk1[i] - x[i]);
                    }

                    x[i] = xk1[i];

                    numOfOperations += 5;
                }

                if (norm < eps)
                {
                    break;
                }
            }
            sw.Stop();
            Console.Out.Write("Количество итераций :" + iter + "\n");
            Console.Out.Write("Число арифметических операций :" + numOfOperations + "\n");
            Console.Out.Write("Затраченное время :" + sw.Elapsed + "\n");
            return(xk1);
        }