- •Случайные события
- •Стохастический мир
- •Случайные величины
- •Совместная и условная вероятности
- •Зависимость и независимость
- •Характеристическая функция
- •Модель аддитивного блуждания
- •Случайные процессы
- •Стохастические уравнения
- •Уравнение Ито
- •Остановка перед восхождением
- •Лемма Ито
- •Точные решения
- •Простые стохастические модели
- •Представление решений
- •Автокорреляция и спектр
- •Порождающий процесс Винера
- •Средние значения
- •Динамическое уравнение для средних
- •Процесс Феллера
- •Логистическое уравнение
- •Вероятности
- •Марковские плотности вероятности
- •Граничные условия
- •Стохастические интегралы
- •Площадь под траекторией Винера
- •Интегралы Ито
- •Интегрирование стохастических уравнений
- •Единственность решений
- •Метод последовательных приближений
- •Системы уравнений
- •Скоррелированные блуждания
- •Системы стохастических уравнений
- •Стохастический осциллятор
- •Линейные многомерные модели
- •Многомерие помогает одномерию
- •Как решать стохастические задачи?
- •Стохастическая природа
- •Теория броуновского движения
- •Стохастический осциллятор
- •Дрожание земной оси
- •Электронный шум
- •Хищники и их жертвы
- •Стохастическое общество
- •Финансовые рынки
- •Эмпирические закономерности
- •Диверсификация
- •Портфель на всю жизнь
- •Опционы
- •Кривая доходности
- •Компьютерное моделирование
- •Статистики
- •Случайные числа
- •Моделирование стохастических процессов
- •Ошибки вычислений и ускорение сходимости
- •Вычисление средних
- •R: Стохастический справочник
- •Основные соотношения теории
- •Системы уравнений с одинаковым шумом
- •M: Математические приложения
- •H: Помощь
- •C: Примечания
- •Рекомендуемая литература
238 |
Глава 9. |
9.2Статистики
Если некоторые куски кода используются несколько раз, то их стоит
оформить, как процедуру или функцию. Отличие между ними состоит в том, что функция возвращает значение определ¼нного типа, тогда как процедура нет. Перед именем функции указывается е¼ тип (int, oat и т.д.), а перед именем процедуры пишется слово void, что означает пустота , т.е. отсутствие возвращаемого значения. Процедура или функция могут иметь список аргументов, необходимых им для проведения вычислений. Для каждой переменной из списка аргументов указывается е¼ тип и могут быть заданы значения по умолчанию. В этом случае функция может быть вызвана без этих аргументов.
Запишем программу, вычисляющую среднее значение ряда данных:
# include |
< stdio .h > |
// подключение библиотеки вывода |
||||
typedef |
double Float ; |
// |
вещественный тип |
|||
Float Aver ( Float |
*x , int n) |
// |
с р е д н е е массива x длиной n |
|||
{ |
|
|
|
// нет данных выходим |
||
if (n <1) |
return |
0; |
||||
Float |
av |
= 0; |
|
// |
начальное |
значение суммы |
for ( int i =0; i <n; i ++) |
|
|
|
|||
av += x[i ]; |
|
// |
суммируем |
данные |
||
return |
|
av /n; |
|
// |
с р е д н е е значение <x> |
|
} |
|
|
|
|
|
|
void main ()
{
const int n = 5;
Float x[n] = { -2.7 , -0.2 , -1.4 , -1.0 , -0.5}; Float av = Aver (x , n );
printf (" average =% g\n" , av );
}
Количество данных в массиве помечено словом const. Это означает, что n не переменная, а константа, и она не может изменяться по ходу ал-
горитма. Для объявления статического массива необходимо указывать его размер только при помощи константы. В цикле мы складываем все элементы массива. После оператора return в функции ид¼т то значение, которое мы хотим вернуть. В нашем случае это сумма значений массива, дел¼нная на их количество.
Обратим внимание, что перед именем массива x в аргументах функ-
ции Aver стоит зв¼здочка. Это указатель на имя массива, позволяющий отличить его от обычной скалярной переменной.
Компьютерное моделирование |
239 |
Далее мы будем вычислять средние значения стохастических процессов по конечному числу n выборочных траекторий. Выясним, какой
типичной ошибки при этом можно ожидать.
По n измерениям величины x найд¼м арифметическое среднее:
|
x1 + ::: + xn |
1 |
|
n |
|
|
|
|
|
|
|
Xi |
|
x~ = |
= |
n |
xi; |
(9.1) |
||
|
n |
|
=1 |
|
||
|
|
|
|
|
|
которое помечено тильдой, чтобы не смешивать его с истинным средним по бесконечному числу наблюдений x. Будем называть x~ выбороч-
ным средним. Если повторить эксперимент, то получится другой набор измерений xi и, следовательно, другое выборочное среднее x~. На самом деле, результат каждого измерения xi можно рассматривать как случай- ную переменную. Выборочное среднее, являющееся суммой таких слу- чайных величин, естественно, также оказывается случайным. Таким образом,
выборочное среднее это случайная величина, характеризующаяся, в свою очередь, средним, волатильностью и плотностью распределения вероятностей.
Усреднение всех возможных выборочных средних даст нам истинное
среднее: |
|
|
n |
|
|
|
|
|
1 |
|
|
n |
|
||||
|
|
|
Xi |
|
|
|
|
|
hx~i = n |
hxii = n hxi = x: |
(9.2) |
||||||
=1 |
||||||||
|
|
|
|
|
|
|
Интуитивно понятно, что, чем больше мы возьм¼м чисел, тем ближе выборочное среднее окажется к истинному . Другими словами, волатильность выборочного среднего должна уменьшаться с ростом n. Действи-
тельно, вычислим его дисперсию:
n
x2~ = x~2 hx~i2 = n12 X hxixji x2:
i;j=1
Âñå xi являются равноправными случайными величинами. Двойная сумма по i; j содержит n2 слагаемых. Из них n с одинаковыми индексами
i = j, а остальные n2 n с не совпадающими равноправными индекса-
ми i 6= j. Поэтому в сумме будет n слагаемых вида x21 è n2 n âèäà hx1x2i (см. также l C15):
x2~ = n12 n x21 + (n2 n) hx1x2i hxi2 :
Если различные измерения xi è xj являются независимыми случайными величинами, то hx1x2i = hx1i hx2i = hxi2. Соответственно, x21 = x2 .
240 Глава 9.
В итоге получаем формулу, связывающую волатильность выборочного среднего n чисел и дисперсию 2 = x2 hxi2 по всей генеральной
совокупности (бесконечной выборке):
x~ = pn:
Таким образом, волатильность выборочного среднего убывает, как корень квадратный из n. На самом деле она уменьшается достаточно мед-
ленно. Если мы хотим снизить ошибку измерения выборочного среднего
â10 раз, то необходимо увеличить число измерений в 100 раз! Типичный диапазон, в который может попасть выборочное среднее
как случайная величина, имеет вид:
x~ = x pn:
В случае нормального распределения такая запись означает, что выбо-
рочное среднее, полученное по n измерениям, отклоняется от истинного p
среднего не более, чем на = n с вероятностью порядка 0.68. Естественно, что реальная распределения обычно неизвестна. Одна-
ко е¼ тоже можно оценить по конечной выборке ~. В этом случае среднее генеральной совокупности x можно представить в виде диапазона с t стандартными ошибками:
~ |
|
|
x = x~ t pn |
: |
(9.3) |
При больших n, в силу предельной теоремы, отклонение от среднего
îáû÷íо является нормальной случайной величиной с волатильностью |
|||||||||||||
=pn. Поэтому вероятность того, что в данной серии измерений x~ откло- |
|||||||||||||
нится от |
x |
на величину, не превышающую |
a = t n |
, |
|
p |
|
, равна: |
|||||
|
|
||||||||||||
|
|
|
|
|
|
|
n = = n |
||||||
|
|
x+a |
|
|
|
|
|
a= n |
|
|
|
|
|
p(x a 6 x~ 6 x + a) = Z e |
(x x)2 |
|
dx |
= |
Z |
|
e z2=2 |
dz = (a= n): |
|||||
2 n |
np2 |
|
p2 |
||||||||||
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
x a |
|
|
|
|
|
a= n |
|
|
|
|
|
Задавая те или иные значения t = 1; 2; 3 (расширяя интервал), мы можем
повышать вероятность попадания истинного среднего в диапазон (9.3). Часто используемые значения вероятностей (1) = 0:683, (2) = 0:955
è (3) = 0:997.
Если =x 1, то относительная ошибка измерения среднего будет p
равна 1= n. Чтобы достичь точности 10 3 (2-3 значащих цифр) необхо- димо поставить миллион экспериментов ( n = 1000000).
Компьютерное моделирование |
241 |
Для оценки дисперсии по небольшой выборке из n чисел xi необходи- мы определенные ухищрения. Простое арифметическое усреднение при вычислении моментов соответствующих степеней приводит к неверным результатам.
Если мы возьм¼м выборку из n чисел x1; :::; xn и по ним вычислим выборочную дисперсию, усредняя квадраты отклонений (xi x~)2 îò âû-
борочного среднего x~, то получится некоторое значение не совпадающее
с истинной дисперсией распределения D = (x x)2 . Этот эксперимент можно повторить большое число раз. Случайные числа будут разными, и, аналогично выборочному среднему, разными будут выборочные дисперсии. Желательно, чтобы после усреднения по всем экспериментальным выборочным дисперсиям получился результат, совпадающий с дисперсией реального распределения. Это произойд¼т, только если мы будем вычислять выборочную дисперсию при помощи следующей формулы:
~ |
|
1 |
|
n |
2 |
1 |
|
n |
|
|
|
|
|
|
Xi |
(xi x~) ; |
|
|
|
X |
|
D = n |
|
1 |
x~ = n |
(9.4) |
||||||
|
=1 |
xi: |
||||||||
|
|
|
|
|
|
|
|
i=1 |
|
Заметим, что в определении выборочной дисперсии в знаменателе стоит n 1 а не n, как было бы при простом арифметическом усреднении. Такая
оценка называется несмещенной, так как именно она в среднем будет приводить к истинной дисперсии D. Действительно, возведя в квадрат,
перепишем выборочную дисперсию в следующем виде:
|
|
|
|
n |
|
|
|
|
n |
2 n |
|
|
||
~ |
|
1 |
|
X |
2 |
|
1 |
|
Xi |
|
2 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
D = n |
|
|
(xi x~) = n |
|
|
xi n |
|
1 |
x~ : |
|||||
|
1 |
|
1 |
|
||||||||||
|
|
|
|
i=1 |
|
|
|
=1 |
|
|
|
|
|
Усредним это выражение по большому числу реализаций возможных выборок (по всей генеральной совокупности):
|
|
|
1 |
|
n |
|
|
|
1 |
n |
|
|
|
n 1 |
|
|
|
|
|
|
D~ |
= |
|
|
x2 |
|
x |
x |
ji |
= |
|
x2 |
x |
i |
2 |
= D: |
|||||
n 1 |
i=1 |
|
|
|
n 1 |
|
||||||||||||||
D |
E |
i |
|
n(n 1) i;j=1 h i |
|
|
|
h |
|
|
||||||||||
|
|
|
|
|
X |
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
Вычисление двойной суммы проводится также, как и при выводе x~. Ïî- этому, если результаты наблюдений xi можно рассматривать как незави- симые случайные числа, то усреднение выборочной дисперсии с фактором 1=(n 1) будет приводить к истинной для всей генеральной сово-
купности.
Естественно, подобная поправка существенна только для малых n, когда статистическая значимость результатов и так мала. Заметим также,
что несмещ¼нность дисперсии ~
D, вообще говоря, не означает несмещ¼н-
p
~
ности волатильности ~ = D.
242 Глава 9.
Собер¼м часто использующиеся статистические функции в файлеstat.cpp :
# include |
< stdio .h > |
// p r i n t f |
|
# include < stdlib .h > |
// s r a n d |
||
# include |
< math .h > |
// |
s q r t , l o g |
typedef |
double Float ; |
// |
вещественный тип |
//
inline Float Sqr ( Float v ){ return v*v; } // квадрат числа //
Float Aver ( Float |
*x , int n) |
// |
с р е д н е е массива |
x |
длиной n |
||
{ |
|
|
// нет данных выходим |
||||
if (n <1) |
return |
0; |
|||||
Float av |
= 0; |
|
// |
начальное |
значение |
суммы |
|
for ( int i =0; i <n; i ++) |
|
|
|
|
|
||
av += x[i ]; |
|
// |
суммируем |
данные |
|
|
|
return |
av /n; |
|
// |
с р е д н е е значение |
<x> |
||
} |
|
|
|
|
|
|
|
//
Float Sigma ( Float |
*x , int |
n) // |
волатильность массива x |
||
{ |
|
|
|
нет данных выходим |
|
if (n <2) |
return |
0; |
// |
||
Float av = 0, |
di =0; |
// |
начальное |
значение суммы |
|
for ( int i =0; i <n; i ++){ |
|
|
|
||
av += x[i ]; |
|
// |
суммируем |
данные |
|
di += x[i ]* x[i ]; |
|
|
|
||
} |
|
|
|
|
|
av /= n; di /= n; di -= av * av ; // дисперсия |
|
||||
di *= Float (n )/(n -1); |
// |
поправка на несмещ¼нность |
|||
return |
di >0? |
sqrt ( di ):0; // |
волатильность |
||
} |
|
|
|
|
|
//
Float Max ( Float *x , int n) // максимум массива x длиной n
{
if (n <1) |
return |
0; |
// |
нет данных выходим |
Float max = x [0]; |
// |
начальное значение |
||
for ( int i =1; i <n; i ++) |
|
|
||
if (max <x[i ]) |
max =x[i ]; |
|
|
|
return |
max ; |
|
|
|
}
//
Float Min ( Float *x , int n) // минимум массива x длиной n
{
if (n <1) |
return |
0; |
// |
нет данных выходим |
Float min = x [0]; |
// |
начальное значение |
||
for ( int i =1; i <n; i ++) |
|
|
||
if (min >x[i ]) |
min =x[i ]; |
|
|
|
return |
min ; |
|
|
|
}
Компьютерное моделирование |
|
|
|
243 |
|
// |
Гистограмма вероятностей p |
для массива x длиной n |
|||
// |
Интервал [ min |
. . max ] разбит на m отрезков |
|||
// |
Åñëè x [ i ]<min |
èëè |
x [ i ]>max |
он не попадает в p , |
|
// поэтому сумма вероятностей может быть меньше единицы |
|||||
// |
|
|
|
|
|
void Histo ( Float |
*x , int n , Float *p , int |
m , Float min , Float max ) |
|||
{ |
|
|
|
|
|
|
for ( int k =0; k <m; k ++) p[k ]=0; |
|
|||
|
if (n <1) return ; |
// |
нет данных выходим |
||
|
if (max < min ){ Float |
tmp = max ; |
max = min ; |
min = tmp ; } |
|
|
Float w=max - min ; |
|
|
|
|
|
if (w <=0) return ; |
|
|
|
|
|
for ( int i =0; i <n; i ++){ |
|
|
||
|
int k= int (m *( x[i]- min )/ w ); |
|
|||
|
if (k >=0 && |
k <m) |
p[k ]++; |
|
|
|
} |
|
|
|
|
|
for ( int k =0; k <m; |
k ++) // |
нормируем |
вероятности |
|
|
p[k ]/= n; |
|
|
|
|
} |
|
|
|
|
|
При объявлении функции возведения в квадрат Sqr перед типом Float стоит директива компилятору inline. Это означает, что код функции будет вставляться каждый раз в том месте где она вызывается. Размер программы окажется больше, но она будет быстрее, так как исключа- ются переходы в памяти к блоку тела функции (код обычных функций находится в одном месте, и при их вызове происходит перемещение по памяти к ним и обратно).
При вычислении волатильности в функции Sigma учитывается поправка, делающая дисперсию (квадрат волатильности) несмещ¼нной величи- ной. Кроме этого, используется вариант условного оператора if:
x = (условие_выполняется) ? значение_если_да : значение_если_нет;
Остальные функции особых комментариев не требуют. Отметим только, что процедура Histo вычисляет вероятности попадания случайных чисел в один из m одинаковых интервалов между min и max. Если мы
хотим оценить плотность вероятности, элементы массива p[i] необходимо разделить на x = (max min)=m.
Файл stat.cpp в дальнейшем будет подключаться к программам при помощи команды #include, и должен располагаться в той же директории, где находится основная программа. В следующем разделе мы пополним эту библиотеку функциями для генерации случайных чисел.