- •Случайные события
- •Стохастический мир
- •Случайные величины
- •Совместная и условная вероятности
- •Зависимость и независимость
- •Характеристическая функция
- •Модель аддитивного блуждания
- •Случайные процессы
- •Стохастические уравнения
- •Уравнение Ито
- •Остановка перед восхождением
- •Лемма Ито
- •Точные решения
- •Простые стохастические модели
- •Представление решений
- •Автокорреляция и спектр
- •Порождающий процесс Винера
- •Средние значения
- •Динамическое уравнение для средних
- •Процесс Феллера
- •Логистическое уравнение
- •Вероятности
- •Марковские плотности вероятности
- •Граничные условия
- •Стохастические интегралы
- •Площадь под траекторией Винера
- •Интегралы Ито
- •Интегрирование стохастических уравнений
- •Единственность решений
- •Метод последовательных приближений
- •Системы уравнений
- •Скоррелированные блуждания
- •Системы стохастических уравнений
- •Стохастический осциллятор
- •Линейные многомерные модели
- •Многомерие помогает одномерию
- •Как решать стохастические задачи?
- •Стохастическая природа
- •Теория броуновского движения
- •Стохастический осциллятор
- •Дрожание земной оси
- •Электронный шум
- •Хищники и их жертвы
- •Стохастическое общество
- •Финансовые рынки
- •Эмпирические закономерности
- •Диверсификация
- •Портфель на всю жизнь
- •Опционы
- •Кривая доходности
- •Компьютерное моделирование
- •Статистики
- •Случайные числа
- •Моделирование стохастических процессов
- •Ошибки вычислений и ускорение сходимости
- •Вычисление средних
- •R: Стохастический справочник
- •Основные соотношения теории
- •Системы уравнений с одинаковым шумом
- •M: Математические приложения
- •H: Помощь
- •C: Примечания
- •Рекомендуемая литература
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. |
