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

Двухмерный динамический массив часть #3 - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Определение времени года по месяцу http://www.cyberforum.ru/cpp-beginners/thread693147.html
Народ помогите кто знает язык. Нужно написать программу: "Определение времени года по месяцу". Очень нужно, заранее благодарен. П.с. в аудиториях работаем на Visual Studio 2006 (просто думаю что на разных версиях пишутся немного по разному..)
C++ Выполнил задачу. Укажите на недочеты Здравствуйте уважаемые форумчане хотелось бы что-бы вы помогли найти недочеты или поизящнее решить программу(задачу можно увидеть во вложении): #include "std_lib_facilities.h" int main() { setlocale( LC_ALL,"Russian" ); int m1, m2, m3, m4, m5, m6; double summa; cout << "Введите количество 1-центовых монет\n\t\t\t\t\t\t\t\t\t"; http://www.cyberforum.ru/cpp-beginners/thread693136.html
C++ Двумерная динамическая матрица
в общем помогите, надо написать двумерный массив(int) динамическим и пару функций к нему: 1. удаление столбца 2. удаление строки 3. добавление столбца 4. добавление строки в исходном состоянии должен быть размер 1х1 пожалуйста! Добавлено через 2 минуты
C++ Структура и осуществление доступа к ее элементам
Получить программную реализацию задачи обработки таблицы дан- ных. Таблица должна представлять собой массив элементов соответствую- щего вида. Таблица считается заданной, то есть значения элементов табли- цы указываются непосредственно в тексте программы. В таблице собраны сведения об успеваемости студентов одной группы по некоторой дисциплине. Информация об отдельном студенте включает в...
C++ Поясните по указателям http://www.cyberforum.ru/cpp-beginners/thread693120.html
Добрый день товарищи. У меня вопрос: #include <iostream> using namespace std; int main() {
C++ Динамический массив структур Необходимо создать структуру, и сделать динамический массив структур. Фиксированный массив получается сделать, а вот с динамическим массивом где-то ошибка. Подскажите, пожалуйста, где ошибка. #include <iostream> using namespace std; int mysize=3; struct movies { подробнее

