Код:
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)