Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/131: Рейтинг темы: голосов - 131, средняя оценка - 4.58
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11

Решение СЛАУ методом Крамера

10.01.2011, 11:06. Показов 25054. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать программу на СИ для решения СЛАУ с помощью метода Крамера.

2x1 - x2 + 3x3 + 2x4 = 4
2x1 + 3x2 + 3x3 + 2x4 = 6
3x1 - x2 - x3 + 2x4 = 6
3x1 - x2 + 3x3 - x4 = 6

Если кому не сложно, помогите плз.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2011, 11:06
Ответы с готовыми решениями:

Решение системы двух уравнений с двумя неизвестными методом Крамера
нужно составить алгоритм на языке СИ, который бы решил систему двух уравнении с двумя неизвестными

Решение СЛАУ методом Зейделя
Народ, я написал прогу, которая решает СЛАУ методом Зейделя. Но проблема в том, что входная матрица коэффициентов пред x, должна иметь...

Решение СЛАУ методом Гаусса
Задание 7. Алгоритм Гаусса. Реализовать алгоритм решения СЛАУ методом Гаусса. Ограничения: будем считать что СЛАУ всегда разрешима. ...

12
 Аватар для vet
183 / 184 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
10.01.2011, 13:35
А разве в этой теме система линейных уравнений (срочно нужно) Вам не помогли?
0
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
10.01.2011, 13:54  [ТС]
там с++ с помощью обратной матрицы а мне нужно на си и методом крамера........
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.01.2011, 15:27
https://www.cyberforum.ru/cpp-beginners/thread173244.html?uri=/cpp-beginners/thread173244.html#post1009603
Цитата Сообщение от GrotMog Посмотреть сообщение
silent_1991, Спасибо большое за оперативную помощь!

Добавлено через 14 минут
Только это метод Крамера, а мне нужно метод обратной матрицы.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
10.01.2011, 15:41
GrotMog, в той теме, собственно, представлены оба метода, и Крамера, и обратной матрицы... То вам одно не нравится, то другое... Не поймёшь вас...
2
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
10.01.2011, 16:37  [ТС]
Голова два уха спс
0
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
19.01.2011, 13:13  [ТС]
Вот сделал, может кому нужно будет!

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <conio.h>
 
const N=4;
//нахождение детерминанта
float Det(int G, double M[4][4])
{
 if (G == 1)
 return M[0][0];
 else
 {
     double M1[4][4];
     int i, x, X, Y;
     float Res = 0;
     for (i = 0; i < G; i++)
     {
         for (Y = 1; Y < G; Y++)
         {
             x = 0;
             for (X = 0; X < G; X++)
             if (X != i)
             M1[Y-1][x++] = M[Y][X];
         }
         if (i % 2 == 0)
         Res += M[0][i] * Det(G - 1, M1);
         else
         Res -= M[0][i] * Det(G - 1, M1);
     }
     return Res;
 }
}
//-----------------------------------------------------------------------------
 
//Вывод на экран матрицы
vyvod(double V[4][4])
{
    int i,j;
    for (i = 0; i < N; i++)
    for (j = 0; j < N; j++)
    {
        if (j==0) printf("\n");
        else printf("\t");
        printf("%7.2f", V[i][j]);
    }
    printf("\n");
}
 
