Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Стохастический_мир.pdf
Скачиваний:
150
Добавлен:
16.03.2016
Размер:
2.96 Mб
Скачать

258

Глава 9.

9.6Вычисление средних

Привед¼м простой алгоритм вычисления средних характеристик процесса по совокупности выборочных траекторий. Для этого введ¼м массивы среднего значения и волатильности, табулированные в num точ- ках. Для определения распределения вероятностей будем подсчитывать частоту попадания в данный момент времени траектории в один из m подынтервалов в интервале между min и max. Для этого введ¼м двухмерный массив p. Первый его индекс будет соответствовать табулированному с шагом step времени, а второй номеру интервала.

Все эти объявления имеют вид:

# include

" stat . cpp "

// ôàéë ñ RndG ( )

inline Float a( Float x , Float t ){ return 0; } // ñíîñ

inline Float b( Float x ,

Float t ){ return sqrt (1+ x*x ); } // волат .

void main ()

 

 

 

 

{

 

 

 

 

 

SRnd ( time (0));

// " встряхиваем " генератор

Float

x0 =0;

 

// начальное значение x

Float

t0 =0;

 

// в момент времени t

Float

step = 0.1;

// шаг по времени для табуляции x

const

int

num

= 100; //

число точек табуляцмм

int lag =

1000;

// дроблений шага

Float

dt = step /lag , sqrt_dt = sqrt ( dt );

const

int

m

= 100; //

число точек гистограммы

Float

min = -1 ,

max =1; //

диапазон для гистограммы

Float

w=max - min ;

 

 

Float

av [ num +1] , di [ num +1];

Float

p[ num +1][ m ];

//

гистрограмма

for ( int k =0;

k <= num ;

k ++){

av [k ]= di [k ]=0;

 

 

for ( int i =0; i <m;

i ++) p[k ][ i ]=0;

}

 

 

 

 

 

av [0]= x0 ;

di [0]=0;

 

 

Дальше мы в цикле по ex проводим nex численных экспериментов, в каждом из которых созда¼м выборочную траекторию, и накапливаем среднее значение в массиве av и среднее квадрата в массиве di. Кроме этого, увеличиваем сч¼тчик попаданий в подынтервалы для вычисления гистограммы.

Компьютерное моделирование

259

Продолжение программы выглядит следующим образом:

int nex = 1000000; // количество выборочных траекторий

for ( int ex =1;

ex <= nex ;

ex ++){

// эксперименты

Float x=x0 , t= t0 ;

 

 

for ( int k =1;

k <= num ;

k ++){

 

for ( int

j =0;

j < lag ; j++ ,

t += dt )

x

+=

a(x ,t )* dt + b(x ,t )* RndG ()* sqrt_dt ;

av [k] += x;

// с р е д н е е значение

di [k] +=

x*x;

// ñ ð å ä í å å

квадрата

int

i=m *(x - min )/ w;

 

if (i >=0

&&

i <m) p[k ][ i ]++;

}

 

 

 

 

 

 

if ( ex %100==0

&&

ex !=1){

 

printf (" ex =%8 d\n" , ex );

FILE * out = fopen (" ito . out " , "w" ); for ( int k =0; k <= num ; k ++){

Float ak = av [k ]/ ex ;

Float dk = di [k ]/ ex - ak * ak ; dk = dk >0? sqrt ( dk ): 0;

fprintf (out ,"%g\t %12.5 f\t %12.5 f" ,k* step ,ak , dk ); for ( int i =0; i <m; i ++)

fprintf (out ,"\t %12.5 f" ,(p[k ][ i ]/ ex )* m/w ); fprintf (out , "\n" );

}

fclose ( out );

}

}

}

Один раз в сто экспериментов (последний if) происходит вывод промежуточных результатов в файл "ito.out". Для этого вычисляется остаток от деления номера эксперимента на 100 и вывод происходит, если он равен нулю и это не первый эксперимент. В результате вычисления можно прервать в любой момент, получив некоторые промежуточные результаты. Если редактор просмотра файлов в операционной системе автомати- чески перегружает изменившийся файл, то в н¼м можно просматривать динамику текущих вычислений.

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

тельные значения, которые могут вызвать сбой программы.

260

Глава 9.