Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.86
AlexSun
17 / 15 / 1
Регистрация: 03.11.2010
Сообщений: 169
#1

Решить систему уравнений методом Крамера - C++

10.04.2011, 16:40. Просмотров 3814. Ответов 7
Метки нет (Все метки)

Не по теме:

Ненавижу математику!!!


Нужно написать программу на чистом C для решения системы уравнений методом Крамера.
Помню там нужно подставлять правый столбец (числа которые после знака равно) вместо каждого, находить определители и делить их на основной определитель, но его я умею искать только для матрицы 3 х 3 (треугольником).
Помогите найти готовый исходник для решения такой задачи или хотя бы для нахождения определителя любой матрицы.
Пока что пытаюсь переписать вот это Написать решение систем линейных уравнений методом Крамера с C++ на C, получается не очень.

Не по теме:

А еще я только что узнал что в C нету классов ^^

Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 16:40     Решить систему уравнений методом Крамера
Посмотрите здесь:
Решить систему уравнений матричным методом. C++
C++ Решить систему алгебраических уравнений методом Гаусса
C++ Методом Гаусса решить систему n линейных алгебраических уравнений
C++ Решить систему линейных уравнений вида Ax=b методом Зейделя
C++ Вычисление корней системы уравнений методом Крамера
C++ Написать решение систем линейных уравнений методом Крамера
C++ Решить систему уравнений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.04.2011, 19:31     Решить систему уравнений методом Крамера #2
Детерминант. Должен для любой матрицы считать, учитывает нули в нехороших местах (на диагонали):
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
double det(double **matrix, size_t dim)
{
    double **copy;
    double result = 1.0;
    int sign = 1;
    bool key = true;
 
    copy = new double *[dim];
 
    for (size_t i = 0; i < dim; ++i)
    {
        copy[i] = new double [dim];
 
        for (size_t j = 0; j < dim; ++j)
            copy[i][j] = matrix[i][j];
    }
 
    for (size_t k = 0; k < dim; ++k)
    {
        if (copy[k][k] == 0.0)
        {
            key = false;
 
            for (size_t i = k + 1; i < dim; ++i)
            {
                if (copy[i][k] != 0.0)
                {
                    key = true;
 
                    std::swap(copy[k], copy[i]);
 
                    sign *= -1;
 
                    break;
                }
            }
        }
 
        if (!key)
            return 0.0;
            
        for (size_t i = k + 1; i < dim; ++i)
        {
            double multi = copy[i][k] / copy[k][k];
 
            for (size_t j = 0; j < dim; ++j)
                copy[i][j] -= multi * copy[k][j];
        }
 
        result *= copy[k][k];
    }
 
    for (size_t i = 0; i < dim; ++i)
        delete [] copy[i];
 
    delete [] copy;
 
    return sign * result;
}
Добавлено через 34 секунды
Ах ты чёрт, на сях же надо... Ну ничего, думаю, вы сами переделаете выделение памяти...
AlexSun
17 / 15 / 1
Регистрация: 03.11.2010
Сообщений: 169
10.04.2011, 23:19  [ТС]     Решить систему уравнений методом Крамера #3
Какое выделение памяти? Что это?

