Výkonnos a spolehlivos číslicových sysémů Úloha Generování a zpracování náhodných čísel Zadání 9 Trojúhelníkové rozdělení Jan Kupka A65 kupka@sudens.zcu.cz
. Zadání vyvoře generáor rozdělení jako funkci v jazyce Java, C či Pascal/Delphi paramery rozdělení jsou zároveň paramery funkce generáoru s využiím vhodné meody inverzní ransformace, kompoziční, vylučovací, ad., napiše hlavní program, ve kerém nejméně pro dvě množiny číselně dosazených paramerů generáoru oesuje správnos vyvořené funkce generáoru, zejména se esuje: sřední hodnoa, rozpyl či směrodaná odchylka, charaker rozdělení hisogram, eperimenálně zjišěné hodnoy esovaných veličin porovneje s eoreickými hodnoami určenými výpočem z dané funkce rozdělení. Trojúhelníkové rozdělení f = pro < f lin. rose pro a>> f lin. klesá pro a>>a f = pro >a. Řešení - programové Pro řešení úlohy jsem využil vylučovací meodu. Úlohu jsem řešil pomocí programu v jazyce JAVA a hodnoy jsem ověřoval ručním výpočem inegrálu a dosazením hodno. Pro úlohu jsem využil sandardní funkce jazyka JAVA pro generování rovnoměrného rozdělení. Pomocí vylučovací meody jsem z rovnoměrného rozdělení vybíral pořebné hodnoy pro rojúhelníkové rozdělení. Graf husoy pravděpodobnosi zadané úlohy: Z husoy pravděpodobnosi je dobře vidě, že lze úlohu rozděli na dva úseky,a a a,a a s každým pracova zvlášť. Pro maimální jednoduchos jsem zvolil vrchol v bodě [a,a], zn. že rosoucí první úsek funkce má rovnici y= a druhý úsek funkce má rovnici y= a. První náhodná proměnná deliko je generována v inervalu, a rozděluje inerval,a na dva úseky. V prvním úseku volíme věší z dvou vygenerovaných čísel v inervalu,a, což nám s nejnižší pravděpodobnosí generuje malá čísla a s nejvyšší vysoká čísla. V druhém úseku volíme nižší číslo, což nám s nejvyšší pravděpodobnosí generuje malá čísla a s nejnižší pravděpodobnosí vysoká. K druhému úseku musíme ješě připočía hodnou parameru a, abychom se posunuli do druhého úseku.
Po vygenerování náhodného čísla je oo číslo zařazeno do inervalu hisogramu podle své hodnoy. Pomocí ěcho hodno je vyvořen jednoduchý hvězdičkový hisogram. Hodnoy napravo od hisogramu udávají odhady pravděpodobnosi P = poče výskyů v daném inervalu / poče generování. Dále je odhadována sřední hodnoa pomocí průměru hodno E = souče všech hodno / poče generování. Rozpyl je vypočen jako D = souče druhých mocnin všech hodno / poče generování druhá mocnina souču všech hodno.. Zdrojový kód programu impor java.uil.*; impor java.e.decimalforma; public class Generaor { public saic double rovnomernein paramera { Random rand = new Random; double nahodnecislo = rand.nedouble * paramera; reurn nahodnecislo; public saic double rovnomerne { reurn Mah.random; public saic double rojuhelnikin paramera { double a, b; double vysledek; double deliko = rovnomerne; a = rovnomerneparamera; b = rovnomerneparamera; if deliko <.5 { if a > b { vysledek = a; else { vysledek = b; else { if a < b { vysledek = a; else { vysledek = b; vysledek = vysledek + paramera; reurn vysledek; public saic void eserin paramera, in pocegenerovani, in poceinervalu { DecimalForma df = new DecimalForma"."; double hodnoa;
in[] pole = new in[poceinervalu]; double sumaor = ; // pro vypoce sredni hodnoy double sumaormocnin = ; // pro vypoce rozpylu double dil = * double paramera / poceinervalu; /* generovani cisel */ for in i = ; i < pocegenerovani; i++ { hodnoa = double rojuhelnikparamera; sumaor = sumaor + hodnoa; sumaormocnin = sumaormocnin + Mah.powhodnoa, ; // Sysem.ou.prinlnhodnoa; for in j = ; j < poceinervalu; j++ { if hodnoa > j * dil && hodnoa < j + * dil { pole[j]++; Sysem.ou.prinln; /* hisogram - eove */ for in i = ; i < poceinervalu; i++ { Sysem.ou.prinln "Inerval od " + df.formai * dil + " do " + df.formai + * dil + " - poce hodno: " + pole[i]; Sysem.ou.prinln""; /* hisogram - graficky */ for in i = ; i < poceinervalu; i++ { for in j = ; j < pole[i] / 5; j++ { Sysem.ou.prin"*"; Sysem.ou.prinln " " + df.formadouble pole[i] / pocegenerovani; double E = sumaor / pocegenerovani; double D = sumaormocnin / pocegenerovani - Mah.powE, ; Sysem.ou.prinln; Sysem.ou.prinln"Sredni hodnoa je " + df.formae; Sysem.ou.prinln"Rozpyl je " + df.formad; Sysem.ou.prinln; public saic void mainsring[] args { Sysem.ou.prinln "Generaor rojuhelnikoveho rozdeleni pravdepodobnosi"; Sysem.ou.prinln"Jan Kupka A65"; Sysem.ou.prinln; "; Sysem.ou.prinln"TEST CISLO "; Sysem.ou.prinln "Poce generovani:, poce inervalu:, paramer a: eser,, ;
"; Sysem.ou.prinln"TEST CISLO "; Sysem.ou.prinln "Poce generovani:, poce inervalu:, paramer a: eser,, ;. Výsup programu Generaor rojuhelnikoveho rozdeleni pravdepodobnosi Jan Kupka A65 TEST CISLO Poce generovani:, poce inervalu:, paramer a:,-, **,,-, *****************,85,-,6 *******************,998,6-,8 ***********************,6,8-, *************************************,877,-, *************************************,85,-, ***********************,5,-,6 *******************,98,6-,8 ****************,8,8-, **,6 Sredni hodnoa je,9976 Rozpyl je,76 TEST CISLO Poce generovani:, poce inervalu:, paramer a:,-,,5,-, **,9,-,6 *******,8,6-,8 *********,85,8-, *********,8,-, **********,5,-, **********,56,-,6 ************,6,6-,8 *****************,888,8-, ********************,7,-, *******************,977,-, *****************,88,-,6 ************,6,6-,8 **********,5,8-, **********,5,-, *********,97,-, *********,89,-,6 *******,5,6-,8 **,5,8-,, Sredni hodnoa je,997 Rozpyl je,79
. Řešení eoreické Náhodnou veličinu máme zadánu inervaly: f = pro < f lin. rose pro a>> f lin. klesá pro a>>a f = pro >a Pro ukázku eoreického řešení zvolím hodnou a=. Z čehož plyne: f = pro < f = >> f = - pro >> f = pro > Husoa pravděpodobnosi konkréní úlohy Výpoče sřední hodnoy E. f d. d. d.. 8 Výpoče rozpylu E. f d. d. d.. 6 6 7 6
6 6 7 E E Disribuční funkce P F d f F Inerval -, F= Inerval <,> d F Inerval <,> d d F Inerval <, F= Graf disribuční funkce:
Výpoče pravděpodobnosí P. P. P. P.6 P.8 P. P. P. P.6 P....6.8....6.8.8 F. F. F.6 F.8 F. F. F. F.6 F.8 F. F. F. F. F.6 F.8 F. F. F. F.6 F.8...6.8...6.8.. / / / / / / / / / /....6.8 *. *.6 *.8 / / / / / *. *...6...8...6..8 / / / / / *. *. *.6 *.8 *..8.9.98.98.68.68.8.9.5....6.8. Závěr Porovnání hodno, keré poskyuje program, s vypočenými hodnoami. Hodnoa Program Teoreický výpoče P.,... P.,..85.6 P.,.6.998. P.6,.8.6. P.8,...877.8 P.,..85.8 P.,..5. P.,.6.98. P.6,.8.8.6 P.8,..6. sřední hodnoa.9976. rozpyl.76.7 Dle hisogramů je parné, že program generuje čísla dle rojúhelníkového rozložení. Hodnoy vypočíané programem se blíží k ručně vypočíaným hodnoám hlavně při vysokém poču generování.