示例#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
        }
示例#2
0
 static void InitMatrixFunks(ScalarFunk1_N[][] matrixFunks)
 {
     matrixFunks[0]    = new ScalarFunk1_N[10];
     matrixFunks[0][0] = (double[] X) => - Math.Sin(X[0] * X[1]) * X[1];
     matrixFunks[0][1] = (double[] X) => - Math.Sin(X[0] * X[1]) * X[0];
     matrixFunks[0][2] = (double[] X) => 3.0 * Math.Exp(-(3 * X[2]));
     matrixFunks[0][3] = (double[] X) => X[4] * X[4];
     matrixFunks[0][4] = (double[] X) => 2 * X[3] * X[4];
     matrixFunks[0][5] = (double[] X) => - 1;
     matrixFunks[0][6] = (double[] X) => 0;
     matrixFunks[0][7] = (double[] X) => - 2 * Math.Cosh(2 * X[7]) * X[8];
     matrixFunks[0][8] = (double[] X) => - Math.Sinh(2 * X[7]);
     matrixFunks[0][9] = (double[] X) => 2;
     matrixFunks[1]    = new ScalarFunk1_N[10];
     matrixFunks[1][0] = (double[] X) => Math.Cos(X[0] * X[1]) * X[1];
     matrixFunks[1][1] = (double[] X) => Math.Cos(X[0] * X[1]) * X[0];
     matrixFunks[1][2] = (double[] X) => X[8] * X[6];
     matrixFunks[1][3] = (double[] X) => 0;
     matrixFunks[1][4] = (double[] X) => 6 * X[4];
     matrixFunks[1][5] = (double[] X) => - Math.Exp(-X[9] + X[5]) - X[7] - 1;
     matrixFunks[1][6] = (double[] X) => X[2] * X[8];
     matrixFunks[1][7] = (double[] X) => - X[5];
     matrixFunks[1][8] = (double[] X) => X[2] * X[6];
     matrixFunks[1][9] = (double[] X) => Math.Exp(-X[9] + X[5]);
     matrixFunks[2]    = new ScalarFunk1_N[10];
     matrixFunks[2][0] = (double[] X) => 1;
     matrixFunks[2][1] = (double[] X) => - 1;
     matrixFunks[2][2] = (double[] X) => 1;
     matrixFunks[2][3] = (double[] X) => - 1;
     matrixFunks[2][4] = (double[] X) => 1;
     matrixFunks[2][5] = (double[] X) => - 1;
     matrixFunks[2][6] = (double[] X) => 1;
     matrixFunks[2][7] = (double[] X) => - 1;
     matrixFunks[2][8] = (double[] X) => 1;
     matrixFunks[2][9] = (double[] X) => - 1;
     matrixFunks[3]    = new ScalarFunk1_N[10];
     matrixFunks[3][0] = (double[] X) => - X[4] * Math.Pow(X[2] + X[0], -2);
     matrixFunks[3][1] = (double[] X) => - 2 * Math.Cos(X[1] * X[1]) * X[1];           //
     matrixFunks[3][2] = (double[] X) => - X[4] * Math.Pow(X[2] + X[0], -2);
     matrixFunks[3][3] = (double[] X) => - 2.0 * Math.Sin(-X[8] + X[3]);
     matrixFunks[3][4] = (double[] X) => 1.0 / (X[2] + X[0]);
     matrixFunks[3][5] = (double[] X) => 0;
     matrixFunks[3][6] = (double[] X) => - 2 * Math.Cos(X[6] * X[9]) * Math.Sin(X[6] * X[9]) * X[9];
     matrixFunks[3][7] = (double[] X) => - 1;
     matrixFunks[3][8] = (double[] X) => 2 * Math.Sin(-X[8] + X[3]);
     matrixFunks[3][9] = (double[] X) => - 2 * Math.Cos(X[6] * X[9]) * Math.Sin(X[6] * X[9]) * X[6];
     matrixFunks[4]    = new ScalarFunk1_N[10];
     matrixFunks[4][0] = (double[] X) => 2 * X[7];
     matrixFunks[4][1] = (double[] X) => - 2 * Math.Sin(X[1]);
     matrixFunks[4][2] = (double[] X) => 2 * X[7];
     matrixFunks[4][3] = (double[] X) => Math.Pow(-X[8] + X[3], -2);
     matrixFunks[4][4] = (double[] X) => Math.Cos(X[4]);
     matrixFunks[4][5] = (double[] X) => X[6] * Math.Exp(-X[6] * (-X[9] + X[5]));
     matrixFunks[4][6] = (double[] X) => - (X[9] - X[5]) * Math.Exp(-X[6] * (-X[9] + X[5]));
     matrixFunks[4][7] = (double[] X) => (2 * X[2]) + 2 * X[0];
     matrixFunks[4][8] = (double[] X) => - Math.Pow(-X[8] + X[3], -2);
     matrixFunks[4][9] = (double[] X) => - X[6] * Math.Exp(-X[6] * (-X[9] + X[5]));
     matrixFunks[5]    = new ScalarFunk1_N[10];
     matrixFunks[5][0] = (double[] X) => Math.Exp(X[0] - X[3] - X[8]);
     matrixFunks[5][1] = (double[] X) => - 3.0 / 2.0 * Math.Sin(3 * X[9] * X[1]) * X[9];
     matrixFunks[5][2] = (double[] X) => - X[5];
     matrixFunks[5][3] = (double[] X) => - Math.Exp(X[0] - X[3] - X[8]);
     matrixFunks[5][4] = (double[] X) => 2 * X[4] / X[7];
     matrixFunks[5][5] = (double[] X) => - X[2];
     matrixFunks[5][6] = (double[] X) => 0;
     matrixFunks[5][7] = (double[] X) => - X[4] * X[4] * Math.Pow(X[7], (-2));
     matrixFunks[5][8] = (double[] X) => - Math.Exp(X[0] - X[3] - X[8]);
     matrixFunks[5][9] = (double[] X) => - 3.0 / 2.0 * Math.Sin(3 * X[9] * X[1]) * X[1];
     matrixFunks[6]    = new ScalarFunk1_N[10];
     matrixFunks[6][0] = (double[] X) => Math.Cos(X[3]);
     matrixFunks[6][1] = (double[] X) => 3 * X[1] * X[1] * X[6];
     matrixFunks[6][2] = (double[] X) => 1;
     matrixFunks[6][3] = (double[] X) => - (X[0] - X[5]) * Math.Sin(X[3]);
     matrixFunks[6][4] = (double[] X) => Math.Cos(X[9] / X[4] + X[7]) * X[9] * Math.Pow(X[4], -2);
     matrixFunks[6][5] = (double[] X) => - Math.Cos(X[3]);
     matrixFunks[6][6] = (double[] X) => Math.Pow(X[1], 3);
     matrixFunks[6][7] = (double[] X) => - Math.Cos(X[9] / X[4] + X[7]);
     matrixFunks[6][8] = (double[] X) => 0;
     matrixFunks[6][9] = (double[] X) => - Math.Cos(X[9] / X[4] + X[7]) / X[4];
     matrixFunks[7]    = new ScalarFunk1_N[10];
     matrixFunks[7][0] = (double[] X) => 2 * X[4] * (X[0] - 2 * X[5]);
     matrixFunks[7][1] = (double[] X) => - X[6] * Math.Exp(X[1] * X[6] + X[9]);
     matrixFunks[7][2] = (double[] X) => - 2 * Math.Cos(-X[8] + X[2]);
     matrixFunks[7][3] = (double[] X) => 0.15e1;
     matrixFunks[7][4] = (double[] X) => Math.Pow(X[0] - 2 * X[5], 2);
     matrixFunks[7][5] = (double[] X) => - 4 * X[4] * (X[0] - 2 * X[5]);
     matrixFunks[7][6] = (double[] X) => - X[1] * Math.Exp(X[1] * X[6] + X[9]);
     matrixFunks[7][7] = (double[] X) => 0;
     matrixFunks[7][8] = (double[] X) => 2 * Math.Cos(-X[8] + X[2]);
     matrixFunks[7][9] = (double[] X) => - Math.Exp(X[1] * X[6] + X[9]);
     matrixFunks[8]    = new ScalarFunk1_N[10];
     matrixFunks[8][0] = (double[] X) => - 3;
     matrixFunks[8][1] = (double[] X) => - 2 * X[7] * X[9] * X[6];
     matrixFunks[8][2] = (double[] X) => 0;
     matrixFunks[8][3] = (double[] X) => Math.Exp((X[4] + X[3]));
     matrixFunks[8][4] = (double[] X) => Math.Exp((X[4] + X[3]));
     matrixFunks[8][5] = (double[] X) => - 0.7e1 * Math.Pow(X[5], -2);
     matrixFunks[8][6] = (double[] X) => - 2 * X[1] * X[7] * X[9];
     matrixFunks[8][7] = (double[] X) => - 2 * X[1] * X[9] * X[6];
     matrixFunks[8][8] = (double[] X) => 3;
     matrixFunks[8][9] = (double[] X) => - 2 * X[1] * X[7] * X[6];
     matrixFunks[9]    = new ScalarFunk1_N[10];
     matrixFunks[9][0] = (double[] X) => X[9];
     matrixFunks[9][1] = (double[] X) => X[8];
     matrixFunks[9][2] = (double[] X) => - X[7];
     matrixFunks[9][3] = (double[] X) => Math.Cos(X[3] + X[4] + X[5]) * X[6];
     matrixFunks[9][4] = (double[] X) => Math.Cos(X[3] + X[4] + X[5]) * X[6];
     matrixFunks[9][5] = (double[] X) => Math.Cos(X[3] + X[4] + X[5]) * X[6];
     matrixFunks[9][6] = (double[] X) => Math.Sin(X[3] + X[4] + X[5]);
     matrixFunks[9][7] = (double[] X) => - X[2];
     matrixFunks[9][8] = (double[] X) => X[1];
     matrixFunks[9][9] = (double[] X) => X[0];
 }