Показать сообщение отдельно
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 17:03     Двухмерный динамический массив часть #3
Вообще у меня стоит задача такая:
Есть 3 уравнения, полученных по средством численного метода Эйлера, стохастические, дифференциальные с мультипликативным шумом,их нужно промоделировать, и построить разные графики такие как : оценку матожидания, оценку дисперсии, гистограмму плотности распределения случайной величины, двухмерную гистограмму, тоесть поверхность, и двухмерный фазовый портрет. Всё выше перечисленное относиться к области теории вероятности, методам Монте-Карло, и вычислительной математике.
3 уравнения записаны в явном виде, и для их реализации нужно смоделировать M=1000(чеб больше траекторий тем точнее решается задача) штук траекторий для каждого уравнения, где 1 траектория моделируется как правило на сетке от T=[0,100] с шагом h=0,0001(чем меньше шаг,тем более точно получается расчет).
Оценку матожидания, оценку дисперсии, гистограмму плотности распределения случайной величины я строить умею, и для реализации использовал одномерные массивы, но когда речь пошла о реализации двухмерного фазового портрета то тут я решил использовать двухмерные массивы.
Что такое двумерная плотность: Берется срез в произвольном узле например при T=70 и на каждой из 1000 траекторий запоминаются значения, например y1, аналогично запоминается значения переменной y2, и того получилось 1000 значений y1 и 1000 значений y2. Построение 2мерной плотности происходит следующим образом, ищется максимальное и минимальное значение y1 и y2, задается разбиение сетки например hag=100. рисуется сетка 100 на 100 с шагом (max-min)/hag. Далее берется первая траектория и соответствующая точка на ней (y1,y2) и смотрим в какой квадрат нашей сетки она попала, и двумерному массиву размер которого 100 на 100 соответствующим координатам присваиваем 1 count[i][j]=count[i][j]+1. В итоге в этом двумерном массиве хранятся количество попаданий точек (y1,y2) в соответствующий квадрат сетки, и получается 3х емрная поверхность.
Что такое двухмерный фазовый портрет: вот тут как раз нужно проделать примерно то же что и выше, разница только в том что выше учитывалась 1 точка на 1 траектории 1го уравнения, а здесь нужно запомнить все точки на 1 траектории, то есть после построения 1 траектории пар (y1,y2) будет 1000000, которые я как раз решил сохранять в двумерный массив, то есть для компоненты y1 один двумерный массив размер которого 1000000x1000, и аналогично для компоненты y2. далее так же идет перебор, нахождения min и max, задается количество разбиения и строиться 2мерный массив с количеством попаданий соответствующих пар (y1,y2) в построенную сетку.И получается трехмерная картинка.
Так как я не опытный программист, первое что пришло в голову всё это реализовывать с помощью двухмерного массива.О других способах ещё не думал, как обойтись без них.
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
 h=0.001;
 T=100;
 N= int(T/h);
 M=100;
 sigma=3;
 nach_y1=1;
 nach_y2=1;
 nach_y3=20;
 r=19;
 pi= 2*asin(1.0);
 hag=100;  //колличество интервалов разбиения для построения гистограммы
 hag1=50; //колличество интервалов разбиения для построения двухмерной гистограммы
           /*-----------------------------------------*/
 
 
 y1 =(double*)malloc(N*sizeof(double)); //Массив для расчета нужных функционалов
 y2 =(double*)malloc(N*sizeof(double)); //
 y3=(double*)malloc(N*sizeof(double));  //
 summ =(double*)malloc(N*sizeof(double));//Массив для вторых моментов
 x_x = (double*)malloc(N*sizeof(double));//Массив для расчета матожидания
 disper = (double*)malloc(N*sizeof(double));//Массив для расчета дисперсии
 gistogr = (double*)malloc(M*sizeof(double));// Массив для расчета гистограммы
 gistogr2 = (double*)malloc(M*sizeof(double));//Вспомогательный массив для расчета двумерной гистограммы
 gistogr2_1 = (double*)malloc(M*sizeof(double));//Вспомогательный массив для расчета двумерной гистограммы
 
 
   yy1 = new double*[N]; //Вспомогательный 2-мерный Массив N*M данных для расчета 2-мерного фазового портрета
    for(int k= 0; k < N; k++)
        yy1[k] = new double [M];
 
    yy3 = new double*[N];//
    for(int k= 0; k < N; k++)
        yy3[k] = new double [M];
 
    for (int i = 0; i < N; i++) //Обнуление массивов
        for (int k = 0; k <M ; k++)
        {
         yy1[i][k]=0;
         yy3[i][k]=0;
        }
 
    for (int i = 0; i < N; i++)//Обнуление массивов
         {
                y1[i]=0;
                y2[i]=0;
                y3[i]=0;
                summ[i]=0;
                x_x[i]=0;
         }
 
 
   for (int i = 0; i < M; i++)
   {
      gistogr[i]=0;
      gistogr2[i]=0;
      gistogr2_1[i]=0;
    }
 
     for (int k = 0; k < M; k++)//ВВод начальных условий в 2-мерные массивы
        {
         yy1[0][k]=nach_y1;
         yy3[0][k]=nach_y3;
        }
 
 
 for(int j = 1; j <= M; j++)//цыкл для моделирования M штук траекторий
          {
       y1[0] = nach_y1;
       y2[0] = nach_y2;
       y3[0] = nach_y3;
       x_x[0] = x_x[0]+y1[0]/M;
       summ[0]=summ[0]+(double)(y1[0]*y1[0])/M;
 
    for(int i=0; i<N; i++)//цыкл для моделирования 1 траектории
         {
 
     alfa1 = (double)rand()/(double)RAND_MAX;
        while(alfa1 == 0)
            alfa1 = (double)rand()/(double)RAND_MAX;
     alfa2 = (double)rand()/(double)RAND_MAX;
     ksi = sqrt(-2*log(alfa1))*sin(2*pi*alfa2);//моделирование гаусовской случайной величины
 
    y1[i+1] = y1[i]-h*10*(y1[i]-y2[i]);
    y2[i+1] = y2[i]+h*(-y2[i]-y1[i]*y3[i]+r*y1[i])+sigma*y1[i]*(sqrt(h))*ksi;
    y3[i+1] = y3[i]+h*(-(8/3)*y3[i]+y1[i]*y2[i]);
 
    x_x[i+1]=x_x[i+1]+y1[i+1]/M; //Расчитывается оценка математического ожидания
    summ[i+1]=summ[i+1]+(double)(y1[i+1]*y1[i+1])/M;//Расчитывается второй момент
 
     yy1[i][j]=y1[i+1]; //Заполнение вспомогательных массивов для построения 2-мерного фазового портрета
     yy3[i][j]=y3[i+1]; //
 
   }
     gistogr2[j-1]=y1[N-1];
     gistogr2_1[j-1]=y3[N-1];
   }
 
  /*---------------Начало построения дмумерной плотности---------------*/
     MIN=gistogr2[0];
   MAX=MIN;
   MIN1=gistogr2_1[0];
   MAX1=MIN1;
   for (int i=1; i <M; i++)
    {
        if (gistogr2[i]<MIN)
        {
             MIN=gistogr2[i];
        }
 
        if (gistogr2[i]>MAX)
        {
            MAX=gistogr2[i];
        }
 
        if (gistogr2_1[i]<MIN1)
        {
             MIN1=gistogr2_1[i];
        }
 
        if (gistogr2_1[i]>MAX1)
        {
            MAX1=gistogr2_1[i];
        }
    }
 
      a=MIN;
      b=MAX;
      a1=MIN1;
      b1=MAX1;
 
   double **count1;
 
    count1 = new double*[hag1];
    for(int k= 0; k < hag1; k++)
        count1[k] = new double [hag1];
 
      for (int i = 0; i < hag1; i++)
        for (int k = 0; k < hag1; k++)
        {
         count1[i][k]=0;
        }
 
      double const1,const2;
      const1=double((b-a)/hag1);
      const2=double((b1-a1)/hag1);
 
    double *setka2_0, *setka2_1;
    setka2_0=(double*)malloc(hag*sizeof(double));
    setka2_1=(double*)malloc(hag*sizeof(double));
    setka2_0[0]=a;
    setka2_1[0]=a1;
 
    for (int j = 0; j < hag1; j++)
    {
        setka2_0[j+1]=setka2_0[j]+const1;
        setka2_1[j+1]=setka2_1[j]+const2;
    }
 
     int X,Y;
     X=hag1;
     Y=hag1;
 
  for (int j=0; j < M; j++)
  {
   for (int i=0; i < X; i++)
     {
     if ((setka2_0[i]<=gistogr2[j]) && (gistogr2[j]<=setka2_0[i+1]))
         X=i;
     }
   for (int k=0; k < Y; k++)
     {
     if  ((setka2_1[k]<=gistogr2_1[j]) && (gistogr2_1[j]<=setka2_1[k+1]))
         Y=k;
     }
 
      count1[X][Y]= count1[X][Y]+1;
      X=hag1;
      Y=hag1;
 
   }
 
     FILE * SETKA2_0;
     FILE * SETKA2_1;
     SETKA2_0 = fopen("Сетка_для_построения_двухмерной_гистограммы_ось_абсцисс.txt","wt");
     SETKA2_1 = fopen("Сетка_для_построения_двухмерной_гистограммы_ось_ординат.txt","wt");
        for (int j = 0; j < hag1; j++)
        {
          fprintf( SETKA2_0, "%f " , setka2_0[j] );
          fprintf( SETKA2_1, "%f " , setka2_1[j] );
        }
     fclose(SETKA2_0);
     fclose(SETKA2_1);
 
 
 
    int peremennaya1;
    peremennaya1=0;
 
     FILE * MATRICA;
     MATRICA = fopen("Матрица_для_построения_двумерной_плотности.txt","wt");
 
 
     for (int i = 0; i < hag1; i++)
       {
        for (int k = 0; k < hag1; k++)
        {
          peremennaya1= count1[i][k];
          fprintf( MATRICA, "%d " , peremennaya1 );
        }
          fprintf( MATRICA, "\n");
       }
  fclose(MATRICA);
 
 /*----------Начало построения 2хмерного фазового портрета----------*/
 
   double *setka3_0, *setka3_1;
 double C,D,C1,D1;
 int hag2;
 double minn,maxx,minn1,maxx1;
   minn=yy1[0][0];
   maxx=minn;
   minn1=yy3[0][0];
   maxx1=minn1;
  for (int k = 1; k < M; k++)
  {
   for (int i=1; i <N; i++)
    {
        if (yy1[i][k]<minn)
        {
             minn=yy1[i][k];
        }
 
        if (yy1[i][k]>maxx)
        {
            maxx=yy1[i][k];
        }
 
        if (yy3[i][k]<minn1)
        {
             minn1=yy3[i][k];
        }
 
        if (yy3[i][k]>maxx1)
        {
            maxx1=yy3[i][k];
        }
    }
    }
 
  C=minn;
  D=maxx;
  C1=minn1;
  D1=maxx1;
 
 
   FILE * portret;
    portret = fopen ("FAZOVYI_Portret_MinMax.txt","wt");
    fprintf( portret, "%f " , C );
    fprintf( portret, "%f " , D );
  fclose(portret);
 
   FILE * portret1;
  portret1 = fopen("FAZOVYI_portet_Min1,Max1.txt","wt");
   fprintf( portret1, "%f " , C1);
     fprintf( portret1, "%f " , D1);
  fclose(portret);
 
  hag2=100;
   double **count2;
 
    count2 = new double*[hag2];
    for(int k= 0; k < hag; k++)
        count2[k] = new double [hag2];
 
      for (int i = 0; i < hag2; i++)
        for (int k = 0; k < hag2; k++)
        {
         count2[i][k]=0;
        }
 
      double const3,const4;
      const3=double((C-D)/hag2);
      const4=double((C1-D1)/hag2);
 
 
 
 
    setka3_0=(double*)malloc(hag2*sizeof(double));
    setka3_1=(double*)malloc(hag2*sizeof(double));
    setka3_0[0]=C;
    setka3_1[0]=C1;
 
    for (int j = 0; j < hag2; j++)
    {
        setka3_0[j+1]=setka3_0[j]+const1;
        setka3_1[j+1]=setka3_1[j]+const2;
 
    }
 
    int X2,Y2;
     X2=hag2;
     Y2=hag2;
 
  for (int o = 0; o < M; o++)
  {
     for (int j=0; j <N; j++)
     {
  for (int i=0; i < X2; i++)
     {
     if ((setka3_0[i]<=yy1[j][o]) && (yy1[j][o]<=setka3_0[i+1]))
         X2=i;
     }
  for (int k=0; k < Y2; k++)
     {
     if  ((setka3_1[k]<=yy3[j][o]) && (yy3[j][o]<=setka3_1[k+1]))
         Y2=k;
 
     }
 
      count2[X][Y]= count2[X][Y]+1;
      X2=hag2;
      Y2=hag2;
 
    }
     }
    int peremennaya2;
     peremennaya2=0;
 
     FILE * MATRICA1;
     MATRICA = fopen("FAZOVYI_PORTRET.txt","wt");
 
 
     for (int i = 0; i < hag2; i++)
       {
        for (int k = 0; k < hag2; k++)
        {
          peremennaya2= count2[i][k];
          fprintf( MATRICA1, "%d " , peremennaya2 );
        }
          fprintf( MATRICA1, "\n");
    }
  fclose(MATRICA1);
 
  for(int k= 0; k < N; k++)
      {
        delete [] yy1[k];
        delete [] yy3[k];
      }
        delete [] yy1;
        delete [] yy3;
  for(int k= 0; k < hag1; k++)
   {
    delete [] count1[k];
   }
    delete [] count1;
 
  for(int k= 0; k < hag2; k++)
   {
    delete [] count2[k];
   }
    delete [] count2;
Вот так выглядела моя программа до обращения на форум. Как же обойтись без использования столь больших массивов я пока не придумал.Опустил часть кода, где описываются переменные, и вычисляется простая однамерная гистограмма, дисперсия и матожидание, так как с этим нет проблем.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru