Код:
using System; class MatrixGauss { public static void Main() { int i,j,k,n; double p; Console.Write("Введите:\n\t1 - для начала вычисления\n\t2 - для справки\nВаш выбор: "); if (int.Parse(Console.ReadLine()) == 2) //Справка? Поехали? Console.Write("Коэффициенты перед переменными рассматриваются как элементы матрицы, при условии, что во всех уравнениях переменные упорядоченны(то есть, x1,x2 и т.д.)\nКоэффициент первой перменной первого уравнения это элемент матрицы номер [1,1].\n"); Console.Write("Введите число уравнений: "); i=int.Parse(Console.ReadLine()); double[,] a; a = new double[i,i+1]; for(j=0;j<i;j++) for (k = 0; k < i + 1; k++) { if (k == i) Console.Write("Введите решение уравнения номер " + (j+1).ToString() + ": "); else Console.Write("Введите коэффициент [" + (j+1).ToString() + "," + (k+1).ToString() + "]: "); a[j, k] = double.Parse(Console.ReadLine()); } for (j = 0; j < i;j++) //проверка на наличие нулей на диагонале if (a[j, j] == 0) { for (n = (j+1)%i; n < i+j; n++) { if (a[n%i, j] != 0) { Console.WriteLine("[sys] меняю местами уравнение номер " + (j + 1).ToString() + " с уравнением номер " + (n%i + 1).ToString()); for (k = 0; k < i + 1; k++) { p = a[j, k]; a[j, k] = a[n%i, k]; a[n%i, k] = p; } j = -1; break; } } } for (j = 0; j < i; j++) //к ступенчатому виду: активная строка for (n = 0; n < i; n++) { if (n == j) //активная строка? пропускаем continue; p = (a[n, j] / a[j, j]); for (k = 0; k < i + 1; k++) { a[n, k] = a[n, k] - a[j, k] * p; } } for (n = 0; n < i; n++) //приводим главные члены к 1це for (k = i; k >= 0; k--) //с конца a[n, k] /= a[n, n]; Console.WriteLine("Получим ответы:"); for(n=0;n<i;n++) Console.WriteLine("x" + (n+1) + " = " + a[n,i] + ";"); Console.ReadLine(); } }
1. переставляем уравнения убирая нули с диагонали
2. приводим к диагональному(ступенчатому) виду
3. приводим к нормальному виду
4. решаем =)
будет работать если в системе нет нулевых столбцов. И, соответственно, если она имеет решение(линейно независима).
Отредактировано нфиксъ (14-05-2007 02:34:33)