//создание матрицы и нахождение  детерминанта 
podstanovka(int k, double M[4][4],double A[4][4],double B[4])
{   
    int i,j;    
    for (i=0; i<N; i++)
    for (j=0; j<N; j++)
    {
       M[i][j] = A[i][j];
    }
    for (i=0; i<N; i++)             //подстановка
    {                       //
                        //
        M[i][k] = B[i];             //
    }                       //
     float Opr = Det(4, M);
     return Opr;                                
}
 
 
 main( )
{
    int i,j; 
    double A[4][4]={{2,-1,3,2},
            {2,3,3,2},
            {3,-1,-1,2},
            {3,-1,3,-1}};
 
    double B[4]={4,6,6,6};
 
//Вывод на экран исходной матрицы
printf("\nVyvod ishodnoi matricy");
vyvod(A);
    
//------Нахождение определителя исходной матрицы---------------------------    
    printf("\nVyvod determinanta ishodnoi matricy\n");
    float Op = Det(4, A);
    printf("Determinant = %7.2f\n", Op);
//------------------------------------------------------------------------- 
 
//***********************************
    //действия над новыми матрицами
    double M1[N][N];
    float Op1 = podstanovka(0, M1, A, B);
    printf("Determinant 1 = %7.2f\n", Op1);
    
    double M2[N][N];
    float Op2 = podstanovka(1, M2, A, B);
    printf("Determinant 2 = %7.2f\n", Op2);
    
    double M3[N][N];
    float Op3 = podstanovka(2, M3, A, B);
    printf("Determinant 3 = %7.2f\n", Op3);
    
    double M4[N][N];
    float Op4 = podstanovka(3, M4, A, B);
    printf("Determinant 4 = %7.2f\n", Op4);
   
 
// Вывод решения
printf("\nVyvod resheniya\n");
float x1 = Op1/Op;
printf("X1 = %7.2f\n", x1);
float x2 = Op2/Op;
printf("X2 = %7.2f\n", x2);
float x3 = Op3/Op;
printf("X3 = %7.2f\n", x3);
float x4 = Op4/Op;
printf("X4 = %7.2f\n", x4);
 
    system("pause");        
}
Добавлено через 1 минуту
Народ может кто подскажет как быстрее нарисовать блок схему??
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.01.2011, 13:43
Народ может кто подскажет как быстрее нарисовать блок схему??
карандашом)) ну или MS Visio
0
4 / 4 / 0
Регистрация: 06.10.2010
Сообщений: 11
19.01.2011, 14:09  [ТС]
Вот прога уже и не карандашом и не MS Visio
0
0 / 0 / 0
Регистрация: 14.12.2022
Сообщений: 8
26.01.2023, 00:06
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
void cramer_matrix(int **matrix, int height, int width)
{
    // height <--> базис
    // width - 1 <--> кол-во переменных
    int n = height;
    if (width - 1 != height)
    {
        printf("эту СЛАУ методом крамера решить нельзя\n\n");
        return;
    }
    
    void col_change(int **matrix, int n, int to, int from);
    void col_change_to_from(int **matrix, int n, int to, int **from_what, int from);
    
    int **m = NULL;
    m = (int**)calloc(height, sizeof(int*));
    m[0] = (int*)calloc(height * width, sizeof(int));
    for (size_t i = 1; i < width; i++) 
    {
        m[i] = m[0] + i * width;
    }   
    
    for (size_t i = 0; i < height; i++)
    {
        for (size_t j = 0; j < width; j++)
        {
            m[i][j] = matrix[i][j];
        }
    }
    // matrix[i][width - 1] - базис
    int **temp = NULL;
    temp = (int**)calloc(height, sizeof(int*));
    temp[0] = (int*)calloc(height, sizeof(int*));
    for (size_t i = 0; i < height; i++)
    {
        temp[i] = temp[0] + i;
    }
 
    double det_array[width - 1];
    double main_det = det_matrix(m, n, width - 1);
        
    for (size_t i = 0; i < n; i++)
    {
        col_change_to_from(temp, height, 0, m, i);      
        col_change(m, n, i, width - 1);     
        det_array[i] = det_matrix(m, n, width - 1);         
        col_change_to_from(m, height, i, temp, 0);  
    }
        
    if (main_det != 0)
    {
        printf("\n");
        for (size_t i = 0; i < n; i++)
        {
            printf("x[%d] = %0.2f = %0.1f / %0.1f \n", i + 1, (det_array[i] / main_det), round(det_array[i]), round(main_det));
        }
        printf("\n");
    }
    else
    {
        printf("\nопределитель = 0\n");
        printf("эту СЛАУ методом крамера решить нельзя\n\n");
    }
}
 
void col_change_to_from(int **matrix, int n, int to, int **from_what, int from)
{
    for (size_t i = 0; i < n; i++)
    {
        matrix[i][to] = from_what[i][from];
    }
}
 
