Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.97
GrotMog
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
#1

Решение системы линейных уравнений с помощью обратной матрицы - C++

06.10.2010, 18:05. Просмотров 5300. Ответов 11
Метки нет (Все метки)

Нужно решить систему уравнений с помощью обратной матрицы на с++
x1 + x2 + 2x3 = -1
2x1 - x2 + 2x3 = -4
4x1 + x2 + 4x3 = -2

Помогите кому не лень!!!!
http://www.cyberforum.ru/cpp-beginners/thread1374382.html
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2010, 18:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Решение системы линейных уравнений с помощью обратной матрицы (C++):

Решение системы линейных уравнений
Не могу сделать прогу на С++. Кто сделает - огромное спасибо. Решить систему...

Решение системы линейных уравнений
Компилятор wxDev-c++. Ошибка:C:\Program Files\Dev-Cpp\çàäà÷è\ãëàâà1\Ïåðâàÿ...

Решение системы линейных уравнений.
\begin{cases} & \text{ } cos(ax+2)...... x>2 \\ & \text{ } tg |x-2a| ...

Решение системы линейных уравнений
Помогите решить на Си

Найти решение системы линейных уравнений
привет всем, пожалуста помогите составить программу или испроваить ошибки в...

11
LineStown
66 / 66 / 6
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
06.10.2010, 18:06 #2
Писать нужно понятное условие, большинство знает с++/с, но не знают углубленно вышку и т.д.
1
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
06.10.2010, 20:09 #3
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
const int N = 3;
 
double det(int A[N][N])
{
    return A[0][0] * A[1][1] * A[2][2] +
           A[0][1] * A[1][2] * A[2][0] +
           A[1][0] * A[2][1] * A[0][2] -
           A[2][0] * A[1][1] * A[0][2] -
           A[1][0] * A[0][1] * A[2][2] -
           A[2][1] * A[1][2] * A[0][0];
}
 
int main()
{
    int A[N][N] =
    {
        1, 1, 2,
        2, -1, 2,
        4, 1, 4
    };
 
    int B[N] =
    {
        -1,
        -4,
        -2
    };
 
    double X[N];
    int T[N][N];
 
    double detA;
    int n;
    int i, j;
 
    detA = det(A);
 
    for (n = 0; n < N; n++)
    {
        for (i = 0; i < N; i++)
            for (j = 0; j < N; j++)
                T[i][j] = A[i][j];
 
        for (j = 0; j < N; j++)
            T[j][n] = B[j];
 
        X[n] = det(T) / detA;
    }
 
    for (i = 0; i < N; i++)
        cout << "X[" << i << "] = " << X[i] << "\t";
 
    cout << endl;
    system("pause");
    return 0;
}
3
GrotMog
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
06.10.2010, 22:35  [ТС] #4
silent_1991, Спасибо большое за оперативную помощь!

Добавлено через 14 минут
Только это метод Крамера, а мне нужно метод обратной матрицы.
1
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
06.10.2010, 22:39 #5
А метод Крамера собственно и выводится из метода обратной матрицы
A*X = B
Домножаем слева на A^-1
A^-1 * A * X = A^-1 * B
X = A^-1 * B;
Ну и т.д. Получается нужная формула.

Добавлено через 1 минуту
Или вам нужно именно найти обратную матрицу, перемножить её с вектором свободных членов и таким образом найти вектор решений?
1
GrotMog
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
06.10.2010, 23:40  [ТС] #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
Или вам нужно именно найти обратную матрицу, перемножить её с вектором свободных членов и таким образом найти вектор решений?
Именно это и нужно.
1
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
07.10.2010, 01:13 #7
Лучший ответ Сообщение было отмечено как решение

Решение

Оно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
const int N = 3;
 
