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 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]; }