void col_change(int **matrix, int n, int to, int from)
{
    for (size_t i = 0; i < n; i++)
    {
        matrix[i][to] = matrix[i][from];
    }   
}
 
int det_matrix(int **matrix, int height, int width)
{
    void subtract(double **matrix, int n, int DST_FROM, int SRC_WHAT, double k); // требуемая функция для вычитания строк ( обнуление под главной диагональю )
    void first_not_zero(double **matrix, int n);
    
    // DST_FROM = DESTINATION FROM - из чего вычитать
    // SRC_WHAT = SOURCE WHAT - что вычитать
    
    if (height != width) // проверяем, если матрица не квадратная
    {
        return -1;
    }   
    
    int det = 0; // 0, потому что для размерностей <= 3 только складываем значения
    int n = height; // width и height уже не нужен, пользуемся только одним размером, т.к. матрица квадратная
 
    ///// создаём матрицу
 
    double **m = NULL; 
    
    m = (double**)malloc(n * sizeof(double*));
    m[0] = (double*)malloc(n * n * sizeof(double));
    
    for (size_t i = 1; i < n; i++)
    {
        m[i] = m[0] + i * n;
    }
    
    ///// копируем матрицу, т.к. мы будем её менять для вычисления det M
    
    for (size_t i = 0; i < n; i++)
    {
        for (size_t j = 0; j < n; j++)
        {
            m[i][j] = (double)matrix[i][j];
        }
    }
    
    /////
    
    first_not_zero(m, n);
    
    ///// проверяем нулевые столбцы и строки
    
    int zero_count = 0;
    
    for (size_t i = 0; i < n; i++)
    {
        for (size_t j = 0; j < n; j++)
        {
            if (m[i][j] == 0)
                zero_count++;   
        }
        if (zero_count == n)
            return 0;
        zero_count = 0; 
    }
    
    for (size_t j = 0; j < n; j++)
    {
        for (size_t i = 0; i < n; i++)
        {
            if (m[i][j] == 0)
                zero_count++;   
        }
        if (zero_count == n)
            return 0;
        zero_count = 0; 
    }   
    
    ///// используем известные алгоритмы для небольших размерностей
    
    if (n == 1)
    {
        return *matrix[0];
    }
    
    if (n == 2)
    {
        det = (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
    }
    
    if (n == 3)
    {
        det += (matrix[0][0] * matrix[1][1] * matrix[2][2]);
        det += (matrix[0][1] * matrix[1][2] * matrix[2][0]);
        det += (matrix[0][2] * matrix[1][0] * matrix[2][1]);    
        
        det -= (matrix[0][2] * matrix[1][1] * matrix[2][0]);
        det -= (matrix[0][0] * matrix[1][2] * matrix[2][1]);
        det -= (matrix[0][1] * matrix[1][0] * matrix[2][2]);    
        
        return det;             
    }
    
    ///// вычисление при помощи преобразований строк
 
    size_t count = 1; 
    double k;
    
    while (count != n)
    {
        for (size_t i = count; i < n; i++)
        {
            k = m[i][count - 1] / m[count - 1][count - 1];
            subtract(m, n, i, count - 1, k);            
        }
 
        count++;
    }
    
    det = 1;
    
    for (size_t i = 0; i < n; i++)
    {
        det *= m[i][i]; 
    }   
    
    free(m[0]);
    return det;
}
 
void subtract(double **matrix, int n, int DST_FROM, int SRC_WHAT, double k)
{
    for (size_t j = 0; j < n; j++)
        matrix[DST_FROM][j] -= matrix[SRC_WHAT][j] * k;
}   
 
void first_not_zero(double **matrix, int n)
{
    if (matrix[0][0] == 0)
    {
        for (size_t i = 1; i < n; i++)
        {
            if (matrix[i][0] != 0)
            {
                for (size_t j = 0; j < n; j++)
                    matrix[0][j] += matrix[i][j];
            }
        }   
    }
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
26.01.2023, 09:54
Цитата Сообщение от lbm33 Посмотреть сообщение
C
1
2
    int **m = NULL;
    m = (int**)calloc(height, sizeof(int*));
Зачем вдруг понадобилась промежуточная инициализация в NULL? Почему не написать сразу

C
1
    int **m = calloc(height, sizeof(int*));
Цитата Сообщение от lbm33 Посмотреть сообщение
double det_array[width - 1];
Во всем коде используется динамическое выделение памяти. С чего это вдруг именно и только здесь внезапно использован VLA?

Цитата Сообщение от lbm33 Посмотреть сообщение
double main_det = det_matrix(m, n, width - 1);
det_matrix - необъявленный идентификатор.

Откуда тут и выше вообще взялся тип double, если det_matrix возвращает int?

Цитата Сообщение от lbm33 Посмотреть сообщение
printf("x[%d] = %0.2f = %0.1f / %0.1f \n", i + 1, (det_array[i] / main_det), round(det_array[i]), round(main_det));
Для печатати size_t использовано %d.

Цитата Сообщение от lbm33 Посмотреть сообщение
free(m[0]);
А free(m) кто будет делать?

В остальных функциях память не освобождается вообще...

Цитата Сообщение от lbm33 Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void col_change_to_from(int **matrix, int n, int to, int **from_what, int from)
{
    for (size_t i = 0; i < n; i++)
    {
        matrix[i][to] = from_what[i][from];
    }
}
void col_change(int **matrix, int n, int to, int from)
{
    for (size_t i = 0; i < n; i++)
    {
        matrix[i][to] = matrix[i][from];
    }   
}
Зачем было писать две функции, которые фактически делают одно и то же?

Цитата Сообщение от lbm33 Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
///// используем известные алгоритмы для небольших размерностей
if (n == 1)
    {
        return *matrix[0];
    }
if (n == 2)
    {
        det = (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
    }
if (n == 3)
    {
        det += (matrix[0][0] * matrix[1][1] * matrix[2][2]);
        det += (matrix[0][1] * matrix[1][2] * matrix[2][0]);
        det += (matrix[0][2] * matrix[1][0] * matrix[2][1]);    
        
        det -= (matrix[0][2] * matrix[1][1] * matrix[2][0]);
        det -= (matrix[0][0] * matrix[1][2] * matrix[2][1]);
        det -= (matrix[0][1] * matrix[1][0] * matrix[2][2]);    
        
        return det;             
    }
А куда пропал return для случая n == 2?
0
0 / 0 / 0
Регистрация: 14.12.2022
Сообщений: 8
26.01.2023, 20:15
когда я пишу free, то там возникает странный баг и прога крашится, как фиксить я не знаю, про остальное я знаю, я случайно прошлую версию скинул
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
26.01.2023, 22:18
Цитата Сообщение от lbm33 Посмотреть сообщение
когда я пишу free, то там возникает странный баг и прога крашится, как фиксить я не знаю, про остальное я знаю, я случайно прошлую версию скинул
¯\_(ツ)_/¯
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2023, 22:18
Помогаю со студенческими работами здесь

Решение СЛАУ методом Гаусса
помогите, пожалуйста! надо создать программу, которая считает систему линейных уравнений методом гаусса, на языке си. заранее...

Решение СЛАУ методом LU-разложения
Написал лабу по по выч.мату. решил поделиться. Надеюсь кому то еще пригодиться. #include &lt;conio.h&gt; #include &lt;stdio.h&gt; ...

Решение СЛАУ методом Гауса-Зейделя.
Всем привет! Простите за оффтоп, но... Сначала хотелось бы сказать спасибо всем, кто здесь реально помогает, а не разводит полемику! И...

Приближённое решение СЛАУ методом простой итерации
Написать программу на языке С приближённого решения системы линейных алгебраических уравнений методом простой итерации. Входные данные: ...

Решение СЛАУ методом Гаусса для 3 уравнений с 2-мя неизвестными
Нужно создать функцию для решения СЛАУ методом Гаусса для 3 уравнений с 2-мя неизвестными Добавлено через 14 часов 44 минуты Можете...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru