Exemple #1
0
        static void Task_3()
        {
            #region  ешение скалярного уравнения
            Console.WriteLine("ScalarEquation: x - sin(x) = 0.25");
            ScalarFunk1 func1    = (double X) => (X - Math.Sin(X) - 0.25);
            ScalarFunk1 funcDer1 = (double X) => (1 - Math.Cos(X));
            double      a1       = 0.0;
            double      b1       = 17.5;
            Console.WriteLine("Mode: Difference");
            var diff_results1 = MethodNewton_Scalar.DifferenceMethod(a1, b1, func1);
            PrintResult(diff_results1);
            Console.WriteLine("Mode: Simplified");
            var sim_results1 = MethodNewton_Scalar.SimplifiedMethod(a1, b1, func1, funcDer1);
            PrintResult(sim_results1);
            Console.WriteLine("Mode: Defualt");
            var def_results1 = MethodNewton_Scalar.DefualtMethod(a1, b1, func1, funcDer1);
            PrintResult(def_results1);

            Console.WriteLine("\nScalarEquation: x^3 = e^x - 1");
            ScalarFunk1 func2    = (double X) => (Math.Pow(X, 3) - Math.Pow(Math.E, X) + 1);
            ScalarFunk1 funcDer2 = (double X) => (3 * Math.Pow(X, 2) - Math.Pow(Math.E, X));
            double      a2       = -2.0;
            double      b2       = 2.0;
            Console.WriteLine("Mode: Difference");
            var diff_results2 = MethodNewton_Scalar.DifferenceMethod(a2, b2, func2);
            PrintResult(diff_results2);
            Console.WriteLine("Mode: Simplified");
            var sim_results2 = MethodNewton_Scalar.SimplifiedMethod(a2, b2, func2, funcDer2);
            PrintResult(sim_results2);
            Console.WriteLine("Mode: Defualt");
            var def_results2 = MethodNewton_Scalar.DefualtMethod(a2, b2, func2, funcDer2);
            PrintResult(def_results2);
            #endregion

            #region  ешение СНАУ
            Console.WriteLine("\nSNAU________________________________________________");
            //Задаём вектор функций системы
            var vectorFunks = new ScalarFunk1_N[10];
            InitVectorFunks(vectorFunks);

            //Задём матрицу Якоби системы
            var matrixFunks = new ScalarFunk1_N[10][];
            InitMatrixFunks(matrixFunks);

            //Задаём стартовое приближение
            var vectorStart = new Vector(vectorFunks.Length);
            //x5 = -0.5 | -0.2
            vectorStart.SetValues(new double[] { 0.5, 0.5, 1.5, -1.0, -0.2, 1.5, 0.5, -0.5, 1.5, -1.5 });
            Console.Write("Vector start: ");
            vectorStart.Show();

            //Кол-во прераций на LUP и СЛАУ
            var countMathOper_LUP  = (matrixFunks.Length * matrixFunks.Length * (matrixFunks.Length + 1)) / 2;
            var countMathOper_SLAU = matrixFunks.Length * (2 * matrixFunks.Length + 5);

            //Инструмент для подсчёта времени
            var stopWatch = new Stopwatch();

            RunnigStopWatch(stopWatch);
            //Console.WriteLine($"Time: {stopWatch.ElapsedMilliseconds} milliseconds");
            stopWatch.Reset();

            //Чистый дефолтный метод Ньютона
            Console.WriteLine("\nSingle: #Defualt_method");
            var vectorResultDef_pair = MethodNewton_SNAU.Defualt_withSLAU(vectorStart, matrixFunks, vectorFunks, stopWatch);
            Console.WriteLine($"Time: {stopWatch.ElapsedTicks} ticks");
            Console.WriteLine("Count math.operation: " +
                              $"{(countMathOper_LUP + countMathOper_SLAU + 10) * vectorResultDef_pair.SecondElement}");
            Console.WriteLine($"Count iter: {vectorResultDef_pair.SecondElement}");
            Console.Write("Result vector: ");
            vectorResultDef_pair.FirstElement.Show();
            Console.Write("Check vector: ");
            var checkVec_def = new Vector(vectorFunks.Length);
            checkVec_def.SetValueByFunks(vectorFunks, vectorResultDef_pair.FirstElement.data);
            checkVec_def.Show();

            //stopWatch.Reset();

            //Чистый модифицированный метод Ньютона
            Console.WriteLine("\nSingle: #Modified_Method");
            var vectorResultMod_pair = MethodNewton_SNAU.Modified_withSLAU(vectorStart, matrixFunks, vectorFunks, stopWatch);
            Console.WriteLine($"Time: {stopWatch.ElapsedTicks} ticks");
            Console.WriteLine("Count math.operation: " +
                              $"{countMathOper_LUP + (countMathOper_SLAU + 10) * vectorResultMod_pair.SecondElement}");
            Console.WriteLine($"Count iter: {vectorResultMod_pair.SecondElement}");
            Console.Write("Result vector: ");
            vectorResultMod_pair.FirstElement.Show();
            Console.Write("Check vector: ");
            var checkVec_mod = new Vector(vectorFunks.Length);
            checkVec_mod.SetValueByFunks(vectorFunks, vectorResultMod_pair.FirstElement.data);
            checkVec_mod.Show();

            stopWatch.Reset();

            //Чистый гибридный метод Ньютона
            Console.WriteLine("\nSingle: #Hybrid_Method");
            var iterRecount = 4;
            Console.WriteLine($"Iter recount: {iterRecount}");
            var vectorResultHyb_pair = MethodNewton_SNAU.Hybrid_withSLAU(vectorStart, matrixFunks, vectorFunks, iterRecount, stopWatch);
            Console.WriteLine($"Time: {stopWatch.ElapsedTicks} ticks");
            Console.WriteLine("Count math.operation: " +
                              $"{countMathOper_LUP * (1 + (vectorResultDef_pair.SecondElement / iterRecount)) + (countMathOper_SLAU + 1) * vectorResultDef_pair.SecondElement}");
            Console.WriteLine($"Count iter: {vectorResultHyb_pair.SecondElement}");
            Console.Write("Result vector: ");
            vectorResultHyb_pair.FirstElement.Show();

            //Thread.Sleep(10000);
            stopWatch.Reset();

            //Прогон на k итераций деф.методом, а потом добивка мод.методом
            var k = 4;
            Console.WriteLine("\nMerge: #Def_method->#Mod_Method");
            var vectorResultMerge_pair = MethodNewton_SNAU.MergeMethods(vectorStart, matrixFunks, vectorFunks, stopWatch, k);
            Console.WriteLine($"Time: {stopWatch.ElapsedTicks} ticks");
            Console.WriteLine("Count math.operation: " +
                              $"{countMathOper_LUP * (1 + k) + (countMathOper_SLAU + 1) * vectorResultDef_pair.SecondElement }");
            Console.WriteLine($"Count iter: {vectorResultMerge_pair.SecondElement}");
            Console.Write("Result vector: ");
            vectorResultMerge_pair.FirstElement.Show();

            stopWatch.Reset();
            #endregion
        }
        static public double KF_Gauss(ScalarFunk1 f, double defA, double a, double b, double alpha, int n)
        {
            //Вычисляем моменты от 0 до 2n - 1
            Vector vectorMoments = new Vector(2 * n);

            for (int i = 0; i < 2 * n; i++)
            {
                vectorMoments.data[i] = CountMoment(defA, a, b, alpha, i);
            }

            //Находим коеффициенты для W(x)
            Matrix matrixCoeff = new Matrix(n);

            FillMatrixCoeff(matrixCoeff, vectorMoments);
            Matrix matrixCoeff_L = new Matrix(n);
            Matrix matrixCoeff_U = new Matrix(n);
            Matrix matrixCoeff_P = new Matrix(n);

            LUP_decomposition.LUP(matrixCoeff, matrixCoeff_L, matrixCoeff_U, matrixCoeff_P);
            Vector vectorB_coeff = new Vector(n);

            for (int i = 0; i < n; i++)
            {
                vectorB_coeff.data[i] = -vectorMoments.data[n + i];
            }
            Vector vectorCoeff = LUP_decomposition.SLAU(matrixCoeff_L, matrixCoeff_U, matrixCoeff_P, vectorB_coeff);

            //Находим узлы из W(x)
            Vector      vectorX = new Vector(n);
            ScalarFunk1 funkW   = (double X) =>
            {
                double resultFunc = 0.0;
                for (int i = 0; i <= n; i++)
                {
                    resultFunc += (i != n) ? vectorCoeff.data[i] * Math.Pow(X, i) : Math.Pow(X, n);
                }
                return(resultFunc);
            };
            ScalarFunk1 funkW_Derivative = (double X) =>
            {
                double resultFuncDerivative = 0.0;
                for (int i = 0; i <= n; i++)
                {
                    resultFuncDerivative += (i != n) ? vectorCoeff.data[i] * Math.Pow(X, i - 1) * i : Math.Pow(X, n - 1) * n;
                }
                return(resultFuncDerivative);
            };
            var resultCount = MethodNewton_Scalar.DefualtMethod(a, b, funkW, funkW_Derivative);

            vectorX.SetValues(resultCount.FirstElement);

            //Решаем СЛАУ и находим Aj
            Matrix matrixX = new Matrix(n);

            FillMatrixX(matrixX, vectorX);
            Matrix matrixX_L = new Matrix(n);
            Matrix matrixX_U = new Matrix(n);
            Matrix matrixX_P = new Matrix(n);

            LUP_decomposition.LUP(matrixX, matrixX_L, matrixX_U, matrixX_P);
            Vector vectorB_X = new Vector(n);

            for (int i = 0; i < n; i++)
            {
                vectorB_X.data[i] = vectorMoments.data[i];
            }
            Vector vectorA = LUP_decomposition.SLAU(matrixX_L, matrixX_U, matrixX_P, vectorB_X);

            //Получем ответ по КФ
            double result = 0.0;

            for (int i = 0; i < n; i++)
            {
                result += vectorA.data[i] * f(vectorX.data[i]);
            }

            return(result);
        }