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

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

Войти
Регистрация
Восстановить пароль
 
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
#1

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

09.11.2012, 17:03. Просмотров 432. Ответов 0
Метки нет (Все метки)

Вообще у меня стоит задача такая:
Есть 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;
Вот так выглядела моя программа до обращения на форум. Как же обойтись без использования столь больших массивов я пока не придумал.Опустил часть кода, где описываются переменные, и вычисляется простая однамерная гистограмма, дисперсия и матожидание, так как с этим нет проблем.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2012, 17:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двухмерный динамический массив часть #3 (C++):

Двухмерный динамический массив - C++
Создать двухмерный динамический массив, найти сумму значокь его элементов,вывести на экран,массив заполняется с клавиатуры.спасибо ...

Двухмерный динамический массив - C++
a=new int* for(int i=0;i&lt;m;i++) a=new int; Вот создание двухмерного динамического массива.Начеркал небольшой рисунок с...

двухмерный динамический массив - C++
задание было такое: Найти количество отрицательных и положительных элементов массива. Массив в памяти разместить динамически (с...

Динамический двухмерный массив - C++
Нужно сделать динамический двухмерный массив. 1. n столбиков и m строчек нужно задавать самому 2. массив должен записываться и...

Двухмерный динамический массив - C++
Мне нужно создать 4 многомерных динамических массивов, размерность которых 10000000 10000000, и у меня не получалось их создавать на...

Двухмерный динамический массив - C++
Ребята, подскажите пожалуйста, необходимо создать двухмерный динамический массив. Его размерность должна быть 10000000 на 10000000....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 17:03
Привет! Вот еще темы с ответами:

Динамический двухмерный массив - C++
ИМХО директива include предназначена для включения документа в тело JSP НА ЭТАПЕ ТРАНСЛЯЦИИ JSP В СЕРВЛЕТ , а не во время выполнения ,...

Двухмерный динамический массив строк - C++
Всем привет) Помогите пожалуйста создать двумерный динамический массив строк, почитал Подбельского, вроде сделала всё как по учебнику, но...

Указатель на двухмерный динамический массив - C++
Друзья, нужна Ваша помощь! Создаю одномерный динамический, создаю указатель на него (вернее на его первый эл-т). То же самое пытаюсь...

Динамический двухмерный массив (создать матрицу) - C++
Меня немного клинит, хочу уточнить. Задача заключается в том, чтобы создать двухмерный массив: матрицу размером 4 на 7 (4 строки, 7...


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

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

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