Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
1

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

18.01.2014, 23:20. Показов 7830. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне очень нужен код программы для вычисления определителя матрицы до 10-го порядка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2014, 23:20
Ответы с готовыми решениями:

Улучшение алгоритма вычисления определителя матрицы, порядка n>3
Всем доброго времени суток, я достаточно долго искал шаблон кода для вычисления определителя...

Составить приложение для вычисления определителя матрицы n-го порядка
Помогите, пожалуйста, составить приложение для вычисления матрицы n-го порядка. Вроде-бы простая...

Вычислить определитель 4 порядка, используя метод треугольника для вычисления определителя 3 порядка
Помогите разобраться, программа должна вычислять определитель 4 порядка, используя метод...

Составить функцию для вычисления определителя третьего порядка
Составить функцию для вычисления определителя третьего порядка: а11 а12 а13 а21 а22 а23...

19
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
18.01.2014, 23:23 2
Что уже сделали?
0
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
18.01.2014, 23:34 3
S_el, на форуме зарегистрировался же
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
18.01.2014, 23:58  [ТС] 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();
}
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
19.01.2014, 00:14 5
И что это за код?
Может все-таки сами попробуете?
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
19.01.2014, 00:27  [ТС] 6
Это код решения системы уравнений Методом Гаусса.
В программировании я новичок, осваиваю при помощи самоучителей и справочников (Лафоре, Страуструп, Андрианова А.А., Динман М.). Но освоить удалось пока не много, поэтому разбираю в основном на примерах.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
19.01.2014, 03:29 7
Если вы изучаете самостоятельно, то советую взять книгу с упражнениями (Лафоре, например) и решать именно их.

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

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

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

Добавлено через 1 час 7 минут
Цитата Сообщение от palva Посмотреть сообщение
Судя по условию n<=10 здесь имеется в виду...
Хотя может быть, это намек, что матрицу следует хранить в массиве с двумя индексами размером 10х10.
В коде, который вы выложили, матрица хранится в массиве с одним индексом.
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
19.01.2014, 12:26  [ТС] 8
Задача взята из моей контрольной работы, я учусь заочно на 1-м курсе,
начитка была всего 1 пара, где показали как включать VS C++2010,
скомпилировали программу "Hello World", вручили контрольную работу, благословили
и пустили в вольное плавание. Поэтому если встречали похожие примеры задач или
литературу где встречалось похожее условие буду очень признателен.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
19.01.2014, 12:33 9
А приводить матрицу к ступенчатому виду методом Гаусса вы умеете? Знаете, что происходит с определителем матрицы при элементарных преобразованиях?
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
19.01.2014, 13:04  [ТС] 10
Да, решать матрицы я умею, с математикой у меня порядок, а в программировании профан.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
19.01.2014, 13:36 11
Ну если ваш метод это не писать свой код, а разбираться в чужом, тогда разбирайтесь в том, что вы выложили.
Математику вы понимаете, а по программированию задавайте вопросы, что непонятно.
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
19.01.2014, 23:45  [ТС] 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;
}
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.01.2014, 00:42 13
Цитата Сообщение от 19dmitry Посмотреть сообщение
Вроде бы все переменные объявлены.
А причем здесь объявлены? Им не присвоено значение, а они должны быть использованы. Это криминал.
Кроме того, они используются в вычислении размера статического массива, поэтому должны быть константами.
А почему вы используете две переменные? Для того, чтобы определитель мог быть вычислен, матрица должна быть квадратная, то есть M=N.
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
20.01.2014, 01:29  [ТС] 14
Совершенно верно, для вычисления определителя, матрица должна быть квадратная, но в условии дано, что задана матрица mxn, таким образом допускается, что пользователь может ввести и не квадратную матрицу. Именно это я и хотел предотвратить используя условные операторы if/else.

P.s. Спасибо за замечания буду разбираться дальше.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.01.2014, 01:38 15
Цитата Сообщение от 19dmitry Посмотреть сообщение
но в условии дано, что задана матрица mxn, таким образом допускается, что пользователь может ввести и не квадратную матрицу
Странно, что мы до сих пор не увидели оригинального условия задачи.
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
20.01.2014, 01:46  [ТС] 16
Да, извините, вы правы, я всё напутал, это из примеров.
Вот непосредственно условие задачи:
написать программу для вычисления определителя матрицы заданного порядка (до 10-го).
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.01.2014, 01:48 17
А условия, что делать Гауссом было?
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
20.01.2014, 01:56  [ТС] 18
На форуме прочитал, будто код для вычисления определителя лучше реализовать через Метод Гаусса.
Лично мне удобнее всегда было пользоваться Правилом Саррюса, но можно ли воплотить его в код?
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
20.01.2014, 02:30 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;
}
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
20.01.2014, 08:16  [ТС] 20
Спасибо, сейчас буду разбираться.
0
20.01.2014, 08:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2014, 08:16
Помогаю со студенческими работами здесь

Составить программный код для вычисления матрицы 5-го порядка
Помогите, пожалуйста, составить программный код для вычисления матрицы 5-го порядка(Visual...

Расчет определителя матрицы n-порядка
Здравствуйте. В задании требовалось найти определитель n-порядка. Решение прилагаю. Помогите...

Вычисление определителя матрицы 4-го порядка
Помогите пожалуйста решить данную задачу, точнее ее часть: Задание 2.3 Создайте функции...

Вычисление определителя матрицы 3-го порядка
Нужно вычислить определитель матрицы 3 порядка.Ввод с клавиатуры.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru