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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
#1

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

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

Мне очень нужен код программы для вычисления определителя матрицы до 10-го порядка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2014, 23:20     Код вычисления определителя матрицы до 10-го порядка
Посмотрите здесь:
C++ Улучшение алгоритма вычисления определителя матрицы, порядка n>3
C++ Нахождение определителя матрицы n-го порядка без рекурсии
Оптимизация алгоритма вычисления определителя матрицы C++
C++ Написать функцию для вычисления определителя матрицы
Создать функцию для вычисления определителя матрицы 2х2 C++
C++ Исправить код c++ ,нахождение определителя матрицы
Код для нахождения определителя матрицы N на N исключением строки и столбца C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S_el
2092 / 1599 / 306
Регистрация: 15.12.2013
Сообщений: 6,420
18.01.2014, 23:23     Код вычисления определителя матрицы до 10-го порядка #2
Что уже сделали?
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
18.01.2014, 23:34     Код вычисления определителя матрицы до 10-го порядка #3
S_el, на форуме зарегистрировался же
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
2092 / 1599 / 306
Регистрация: 15.12.2013
Сообщений: 6,420
19.01.2014, 00:14     Код вычисления определителя матрицы до 10-го порядка #5
И что это за код?
Может все-таки сами попробуете?
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
19.01.2014, 00:27  [ТС]     Код вычисления определителя матрицы до 10-го порядка #6
Это код решения системы уравнений Методом Гаусса.
В программировании я новичок, осваиваю при помощи самоучителей и справочников (Лафоре, Страуструп, Андрианова А.А., Динман М.). Но освоить удалось пока не много, поэтому разбираю в основном на примерах.
palva
2563 / 1785 / 252
Регистрация: 08.06.2007
Сообщений: 6,913
Записей в блоге: 4
19.01.2014, 03:29     Код вычисления определителя матрицы до 10-го порядка #7
Если вы изучаете самостоятельно, то советую взять книгу с упражнениями (Лафоре, например) и решать именно их.

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

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

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

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

P.s. Спасибо за замечания буду разбираться дальше.
palva
2563 / 1785 / 252
Регистрация: 08.06.2007
Сообщений: 6,913
Записей в блоге: 4
20.01.2014, 01:38     Код вычисления определителя матрицы до 10-го порядка #15
Цитата Сообщение от 19dmitry Посмотреть сообщение
но в условии дано, что задана матрица mxn, таким образом допускается, что пользователь может ввести и не квадратную матрицу
Странно, что мы до сих пор не увидели оригинального условия задачи.
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
20.01.2014, 01:46  [ТС]     Код вычисления определителя матрицы до 10-го порядка #16
Да, извините, вы правы, я всё напутал, это из примеров.
Вот непосредственно условие задачи:
написать программу для вычисления определителя матрицы заданного порядка (до 10-го).
palva
2563 / 1785 / 252
Регистрация: 08.06.2007
Сообщений: 6,913
Записей в блоге: 4
20.01.2014, 01:48     Код вычисления определителя матрицы до 10-го порядка #17
А условия, что делать Гауссом было?
19dmitry
33 / 33 / 13
Регистрация: 18.01.2014
Сообщений: 113
20.01.2014, 01:56  [ТС]     Код вычисления определителя матрицы до 10-го порядка #18
На форуме прочитал, будто код для вычисления определителя лучше реализовать через Метод Гаусса.
Лично мне удобнее всегда было пользоваться Правилом Саррюса, но можно ли воплотить его в код?
palva
2563 / 1785 / 252
Регистрация: 08.06.2007
Сообщений: 6,913
Записей в блоге: 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++
C++ Написать программу для поиска определителя до 10 порядка включительно
C++ Из матрицы n-го порядка получить матрицу порядка n-1, удалив из исходной матрицы указанные строки и столбцы
Метод Гаусса для вычисления определителя C++
C++ Сделать класс для вычисления определителя

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

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

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