// 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); }
// 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); }