void inversion(double A[][N], double E[][N])
{
    double temp;
 
    for (int k = 0; k < N; k++)
    {
        temp = A[k][k];
 
        for (int j = 0; j < N; j++)
        {
            A[k][j] /= temp;
            E[k][j] /= temp;
        }
 
        for (int i = k + 1; i < N; i++)
        {
            temp = A[i][k];
 
            for (int j = 0; j < N; j++)
            {
                A[i][j] -= A[k][j] * temp;
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (int k = N - 1; k > 0; k--)
    {
        for (int i = k - 1; i >= 0; i--)
        {
            temp = A[i][k];
 
            for (int j = 0; j < N; j++)
            {
                A[i][j] -= A[k][j] * temp;
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
}
 
void multi(double A[][N], double B[N], double X[N])
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            X[i] += A[i][j] * B[j];
}
 
int main()
{
    double A[N][N] =
    {
        1.0, 1.0, 2.0,
        2.0, -1.0, 2.0,
        4.0, 1.0, 4.0
    };
 
    double B[N] =
    {
        -1.0,
        -4.0,
        -2.0
    };
 
    double E[N][N] =
    {
        1.0, 0.0, 0.0,
        0.0, 1.0, 0.0,
        0.0, 0.0, 1.0
    };
 
    double X[N];
 
    inversion(A, E);
    multi(E, B, X);
 
    for (int i = 0; i < N; i++)
        cout << "X[" << i << "] = " << X[i] << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
4
GrotMog
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
07.10.2010, 16:41  [ТС] #8
silent_1991, То что надо, спасибо большое!
0
gvenog
1 / 1 / 1
Регистрация: 17.04.2010
Сообщений: 55
27.10.2011, 18:16 #9
silent_1991, что нужно исправить в вашем примере, чтобы метод обратных матриц работал для четырех уравнений и 4 неизвестных?
простая замена N=4 и добавление элементов в матрицу и единичную матрицу не сработали(
Цитата Сообщение от silent_1991 Посмотреть сообщение
Оно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
const int N = 3;
 
void inversion(double A[][N], double E[][N])
{
    double temp;
 
    for (int k = 0; k < N; k++)
    {
        temp = A[k][k];
 
        for (int j = 0; j < N; j++)
        {
            A[k][j] /= temp;
            E[k][j] /= temp;
        }
 
        for (int i = k + 1; i < N; i++)
        {
            temp = A[i][k];
 
            for (int j = 0; j < N; j++)
            {
                A[i][j] -= A[k][j] * temp;
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (int k = N - 1; k > 0; k--)
    {
        for (int i = k - 1; i >= 0; i--)
        {
            temp = A[i][k];
 
            for (int j = 0; j < N; j++)
            {
                A[i][j] -= A[k][j] * temp;
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
}
 
void multi(double A[][N], double B[N], double X[N])
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            X[i] += A[i][j] * B[j];
}
 
int main()
{
    double A[N][N] =
    {
        1.0, 1.0, 2.0,
        2.0, -1.0, 2.0,
        4.0, 1.0, 4.0
    };
 
    double B[N] =
    {
        -1.0,
        -4.0,
        -2.0
    };
 
    double E[N][N] =
    {
        1.0, 0.0, 0.0,
        0.0, 1.0, 0.0,
        0.0, 0.0, 1.0
    };
 
    double X[N];
 
    inversion(A, E);
    multi(E, B, X);
 
    for (int i = 0; i < N; i++)
        cout << "X[" << i << "] = " << X[i] << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
27.10.2011, 19:02 #10
gvenog, надо вектор иксов изначально тоже нулём инициализировать. Интересно, почему раньше работало?.. А так изменение дефайна N на 4 (и соответствующих матриц A, B, E) работает корректно, в функции инверсии менять ничего не надо.
0
gvenog
1 / 1 / 1
Регистрация: 17.04.2010
Сообщений: 55
27.10.2011, 23:23 #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
надо вектор иксов изначально тоже нулём инициализировать. Интересно, почему раньше работало?..
спасибо! заработало
а почему раньше работало - сама не понимаю, сразу почти стала заменять N=4, поэтому особо не смотрела
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
24.10.2012, 04:54 #12
доброго времени суток а не могли бы поставить комменты в программе просто не могу понять как код выполняется, по комментам проще будет, и как исправить его чтоб после целой шло 4 цифры? просто у меня задание с точной 10в -4 степени
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
const int N = 3;
 
double det(int A[N][N])
{
    return A[0][0] * A[1][1] * A[2][2] +
           A[0][1] * A[1][2] * A[2][0] +
           A[1][0] * A[2][1] * A[0][2] -
           A[2][0] * A[1][1] * A[0][2] -
           A[1][0] * A[0][1] * A[2][2] -
           A[2][1] * A[1][2] * A[0][0];
}
 
int main()
{
    int A[N][N] =
    {
        1, 1, 2,
        2, -1, 2,
        4, 1, 4
    };
 
    int B[N] =
    {
        -1,
        -4,
        -2
    };
 
    double X[N];
    int T[N][N];
 
    double detA;
    int n;
    int i, j;
 
    detA = det(A);
 
    for (n = 0; n < N; n++)
    {
        for (i = 0; i < N; i++)
            for (j = 0; j < N; j++)
                T[i][j] = A[i][j];
 
        for (j = 0; j < N; j++)
            T[j][n] = B[j];
 
        X[n] = det(T) / detA;
    }
 
    for (i = 0; i < N; i++)
        cout << "X[" << i << "] = " << X[i] << "\t";
 
    cout << endl;
    system("pause");
    return 0;
}
1
24.10.2012, 04:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2012, 04:54
Привет! Вот еще темы с решениями:

Численное решение системы линейных уравнений
Решить систему линейных уравнений: -сформировать матрицу А коэффициентов и...

Найти решение системы линейных уравнений
Даны действительные числа a1, b1, c1, a2, b2, c2. Выяснить, верно ли, что...

Решение системы линейных алгебраических уравнений
Добрый вечер!!! Помогите, пожалуйста, написать программу для решения системы...

Решение системы двух линейных уравнений
Привет всем. Я только недавно начал учить с++. Я вспомнил, что когда-то давно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru