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

Код вычисления определителя матрицы до 10-го порядка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
18.01.2014, 23:20     Код вычисления определителя матрицы до 10-го порядка #1
Мне очень нужен код программы для вычисления определителя матрицы до 10-го порядка.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S_el
1908 / 1503 / 296
Регистрация: 15.12.2013
Сообщений: 5,921
18.01.2014, 23:23     Код вычисления определителя матрицы до 10-го порядка #2
Что уже сделали?
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
18.01.2014, 23:34     Код вычисления определителя матрицы до 10-го порядка #3
S_el, на форуме зарегистрировался же
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
18.01.2014, 23:58  [ТС]     Код вычисления определителя матрицы до 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
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
#include <iostream>
#include <cmath>
#include <ctime>
 
using namespace std;
 
void Gauss(double *a, double *b, double *x,int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение.
{
 int i,j,k,t;
 double kof,s;
 double temp;
 for (i=n-1; i>0; --i) // Цикл по уравнениям - вычитаемым
 {
  for (t=i, j=i-1; j>=0; --j) //Ищем строку с максимальным в i-том столбце коэффициентом.
  {
   if (fabs(a[i*n+t])<fabs(a[i*n+j]))
   {
    t=j;
   }
  }
  if (a[i*n+t]==0.0)
  {
   return;
  }
  if (t!=i) // Если она не i-тая
  {
   for (k=n-1; k>=0; --k) // Меняем её с i-той
   {
    temp=a[k*n+t];
    a[k*n+t]=a[k*n+i];
    a[k*n+i]=temp;
   }
  }
  for (j=i-1; j>=0; --j) // Цикл пo уравнениям-уменьшаемым
  {
   kof=a[i+j*n]/a[i*n+i]; // kof=a[j][i]/a[i][i];
   for (a[i+j*n]=0.0, b[j]-=b[i]*kof, k=i-1; k>=0; --k) // Цикл по столбцам
   {
    a[k+j*n]-=a[k+i*n]*kof; // a[k][j]-=a[k][i]*kof
   }
  }
 }
 x=new double [n];
 if (x)
 {
  for (i=0; i<n; ++i)
  {
   for (s=0.0, j=i-1; j>=0; --j)
   {
    s+=a[j+i*n]*x[j]; //s+=a[j][i]*x[j]
   }
   x[i]=(b[i]-s)/a[i*n+i]; // x[i]=(b[i]-s)/a[i][i];
   //cout << x[i] << "\n";
  }
 }
 cout << "\n";
 for (i=0; i<n; ++i)
cout << "x " << x[i] << endl;
}
 
 
main()
{
srand((unsigned)time(NULL));
      int n = 6;
     double gauss2[6] ={1,5,3,7,6,3};
      double M[36]={0, 0, 1,0, 0, 0,0, 0, 0, -1, 0, 0,0, 8, 0, 0, 0, 4,0, 0, 0, 0, 6,0, 0, 6, 0, 0, 0, 0,1, 0, 0, 0, 0, 0 };
        
      double *y = new double[n];
 
    /*  for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                {
                    //cin >> M[i+j*n];
                     M[i+j*n] = rand()/100;
//cout << "gauss1["<< i << "][" << j << "]=";
//cin >> gauss1[i][j];
                }
        }
*/
for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                {
                     cout << M[i*n+j] << "  ";
                }
                cout << gauss2[i] << endl;
        }   
      Gauss(M,gauss2,y,n);
       cin.get();
}
S_el
1908 / 1503 / 296
Регистрация: 15.12.2013
Сообщений: 5,921
19.01.2014, 00:14     Код вычисления определителя матрицы до 10-го порядка #5
И что это за код?
Может все-таки сами попробуете?
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 00:27  [ТС]     Код вычисления определителя матрицы до 10-го порядка #6
Это код решения системы уравнений Методом Гаусса.
В программировании я новичок, осваиваю при помощи самоучителей и справочников (Лафоре, Страуструп, Андрианова А.А., Динман М.). Но освоить удалось пока не много, поэтому разбираю в основном на примерах.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
19.01.2014, 03:29     Код вычисления определителя матрицы до 10-го порядка #7
Если вы изучаете самостоятельно, то советую взять книгу с упражнениями (Лафоре, например) и решать именно их.

Если вы взяли вашу задачу из какой-то книги, то посмотрите к какой главе она относится, чтобы понять, какой материал вам надо использовать и закреплять на этой задаче. Судя по условию n<=10 здесь имеется в виду использование рекурсии и разложение определителя по строке.

Если вы берете код для образца, то не берите его из сомнительных источников. Разбирайте его только после того, как поймете идею алгоритма. Понять идею по описанию проще, чем понять ее по коду.

Если вы хотите делать методом Гаусса, который вообще-то предназначен для решения систем, то можно не выполняь его до конца, а проводить только прямой ход, перемножая главные элементы. Произведение главных элементов и будет определителем с учетом того, что при каждой перестановке строк у определителя меняется знак.

Добавлено через 1 час 7 минут
Цитата Сообщение от palva Посмотреть сообщение
Судя по условию n<=10 здесь имеется в виду...
Хотя может быть, это намек, что матрицу следует хранить в массиве с двумя индексами размером 10х10.
В коде, который вы выложили, матрица хранится в массиве с одним индексом.
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 12:26  [ТС]     Код вычисления определителя матрицы до 10-го порядка #8
Задача взята из моей контрольной работы, я учусь заочно на 1-м курсе,
начитка была всего 1 пара, где показали как включать VS C++2010,
скомпилировали программу "Hello World", вручили контрольную работу, благословили
и пустили в вольное плавание. Поэтому если встречали похожие примеры задач или
литературу где встречалось похожее условие буду очень признателен.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
19.01.2014, 12:33     Код вычисления определителя матрицы до 10-го порядка #9
А приводить матрицу к ступенчатому виду методом Гаусса вы умеете? Знаете, что происходит с определителем матрицы при элементарных преобразованиях?
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 13:04  [ТС]     Код вычисления определителя матрицы до 10-го порядка #10
Да, решать матрицы я умею, с математикой у меня порядок, а в программировании профан.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
19.01.2014, 13:36     Код вычисления определителя матрицы до 10-го порядка #11
Ну если ваш метод это не писать свой код, а разбираться в чужом, тогда разбирайтесь в том, что вы выложили.
Математику вы понимаете, а по программированию задавайте вопросы, что непонятно.
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 23:45  [ТС]     Код вычисления определителя матрицы до 10-го порядка #12
Пока что это всё, до чего додумался.
Код предназначенный для заполнения матрицы пользователем, но скомпилировать не могу - появляется ошибка "Run-Time Check Failure #3 - The variable 'N' is being used without being initialized.
- Переменная 'N' используется без инициализации." Вроде бы все переменные объявлены.
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
#include <stdarg.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale (LC_ALL,"RUS");
    int i,j,N,M;double *a;
 
    a = new double [N*M];
    for (i=0;i<N;i++)
    for (j=0;j<M;j++)
 
        cout<<"N="; cin>>N;
    
    if (N<=10)
    {
        cout<<"M="; cin>>M;
    }
    else
    {
        cout<<"число строк не должно превышать 10, введите другое число"; cin>>N;
    }
    
    cout<<"M="; cin>>M;
    if (M=N)
    {
        cout<<"введите матрицу А"<<endl;
    }
    else
    {
        cout<<"вы ввели не правильное число столбцов, оно должно равняться числу строк"; cin>>M;
    }
    {
        cin>>*(a+i*M+j);
    }
 
    delete []a;
    system("pause");
    return 0;
}
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.01.2014, 00:42     Код вычисления определителя матрицы до 10-го порядка #13
Цитата Сообщение от 19dmitry Посмотреть сообщение
Вроде бы все переменные объявлены.
А причем здесь объявлены? Им не присвоено значение, а они должны быть использованы. Это криминал.
Кроме того, они используются в вычислении размера статического массива, поэтому должны быть константами.
А почему вы используете две переменные? Для того, чтобы определитель мог быть вычислен, матрица должна быть квадратная, то есть M=N.
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
20.01.2014, 01:29  [ТС]     Код вычисления определителя матрицы до 10-го порядка #14
Совершенно верно, для вычисления определителя, матрица должна быть квадратная, но в условии дано, что задана матрица mxn, таким образом допускается, что пользователь может ввести и не квадратную матрицу. Именно это я и хотел предотвратить используя условные операторы if/else.

