math.Erf în Go

Funcția de eroare Erf, complementul ei Erfc = 1 - Erf și inversele Erfinv și Erfcinv, folosite la distribuția normală.

Sintaxă
import "math"

func Erf(x float64) float64
func Erfc(x float64) float64
func Erfinv(x float64) float64   // Go 1.10
func Erfcinv(x float64) float64  // Go 1.10

Ce face math.Erf

math.Erf(x) este funcția de eroare din statistică. Legată de distribuția normală (clopotul lui Gauss), ea dă probabilitatea ca o valoare să cadă într-un interval în jurul mediei. Rezultatul este între -1 și 1.

math.Erfc(x) este 1 - Erf(x), calculat precis chiar când rezultatul este foarte aproape de 0 (pentru x mare). math.Erfinv și math.Erfcinv (adăugate în Go 1.10) sunt funcțiile inverse.

Formula utilă: probabilitatea ca o valoare normală să fie sub x este 0.5 * (1 + Erf((x - medie) / (sigma * √2))).

Parametri

Parametru Descriere
x Numărul de intrare (pentru inverse: între -1 și 1 la Erfinv, între 0 și 2 la Erfcinv).

Ce returnează

Valoarea funcției, ca float64.

Exemple

Exemplul 1: Erf, Erfc și inversele

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Printf("Erf(1)  = %.4f\n", math.Erf(1))
    fmt.Printf("Erfc(1) = %.4f\n", math.Erfc(1))
    fmt.Printf("Erfinv(Erf(1))   = %.4f\n", math.Erfinv(math.Erf(1)))
    fmt.Printf("Erfcinv(Erfc(1)) = %.4f\n", math.Erfcinv(math.Erfc(1)))
    fmt.Println(math.Erfc(10))
}

Rezultat

Erf(1)  = 0.8427
Erfc(1) = 0.1573
Erfinv(Erf(1))   = 1.0000
Erfcinv(Erfc(1)) = 1.0000
2.088487583762545e-45

Exemplul 2: Probabilitate la distribuția normală

Înălțimea elevilor dintr-o școală are media 165 cm și abaterea standard 10 cm. Ce procent are sub 180 cm?

package main

import (
    "fmt"
    "math"
)

func subValoare(x, medie, sigma float64) float64 {
    return 0.5 * (1 + math.Erf((x-medie)/(sigma*math.Sqrt2)))
}

func main() {
    fmt.Printf("Sub 180 cm: %.2f%%\n", 100*subValoare(180, 165, 10))
    fmt.Printf("Între 155 și 175 cm: %.2f%%\n", 100*(subValoare(175, 165, 10)-subValoare(155, 165, 10)))
}

Rezultat

Sub 180 cm: 93.32%
Între 155 și 175 cm: 68.27%

Greșeli frecvente

  • Calculezi 1 - math.Erf(x) pentru x mare și obții 0: folosește math.Erfc(x), care păstrează valorile mici.

Comenzi înrudite

  • math.Gamma: Funcția Gamma (factorialul extins la numere reale) și Lgamma, logaritmul ei, util pentru valori mari.
  • math/rand/v2.NormFloat64: NormFloat64 dă numere cu distribuție normală (media 0, abaterea 1); ExpFloat64 dă numere cu distribuție exponențială (rata 1).