Уважаемые Эксперты. Есть массив чисел real. нужно посчитать мат. ожидание и дисперсию. Пишу procedure raschet; begin summa:=0; summaq:=0; sigma:=0; for i:=0 to n do begin summa:=summa+r[i]; summaq:=summaq+sqr(r[i]); end; mo:=(1/n)*summa; k1:=(1/n)*summaq; k2:=((1/sqr(n)))*(sqr(summa)); sigma:=k1-k2; {((1/n)*summaq)-((1/sqr(n))*(sqr(summa)));} writeln ('математическое ожидание - ',mo:8:3); writeln ('дисперсия - ',sigma:8:3); end; получается ерунда : sigma(дисперсия) бывает меньше ноля. если ктото из вас помнит статистику подкажите где ошибка в расчете sigma. Массив чисел создается в других процедурах. Заранее благодарен!
Здравствуйте, Vlad! Немного не по теме, но всё-же (статистику не помню ;)). В данном случае оптимизация, возможно, не совсем необходима, но нужно привыкать к хорошему стилю. Итак: 1) конструкции типа (summa:=summa+r[i];) нужно заменять на (inc(summa,r[i]);); 2) лучше не использовать временные переменные и заменить k1:=(1/n)*summaq; k2:=((1/sqr(n)))*(sqr(summa)); sigma:=k1-k2; на sigma:=(1/n)*summaq-((1/sqr(n)))*(sqr(summa)); Для понимания, конечно, хуже, но для компилятора просто рай ;) По оформлению: 1) все мы люди и приводить лучше щедро прокомментированный и полный код (а не одна процедура); 2) сам код обязательно вставлять в приложение, т.к. оформлениие (а именно ведущие пробелы) теряются и опять же код сложно читать.
ЗЫ Это ко всем подписчикам... Ответ отправлен: 20.10.2004, 00:21 Отправитель: Strory Отвечает Boriss
Добрый день, Vlad! Это делается примерно так: (дисперсию лучше считать по ее исходной формуле)
Приложение: Ответ отправлен: 20.10.2004, 09:06 Отправитель: Boriss Отвечает Tancho
Добрый день, Vlad! Как видно из твоя прога у тебе дискретная случайная величина принимает n+1 - стойностях( от 0 до n ), а в таком случае надо делить не на n, а на n+1!Или просумировай от 1 до n, и тогда можно делит на n!Иначе в формулах для математического ожиданию и дисперсию по моему других ошибок нет! Ответ отправлен: 20.10.2004, 10:29 Отправитель: Tancho Отвечает Tigran K. Kalaidjian
Доброе время суток, Vlad! Насколько я помню, Sigma = summa((r[i] - mo)^2)/(n-1). Организуйте цикл для суммы квадратов разности r[i] и mo, затем разделите на (n-1) Если нужна рабочая программа по теме (на Turbo C) или подсчёт МНК (на Turbo Pascal) - пишите на kalaidjian@pochtamt.ru Ответ отправлен: 21.10.2004, 21:02 Отправитель: Tigran K. Kalaidjian
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.