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