Нужно на C...
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.04.2011, 23:34     Решить систему уравнений методом Крамера #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
62
#define true 1
#define false 0
typedef char bool;
double det(double **matrix, size_t dim)
{
    double **copy;
    double result = 1.0;
    int sign = 1;
    bool key = true;
 
    copy = (double**)malloc(sizeof(double*)*dim);
 
    for (size_t i = 0; i < dim; ++i)
    {
        copy[i] = (double*)malloc(sizeof(double)*dim);
 
        for (size_t j = 0; j < dim; ++j)
            copy[i][j] = matrix[i][j];
    }
 
    for (size_t k = 0; k < dim; ++k)
    {
        if (copy[k][k] == 0.0)
        {
            key = false;
 
            for (size_t i = k + 1; i < dim; ++i)
            {
                if (copy[i][k] != 0.0)
                {
                    key = true;
                    double* tmp = copy[k];
                    copy[k] = copy[i];
                    copy[i] = tmp;
                    sign *= -1;
 
                    break;
                }
            }
        }
 
        if (!key)
            return 0.0;
            
        for (size_t i = k + 1; i < dim; ++i)
        {
            double multi = copy[i][k] / copy[k][k];
 
            for (size_t j = 0; j < dim; ++j)
                copy[i][j] -= multi * copy[k][j];
        }
 
        result *= copy[k][k];
    }
 
    for (size_t i = 0; i < dim; ++i)
        free(copy[i]);
 
    free(copy);
 
    return sign * result;
}
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.04.2011, 23:35     Решить систему уравнений методом Крамера #5
Цитата Сообщение от AlexSun Посмотреть сообщение
Нужно на C...
Цитата Сообщение от Maxwe11 Посмотреть сообщение
bool key = true;
Как бэ...
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.04.2011, 23:38     Решить систему уравнений методом Крамера #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Шок... Просто слов нет. Как вы ещё что-то там собирались с плюсов самостоятельно переписывать...
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
double det(double **matrix, unsigned dim)
{
    double **copy;
    double result = 1.0;
    int sign = 1;
    int key = 1;
    double *temp;
    double multi;
    unsigned i, j ,k;
 
    copy = (double **)malloc(dim * sizeof(double *));
 
    for (i = 0; i < dim; ++i)
    {
        copy[i] = (double *)malloc(dim * sizeof(double));
 
        for (j = 0; j < dim; ++j)
            copy[i][j] = matrix[i][j];
    }
 
    for (k = 0; k < dim; ++k)
    {
        if (copy[k][k] == 0.0)
        {
            key = 0;
 
            for (i = k + 1; i < dim; ++i)
            {
                if (copy[i][k] != 0.0)
                {
                    key = 1;
 
                    temp = copy[k];
                    copy[k] = copy[i];
                    copy[i] = temp;
 
                    sign *= -1;
 
                    break;
                }
            }
        }
 
        if (key == 0)
            return 0.0;
            
        for (i = k + 1; i < dim; ++i)
        {
            multi = copy[i][k] / copy[k][k];
 
            for (j = 0; j < dim; ++j)
                copy[i][j] -= multi * copy[k][j];
        }
 
        result *= copy[k][k];
    }
 
    for (i = 0; i < dim; ++i)
        free(copy[i]);
 
    free(copy);
 
    return sign * result;
}
Добавлено через 40 секунд
asics,
Цитата Сообщение от Maxwe11 Посмотреть сообщение
#define true 1
#define false 0
typedef char bool;
Как бэ)))

Добавлено через 1 минуту
Maxwe11, не заработает)))
double tmp = copy[k];
copy[k] - строка матрицы. Надо делать tmp типа double *.
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.04.2011, 23:39     Решить систему уравнений методом Крамера #7
Цитата Сообщение от Maxwe11 Посмотреть сообщение
#define true 1
#define false 0
typedef char bool;
Извиняюсь, не заметил
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2011, 23:40     Решить систему уравнений методом Крамера
Еще ссылки по теме:
Решить систему уравнений C++
C++ Решить систему уравнений
Решить систему уравнений C++
C++ Решить систему уравнений
C++ Решить систему уравнений

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

Или воспользуйтесь поиском по форуму:
AlexSun
17 / 15 / 1
Регистрация: 03.11.2010
Сообщений: 169
10.04.2011, 23:40  [ТС]     Решить систему уравнений методом Крамера #8
silent_1991, я просто раньше на PHP писал, там не нужно волноваться за память, за типы и так далее.
Теперь в Си все непривычно как-то

Осталось разобраться как оно работает (считает).
Как ей передавать матрицу? Каким массивом?
Что хранят переменная dim?
double **copy; // для копии?
double result = 1.0; // ну это понятно
int sign = 1; // знак? что за знак?
int key = 1; // ?
double *temp; // это тоже ясно
double multi; // ?
unsigned i, j ,k; // циклы
Yandex
Объявления
10.04.2011, 23:40     Решить систему уравнений методом Крамера
Ответ Создать тему
Опции темы

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