Springen naar inhoud

Implementatie normalcdf en norminv


  • Log in om te kunnen reageren

#1

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 25 juni 2010 - 13:53

Goedendag allen,

Op het moment ben ik bezig met de implementatie van de cumulatieve distributie functie van de normale verdeling en de inverse hiervan.



De formule voor de cumulatieve distributie functie van de normale verdeling is LaTeX

Voor de normalcdf gebruik ik op dit moment de Taylorreeks, zoals weergegven op error function (erf) (LaTeX ).

Deze reeks vraagt heel veel recursief rekenwerk (ik laat hem doorgaan, totdat er geen verschil meer is met de vorige waarde), wat tot gevolg heeft dat bij standaarddeviaties boven de 6 er zoveel recursies plaatsvinden dat LaTeX boven het bereik van het datatype double uitkomt en de berekende waarden zeer onbetrouwbaar worden. Voor die waarden gebruik ik op dit moment de schattersfunctie, zoals ook weergegeven op die WIKI.

Wat ik mij echter afvraag: is of zijn er geen manieren waarmee deze cumulatieve distributie efficiŽnter te berekenen is? De volgorde van prioriteiten bij mij is:
1. Nauwkeurig (dat is eigenlijk voor mij de sport).
2. Groot bereik (bij mij nu van -8 tot 8 SD; Microsoft Excel ziet kans om van ruim bereik te halen van -30 < SD < 8.2).
3. EfficiŽnt (meer dan 3500 berekeningen per 5 seconde op dit moment; van -9 < SD < 9 in stappen van 0.005).



Hetzelfde probleem speelt op bij de inverse-functie van normalcdf. Naar ik focus in eerste instantie maar even op de gewone normalcdf-functie, wellicht vloeit daar automatisch een goed algoritme uit voor voor de inverse functie. Maar uiteraard zijn opmerkingen en suggesties hiervoor ook van harte welkom.



Op dit moment spiegel ik mijn berekende waarden aan de waarden die Excel hiervoor berekend heeft (voor het gebied -8 < SD < 8 is de maximale absolute afwijking op dit moment 6.3E-11 en relatief 7%; op gebied -5 < SD < 5 voor beiden zelfs 0). Maar gezien ik niet weet hoe zuiver Excel is, vraag ik me af of er ergens ook data beschikbaar van een aantal zeer zuiver berekende cdf's waarmee ik kan vergelijken?


Alvast bedankt voor het meedenken!

Veranderd door JWvdVeer, 25 juni 2010 - 14:00


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 26 juni 2010 - 08:47

Als je richting het maximale bereik van doubles gaat is je benadering sowieso niet betrouwbaar, ook hťťl ver onder dat bereik is een double al enorm onnauwkeurig (althans t.o.v. de orde van grootte van de uitkomsten die je uit deze functie nodig hebt).

Ik zou de normale dichtheidsfunctie numeriek integreren, dat kan middels een makkelijk lineair proces waarvan de precisie willekeurig nauwkeurig valt op te voeren zonder tegen extreme waarden aan te lopen.

Integreer hierbij vanaf x=0, waarbij je weet dat LaTeX = exact 0.5.
Dus voor LaTeX zou je LaTeX numeriek benaderen (en 0.5 bij het resultaat optellen).

Voor de efficiency zou je ook de waarden van LaTeX (of hoe groot je het bereik ook wilt maken) alvast in maximale nauwkeurigheid in een tabelletje kunnen zetten en dan alleen vanaf daar (dus over een veel kleiner gebiedje) numeriek integreren.
In theory, there's no difference between theory and practice. In practice, there is.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures