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

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, и должен располагаться в той же директории, где находится основная программа. В следующем разделе мы пополним эту библиотеку функциями для генерации случайных чисел.