static double[] Zeid(Eq equat) { if (equat.IsDP() == true && equat.IsPO() == true) { double[] x1 = new double[equat.n]; double eps = 0, eps0 = Math.Abs((1 - equat.norm) / equat.norm) * 0.0001; do { for (int i = 0; i < equat.n; i++) { x1[i] = equat.x[i]; } for (int i = 0; i < equat.n; i++) { double sum = 0; for (int j = 0; j < i; j++) { sum += equat.matr[i, j] * equat.x[j]; } for (int j = i + 1; j < equat.n; j++) { sum += equat.matr[i, j] * x1[j]; } equat.x[i] = (equat.b[i] - sum) / equat.matr[i, i]; } eps = 0; for (int i = 0; i < equat.n; i++) { eps += Math.Abs(equat.x[i] - x1[i]); } } while (eps > eps0); } return(equat.x);
static double[] Gauss(Eq equat) { double[,] m = new double[equat.n, equat.n]; for (int i = 0; i < equat.n; i++) { for (int j = 0; j < equat.n; j++) { m[i, j] = equat.matr[i, j]; } } double d = Eq.Det(m); if (d != 0) { equat.Diag(); for (int i = equat.n - 1; i >= 0; i--) { double sum = 0; for (int j = equat.n - 1; j > i; j--) { sum += equat.x[j] * equat.matr[i, j]; } equat.x[i] = (equat.b[i] - sum) / equat.matr[i, i]; } } return(equat.x); }
public bool IsPO() { bool isPO = true; for (int i = 1; i <= n; i++) { double[,] temp = new double[i, i]; for (int j = 0; j < i; j++) { for (int k = 0; k < i; k++) { temp[j, k] = matr[j, k]; } } double det = Eq.Det(temp); if (det > 0) { continue; } else { isPO = false; break; } } return(isPO); }
public static double Det(double[,] ma) { double det = 1; double[] b = new double[(int)Math.Sqrt(ma.Length)]; Eq q = new Eq(ma, b); q.Diag(); for (int i = 0; i < q.n; i++) { det *= q.matr[i, i]; } return(det); }
static void Main(string[] args) { int k = 4; Eq equat; Console.WriteLine("Введите размерность матрицы"); int n = int.Parse(Console.ReadLine()); double[,] matr = new double[n, n]; double[] b = new double[n]; Console.WriteLine("Меню:\n 1) Задать произвольную матрицу \n 2) Задать матрицу из примера"); int s = int.Parse(Console.ReadLine()); switch (s) { case 1: for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.WriteLine("Введите элемент матрицы {0}-{1} :", i, j); matr[i, j] = double.Parse(Console.ReadLine()); } } for (int i = 0; i < n; i++) { Console.WriteLine("Введите элемент столбца {0} :", i); b[i] = double.Parse(Console.ReadLine()); } break; case 2: k = 4; for (int i = 0; i < n; i++) { b[i] = 15 + k; k += 2; } k = 2; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { matr[i, j] = 15 + k; k += 2; } else { matr[i, j] = 1; } } } break; } equat = new Eq(matr, b); Console.WriteLine("Матрица:"); for (int i = 0; i < equat.n; i++) { for (int j = 0; j < equat.n; j++) { Console.Write("{0}\t", equat.matr[i, j]); } Console.WriteLine(); } Console.WriteLine("Cтолбец:"); foreach (double i in equat.b) { Console.WriteLine(i); } Console.WriteLine("*************************************************"); Console.WriteLine("Методы: \n1)Гаусс \n2)Зейдель \n3)МПИ"); s = int.Parse(Console.ReadLine()); switch (s) { case 1: equat.x = Gauss(equat); break; case 2: equat.x = Zeid(equat); break; case 3: equat.x = MPI(equat); break; } Console.WriteLine("Решение:"); foreach (double i in equat.x) { Console.WriteLine(i); } Console.ReadKey(); }