Autor Zpráva
Darker
Profil
Mám modelovou situaci, kdy je kulička hozena do sítě překážek a na každé se musí rozhodnout, jestli spadne doleva nebo doprava. Tady je vizualizace.
Červené nitky symbolizují dráhy kuliček, zelené sloupce počet zásahů na jednotlivých místech.
Co potřebuju je vypočítat předpokládanou křivku která vznikne. Našel jsem sice na wikipedii gausovu funkci. Ta má ale nějaké parametry, co neumím vymyslet.
Já znám akorát počet hodů.
Živá ukázka.
Alphard
Profil
O co vlastně jde? Určit, která z červených nitek je nejpravděpodobnější?
Ta síť překážek je pravidelná a pravděpodobnost pádu na obě strany stejná?
Darker
Profil
Alphard:
Ta síť překážek je pravidelná a pravděpodobnost pádu na obě strany stejná?
Přesně tak.
V praxi pád vypadá tak, že se k výchozímu offsetu, který má čásice na začátku (polovina obrázku) náhodně přičte 1 nebo -1. Ke generování používám mt_rand, při použití rand byl totiž z nějakého důvodu obrázek symetrický podle osy Y.

Jde mi o tyto křivky:http://upload.wikimedia.org/wikipedia/commons/7/74/Normal_Distribution_PDF.svg
Jde o ideální výsledek algorytmu uvedeného výše - na každém kroku spadne polovina kuliček vpravo a polovina vlevo. Šlo by to samozřejmě vygenerovat dělením - pro n bodů od středu platí šance na dopad 1/n*2, ale raději bych použil tu funkci, mám za to, že cílem úlohy je ji pochopit.


Těmi červenými nitkami se nenech zmást. Jde mi o ten zelený graf.
Alphard
Profil
Pořád nerozumím, co je vlastně cílem. Najít funkci y = f(x), vygenerovat nějaký graf, určit parametry gaussovy funkce, něco úplně jiného?
Darker
Profil
Alphard:
určit parametry gaussovy funkce
V podstatě. Co co mi vznikne z těch padajících kuliček - ten zelený graf - by měla být gausova křivka. Je to ale už konkrétní graf toho, co se stalo. Já chci předvídat, jak to bude vypadat ještě než začnu generovat.
V zásadě jde o to ten zelený graf překrýt modrou křivkou ukazující ideální graf - takže budou vidět extrémy, kdy spadlo kuliček více, nebo méně.


pro n bodů od středu platí šance na dopad 1/n*2
Začal bych tím, že tohle moje tvrzení je nesprávné.
Potřebuji vědět, jaká je šance že kulička spadne na určitý offset. Nejbižší řešení co mě napadlo je 1/pow(2,offset).


Živá ukázka.
Keeehi
Profil
Viděl bych to na normované normální rozdělení http://cs.wikipedia.org/wiki/Norm%C3%A1ln%C3%AD_rozd%C4%9Blen%C3%AD
funkce: http://www.wolframalpha.com/input/?i=%281%2Fsqrt%282pi%29%29%28e%29%5E%7B-%5Cfrac%7Bx%5E2%7D%7B2%7D%7D
Alphard
Profil
Darker:
K tomu určení parametrů:
Střední hodnota je jasná, to je půlka obrázku.
Celkovou výšku zelených sloupců (závislou na počtu pokusů) by to chtělo normalizovat, snad výška sloupce/suma výšek všech sloupců. Výsledek budu menší roven jedné, což už se přiblíží hledané funkci, jen pro vizualizaci bude třeba násobit vhodným koeficientem.
Pak bude chybět rozptyl, ten bude závislý na vstupních parametrech (počet překážek), pro začátek bych ho zkusil pro pár různých zadání najít experimentálně.

Potřebuji vědět, jaká je šance že kulička spadne na určitý offset. Nejbižší řešení co mě napadlo je 1/pow(2,offset).
Ten vzorec nebude tak jednoduchý.
Jestli mám správnou představu o geometrii bludiště, mělo by to být
1. řada: překážka pod výpustí - pravděpodobnost 1
2. řada: pravděpodobnosti: 1/2, 1/2
3. řada: 1/4, 1/2, 1/4
4. řada: 1/8, 3/8, 3/8, 1/8
5. řada: 1/16, 1/4, 3/8, 1/4, 1/16
Vždy je to polovina součtu pravděpodobností 2 vyšších sousedních překážek, suma na řádek je pochopitelně 1.

Možná jde určit vzorec, ale když máme počítače...
<?php

$arr = [1/2, 1/2];

$line = [];

for ($i = 3; $i <= 200; $i++)
{
    $last = 0;
    foreach ($arr as $k => $item)
    {
        $line[] = ($last+$item)/2;
        $last = $item;
    }
    $line[] = $item/2;
    $arr = $line;
    $line = [];
}

var_dump($arr);
$filename = 'export.csv';
unlink($filename);
foreach ($arr as $k => $line)
{
    file_put_contents($filename, $k.';'.str_replace('.', ',', $line).PHP_EOL, FILE_APPEND);
}

Tím získám určené pravděpodobnosti pro 200. řádek a pak už si s tím mohu hrát.
Když to hodím do grafu, dostanu


a teď jsem k tomu dodal gausse =1/($G$3*SQRT(2*PI()))*EXP(-(POWER(A2-49,5;2)/(2*POWER($G$3; 2)))), rozptyl (G3) mi seděl 5, tipl jsem na první pokus. Sedí to tak přesně, že jsem ještě jednu křivku posunul, aby to šlo vidět

Darker
Profil
Dík moc, přesně tohle jsem potřeboval. Funguje to přesně jak má. Jen mi vrtá hlavou otázka, jesli opravdu není možné vypočítat řadu bez počítání všech předchozích.
U velkých čísel tohle začíná být problém zrovna tak, jako max. velikost typu float...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0