Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Fedor N
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 17
#1

Программа для решения СЛАУ - C++

22.06.2012, 13:39. Просмотров 1215. Ответов 4
Метки нет (Все метки)

Здравствуйте,в общем, моя программа решает СЛАУ матричным методом, на основе библиотеки Matrixclass, программа вылетает из-за привышения размера матрицы. И я не могу понять, где ошибка!? Помогите, пожалуйста! В приложенном файле Main, библиотека Matrixclass.h, exe.

Matrixclass.h
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
#include <iostream>
#include <stdlib.h>
#include <conio.h>
 
using namespace std;
 
enum ElemStatus {minimal=-5000, maximal};
enum Action {sum=-6000, prod};
enum ConvertType{row, column};
class Matrix
{
    private:
        // Размеры массива
        unsigned xsize, ysize;
        // Указатель на начало массива в динамической памяти
        double *Array;
      // Флаг временности
      int temporary;
    public:
        // Возвратить размеры матрицы
        unsigned getxsize(void) {return xsize;}
        unsigned getysize(void) {return ysize;}
        void inversion(Matrix &, unsigned);
        // конструктор, заполняет матрицу
        Matrix(unsigned y , unsigned x );
        Matrix(unsigned y , unsigned x , double v );
        // конструктор копирования
        Matrix(Matrix &);
      // Конструктор "скалярной матрицы" xsize=ysize=1
        Matrix(double v);
        // деструктор, вывод "!" для отслеживания вызовов
        //~Matrix(){delete []Array; cout << "!";}
        // "Примитивный" вывод
        void show(void);
      // Последовательный доступ к элементу
      double & operator()(unsigned n) const;
       Matrix & operator*(Matrix& M);
       Matrix & operator()(unsigned n, unsigned v)
       {
           Array[n]=v;
       }
};
 
Matrix::Matrix(unsigned y, unsigned x)
{
    unsigned asize = x*y;
    double v;
    Array = new double[asize];
    xsize = x;
    ysize = y;
   temporary = 0;
    for(unsigned i = 0; i<asize; i++) {
                                  cout<<"Enter "<< i+1 <<" elemet ";
                                  cin>>v;
                                  Array[i] = v;
                                  }
}
 
void inversion(Matrix &A, unsigned N)
{
    unsigned temp;
    unsigned p[2];
 
    double **E = new double *[N];
 
    for (int i = 0; i < N; i++)
        E[i] = new double [N];
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            E[i][j] = 0.0;
 
            if (i == j)
                E[i][j] = 1.0;
        }
 
    for (unsigned k = 0; k < N; k++)
    {
        temp = A(k+k);
 
        for (unsigned j = 0; j < N; j++)
        {
            //A.Array[k*j] /= temp;
          A((k*N+j),(A(k*j)/ temp));
            E[k][j] /= temp;
        }
 
        for (unsigned i = k + 1; i < N; i++)
        {
            temp = A(k*i);
 
            for (unsigned j = 0; j < N; j++)
            {
               // A.Array[i*j] -= A(k*j)* temp;
                A((i*N+j),(A(i*j)-(A(k*j)* temp)));
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (unsigned k = N - 1; k > 0; k--)
    {
        for (unsigned i = k - 1; i >= 0; i--)
        {
            temp = A(k*i);
 
            for (unsigned j = 0; j < N; j++)
            {
              // A.Array[i*j] -= A(k*j) * temp;
              A((i*N+j),(A(i*j)-(A(k*j)* temp)));
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (unsigned i = 0; i < N; i++)
        for (unsigned j = 0; j < N; j++)
         //  A.Array[i*j] = E[i][j];
         {
      A((i*j),E[i][j]);
         }
 
    for (int i = 0; i < N; i++)
        delete [] E[i];
 
    delete [] E;
}
 
Matrix::Matrix(Matrix & M)
{
    xsize = M.xsize;
    ysize = M.ysize;
    unsigned asize = xsize*ysize;
    Array = new double[asize];
            // вычисляем определитель раскладывая по нулевой строке
            for(int k=0; k<asize; k++)
            {
                // заполняем вспомогательную матрицу
                // строки берем из основной матрицы все кроме нулевой
                // столбцы все кроме k-го
                for (unsigned i=0; i<asize-1; i++)
                    for(unsigned j=0; j<asize-1; j++)
                    {
                        if(j<k)
Array[i*j]=M(j*(i+1));
                        else Array[i*j]=M((i+1)*(j+1));
                    };
   temporary = 0;
    if (M.temporary) delete &M;
}
}
 
Matrix::Matrix( double v)
{
    xsize = ysize = 1;
   Array = new double;
    *Array = v;
   temporary = 0;
}
 
void Matrix::show(void)
{
    cout << '\n';
    for (int i = 0; i<ysize; i++)
   {
        for (int j = 0; j<xsize; j++)
                cout << Array[i*xsize+j]<< '\t';
        cout << '\n';
   }
    if (temporary) delete this;
}
double & Matrix::operator()(unsigned n) const
{
    if (n > xsize*ysize)
   {
       cerr << "Index exceeds matrix dimensions!";
       exit(1);
   }
    if (temporary)
   {
       cerr << "Operation is not allowed!";
       exit(1);
   }
    return Array[n-1];
}
 Matrix & Matrix::operator*(Matrix& M)
 {
  // double a;
   if(ysize==M.xsize)
   //реализация алгоритма перемножения матриц
      for(int i=0;i<ysize;i++)
         for(int j=0;j<M.xsize;j++)
            for(int k=0;k<ysize;k++)
               M(i*j) += Array[i*k]*M(k*j);
   else cout<<"Размерности матриц не верны"<<endl;
   return M ;
 
}
 
Matrix::Matrix(unsigned y, unsigned x, double v)
{
   temporary = 0;
     Array[y*x] = v;
}
main()
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
#include <iostream>
#include <conio.h>
#include "Matrixclass.h"
 
using namespace std;
 
int main()
{
   unsigned n;
   cout<<"Enter size matrix: ";
   cin>>n;
   cout<<"Input matrix: "<<endl;
   Matrix A(n,n);
   cout<<"Output matrix: "<<endl;
   A.show();
   cout<<"Output inversion matrix "<<endl;
   inversion(A,n);
   A.show();
   cout<<"Output matrix free elements"<<endl;
   Matrix B(n,1);
   A*B;
   cout<<"Output solution"<<endl;
   B.show();
   cin>>n;
   return 0;
   getch();
 
}
0
Вложения
Тип файла: rar Курсовая.rar (185.7 Кб, 20 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2012, 13:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программа для решения СЛАУ (C++):

Программа для решения слау методом главных элементов для всеразмерной матрицы - C++
Вот написал программу для решения слау методом главных элементов для всеразмерной матрицы, вобщем вот в чём проблема при получении новой...

доделать программу для решения СЛАУ - C++
Ребят, помогите пожалуйста, есть программа для решения СЛАУ методом гаусса, но ту слау, которую необходимо решить мне по заданию она не...

Метод Гаусса для решения СЛАУ - C++
Здравствуйте! У меня есть алгоритм решения СЛАУ методом Гаусса, но почему-то он не работает((( Я проверил промежуточные матрицы, все ОК! И...

Метод Холецкого для решения Слау - C++
Ты не мог бы выложить программу?

Метод Зейделя для решения слау - C++
Пытаюсь реализовать метод Зейделя, подсмотрев реализацию в Википедии, написала функцию Itera(). Она не рабочая, не считает ничего....

Метод простых итераций для решения СЛАУ - C++
Здравствуйте. Попытался сделать программу для решения СЛАУ методом простых итераций. Не работает. Вернее работает неправильно. Помогите...

4
programm1r
46 / 45 / 1
Регистрация: 19.06.2012
Сообщений: 134
22.06.2012, 17:24 #2
Цитата Сообщение от Fedor N Посмотреть сообщение
C++
1
void Matrix::show(void) { ... } if (temporary) delete this; }
Не понятно для чего, поясните? Может не внимательно посмотрел, но ни где не нашел в приведенном коде установку temporary... В архив не заглядывал.
0
Fedor N
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 17
22.06.2012, 19:16  [ТС] #3
Компонентная функция show предназначена для организации простейшего вывода матрицы на экран. Если выводится «временный» объект, – например, по вызову (A+B).show(), то после вывода он уничтожается.
0
Fedor N
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 17
26.06.2012, 15:41  [ТС] #4
Пришлось полностью все переделывать. Тема не актуальна)
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.06.2012, 16:31 #5
Fedor N, посмотри сюда
класс Матрица
Способы решения СЛАУ
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 16:31
Привет! Вот еще темы с ответами:

Метод простых итераций для решения СЛАУ - C++
Здравствуйте. Есть функция, реализующая метод простых итераций: void ProstIterMetode() {int i,j; double *x0,delta,*E; x0=new...

Разработка параллельных алгоритмов для решения СЛАУ - C++
Пишу курсовую на тему &quot;Разработка параллельных алгоритмов для решения СЛАУ&quot; У кого-нибудь есть что либо &quot;работающее&quot; по этой теме...

Метод простых итераций для решения СЛАУ - C++
Доброго времени суток. Если у кого нибудь есть готовые программы для данного метода, скиньте пожалуйста. Особенно написанные на Borland C++.

Метод простых итераций для решения СЛАУ - C++
Всем добрый вечер! Столкнулся с заданием на тему решения СЛАУ методом простых итераций и Зейделя. В итоге завис с первым методом:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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