P.s. Спасибо за замечания буду разбираться дальше.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.01.2014, 01:38     Код вычисления определителя матрицы до 10-го порядка #15
Цитата Сообщение от 19dmitry Посмотреть сообщение
но в условии дано, что задана матрица mxn, таким образом допускается, что пользователь может ввести и не квадратную матрицу
Странно, что мы до сих пор не увидели оригинального условия задачи.
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
20.01.2014, 01:46  [ТС]     Код вычисления определителя матрицы до 10-го порядка #16
Да, извините, вы правы, я всё напутал, это из примеров.
Вот непосредственно условие задачи:
написать программу для вычисления определителя матрицы заданного порядка (до 10-го).
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.01.2014, 01:48     Код вычисления определителя матрицы до 10-го порядка #17
А условия, что делать Гауссом было?
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
20.01.2014, 01:56  [ТС]     Код вычисления определителя матрицы до 10-го порядка #18
На форуме прочитал, будто код для вычисления определителя лучше реализовать через Метод Гаусса.
Лично мне удобнее всегда было пользоваться Правилом Саррюса, но можно ли воплотить его в код?
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.01.2014, 02:30     Код вычисления определителя матрицы до 10-го порядка #19
Нашел у себя в загашнике метод Гаусса. Когда число правых частей m=0, то вычисляет определитель.
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
#include <iostream>
#include <cmath>
using namespace std;
 
int Gauss(double *aa, int n, int m, double *det, double eps)
#define a(i,j) aa[n*(j)+(i)]
{
    double e,p;
    int i,j,k,nm;
 
    *det=1.0;
    nm=n+m;
    for (i=0; i<n; i++) {
        e=0.0;
        for (j=i; j<n; j++)
        if ((p=fabs(a(j,i)))>e) {e=p; k=j;}
        if (e < eps) return i+1;
        if (k != i) {
            for (j=i; j<nm; j++) {
                p=a(i,j);
                a(i,j)=a(k,j);
                a(k,j)=p;
            }
            *det=-*det;
        }
        *det *= a(i,i);
        for (k=i+1; k<nm; k++) a(i,k) /= a(i,i);
        for (j = m!=0 ? 0 : i+1; j<n; j++) if (j != i) {
            p=a(j,i);
            for (k=i+1; k<nm; k++) a(j,k) -=a(i,k)*p;
        }
    }
    return 0;
}
 
double a[16]={
       1, -2,  3,  4,
       2,  1, -4,  3,
       3, -4, -1, -2,
       4,  3,  2, -1};
 
int main() {
    double det;
    int ret;
    ret=Gauss(a, 4, 0, &det, 0.000001);
    if(ret)
        det=0.0;
    cout << det << endl;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2014, 08:16     Код вычисления определителя матрицы до 10-го порядка
Еще ссылки по теме:

C++ Написать функцию для вычисления определителя матрицы
Код для нахождения определителя матрицы N на N исключением строки и столбца C++
Создать функцию для вычисления определителя матрицы 2х2 C++

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

Или воспользуйтесь поиском по форуму:
19dmitry
 Аватар для 19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
20.01.2014, 08:16  [ТС]     Код вычисления определителя матрицы до 10-го порядка #20
Спасибо, сейчас буду разбираться.
Yandex
Объявления
20.01.2014, 08:16     Код вычисления определителя матрицы до 10-го порядка
Ответ Создать тему
Опции темы

Текущее время: 16:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru