Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Матричный метод решения систем линейных уравнений

14K
30 декабря 2006 года
raksha
10 / / 10.12.2005
Необходимо решить систему линейных уравнений матричным методом.
метематическая теория
http://www.toehelp.ru/theory/math/lecture14/lecture14.html

Задачка типичная. Может у кого есть код.Желательно на Паскале или С++, или Delphi

скиньте на [email]raksha_@bigmir.net[/email]

Спасибо
271
30 декабря 2006 года
MrXaK
721 / / 31.12.2002
мой класс для работы с матрицами
Код:
typedef struct matrix
{
    double mat[N][N];
    uint A, B;
} matrix;
matrix minor( matrix M, uint q, uint p )
{
    uint i, j;
    uint l;
    double *stolb, *stroka;
    if( /*(M.A != M.B) ||*/ (M.A <= 2) || (M.B <= 2) )
        throw error("невозможно посчитать минор");
    stolb = (double*)malloc(sizeof(double) * M.A);
    stroka = (double*)malloc(sizeof(double) * M.B);
    for( j = 0; j < M.A; j++ )
        stolb[j] = 0;
    for( i = 0; i < M.B; i++ )
        stroka = 0;
    if( NUM == 1 )
    {
        q--;
        p--;
    }
   
    for( i = q; i < M.A-1; i++ )
        for( j = 0; j < M.B; j++ )
            M.mat[j] = M.mat[i+1][j];

    for( j = p; j < M.B-1; j++ )
        for( i = 0; i < M.A; i++ )
            M.mat[j] = M.mat[j+1];

    free(stolb);
    free(stroka);

    M.A--;
    M.B--;
    return M;
}
double det( matrix M )
{
    uint i;
    double s;
    if( M.A != M.B )
    {
        M.err = 1;
        throw error("Матрица не квадратная. Невозможно вычислить det");
        return 0;
    }
    if( (M.A == 1) || (M.B == 1) )
    {
        M.err = 1;
        throw error("Неправильная размерность матрицы");
        return 0;
    }
    if( (M.A == 2) && (M.B == 2) )
        return (M.mat[0][0]*M.mat[1][1] - M.mat[1][0]*M.mat[0][1]);
    s = 0;
    for( i = 0; i < M.B; i++ )
        s += pow(-1, i) * M.mat[0] * det(minor(M, 0, i));
    return s;
}

matrix transp( matrix M )
{
    matrix A;
    uint i, j;
    A.A = M.B;
    A.B = M.A;
    for( i = 0; i < M.A; i++ )
        for( j = 0; j < M.B; j++ )
            A.mat[j] = M.mat[j];
    return A;
}
matrix obr( matrix M )
{
    matrix A;
    uint i, j;
    double D;

    D = det(M);
    if( D == 0 )
    {
        A.err = 1;
        throw error("det = 0, построение обратной матрицы невозможно");
        return A;
    }
        A.err = 0;
    A.A = M.A;
    A.B = M.B;
    for( i = 0; i < A.A; i++ )
        for( j = 0; j < A.B; j++ )
            A.mat[j] = pow(-1, i+j) * det(minor(M, i, j));
    A = transp(A);
    for( i = 0; i < A.A; i++ )
        for( j = 0; j < A.B; j++ )
            A.mat[j] /= D;

    return A;
   
}
matrix mult( matrix A, matrix B )
{
    matrix C;
    uint i, j, v;
    C.err = 0;
    if( A.B != B.A )
    {
        C.err = 1;
        throw error("Умножение невозможно. Количество строк в первой не равно количеству столбцов во второй.");
        return C;
    }
    C.A  = A.A;
    C.B = B.B;
    C = init(C);
    for( i = 0; i < A.A; i++ )
        for( j = 0; j < B.B; j++ )
            for( v = 0; v < A.B; v++ )
                C.mat[j] += A.mat[v] * B.mat[v][j];
    return C;
}

решение соответственно будет C = mult(obr(A), B);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог