Inscription / Connexion Nouveau Sujet
Niveau école ingénieur
Partager :

Fonction de répartition

Posté par
matheux14
08-10-24 à 11:56

Bonjour à tous,

Je travaille sur un projet de simulation en utilisant la méthode de Monte Carlo et j'aurais besoin d'aide pour certains aspects du problème. Voici la situation :

On considère un modèle où les remboursements R (liés à des sinistres ou événements) sont soumis à des conditions météorologiques. Les montants des remboursements sont indépendants, ainsi que la météo dans certaines conditions. Dans ce cadre, j'ai deux hypothèses concernant la circulation des motards :

Hypothèse A : Les motards circulent tous dans une même région, donc soumis à une météo commune.

Hypothèse B : Les motards circulent dans des régions différentes, donc soumis à des météos indépendantes (chaînes de Markov indépendantes pour chaque région).

\bullet On suppose que le montant (en devise) d'un remboursement de sinistre lors de l'accident d'un motard suit la loi \mathbb{P}_r dont la densité est proportionnelle à :

f^*(x) = \textbf{1}_{\mathbb{R}} \exp\left(-\eta \ln\left(\alpha + |x - x_0|\right)\right) (\alpha > 0, x_0 > 0 et \eta > 3 sont des constantes).

\bullet On considère une période de 365 jours, sur laquelle on assure N motards.

On note R le remboursement total à effectuer sur toute cette période et pour tous les motards.

On cherche alors à approximer (le plus efficacement possible), par une méthode de Monte Carlo, l'espérance conditionnelle m(s) = \mathbb{E}\left(R - s \mid R > s\right).

Le problème c'est comment calculer la fonction de répartition que suit \mathbb{P}_r ?

Merci d'avance.

Posté par
flight
re : Fonction de répartition 08-10-24 à 19:33

salut

il me semble par integration

Posté par
matheux14
re : Fonction de répartition 08-10-24 à 20:15

En fait je dois faire une simulation de n valeurs suivant la loi \mathbb{P}_r.

Et pour cela, il me faut une formule fixe de la fonction de répartition de \mathbb{P}_r.

Posté par
matheux14
re : Fonction de répartition 12-10-24 à 10:35

Posté par
Ulmiere
re : Fonction de répartition 12-10-24 à 13:01

Où est la difficulté ? Le calcul est un peu casse-bonbons mais il s'agit juste de couper une intégrale en deux et de faire des changements de variable

Si x > x_0, alors F(x) = \int_{-\infty}^x f^\ast(t)dt = \int_{-\infty}^{x_0} f^\ast(t)dt + \int_{x_0}^x f^\ast(t)dt.

Pour calculer la première intégrale, pour tout y \leqslant x_0, \int_{-\infty}^y f^\ast(t)dt = \int_{-\infty}^{y} \exp(-\eta\ln(\alpha + x_0-t))dt.
Tu fais le changement de variable u = \alpha + x_0-t, tu trouves \int_{\alpha + x_0-y}^{\infty}u^{-\eta}du = \dfrac{(\alpha + x_0-y)^{1-\eta}}{\eta - 1}.


Pour l'autre c'est le même principe mais tu remplaces |x-x_0| par x-x_0, ça reste un calcul de primitive de fonction exponentielle

Posté par
matheux14
re : Fonction de répartition 12-10-24 à 19:45

Merci Ulmiere

Finalement je trouve F(x) = \dfrac{2\alpha^{1 - \eta} - \left(\alpha + x - x_0\right)^{1 - \eta}}{\eta - 1}.

Et comme je dois simuler la loi de \mathbb{P}_r pour n, j'ai alors calculé la bijection réciproque de F(x) :

Alors pour tout x \in [0 ; 1], F^{-1}(x) = \left[x(1 - \eta) + 2\alpha^{1 - \eta}\right]^{\frac{1}{1 - \eta}} + x_0 + \alpha

Posté par
Ulmiere
re : Fonction de répartition 13-10-24 à 00:16

Tu vas un peu trop vite là !
Le calcul me semble correct dans le cas où x>x0, mais quand x<=x0 le second terme n'existe pas. Ton expression ne tient pas compte des deux cas possibles.
Il y aura forcément une indicative en fonction de x0 dans l'un des deux termes.

L'autre problème c'est que f* n'est pas forcément une densité. Il faut calculer la limite de F en l'infini pour trouver le facteur de normalisation et alors tu pourras donner l'expression finale de F_r

Ensuite il faudra trouver l'inverse... S'il existe !
Ce que tu cherches est l'inverse généralisée à droite de la fonction F_r

Posté par
matheux14
re : Fonction de répartition 14-10-24 à 22:36

Salut Ulmiere

Si x < x_0,

\begin{aligned}F(x) &= \int^x_{-\infty} f^*(t) d t = \int^x_{-\infty} \exp\left(-\eta \ln\left(\alpha + \underbrace{|x_0 - t|}_{\ge 0}\right)\right) d t \\
 \\ &= \int^x_{-\infty} \exp\left(-\eta \ln\left(\alpha + x_0 - t\right)\right) d t \\
 \\ &\overset{u = \alpha + x_0 - t}{=} - \int^{\alpha + x_0 - x}_{+\infty} \exp\left(-\eta \ln(u)\right) d u \\
 \\ &= \int^{+\infty}_{\alpha + x_0 - t} \exp\left(-\eta \ln(u)\right) d u = \int^{+\infty}_{\alpha + x_0 - x} u^{-\eta} d u = \dfrac{1}{1 - \eta} \left[u^{-\eta + 1}\right]^{+\infty}_{\alpha + x_0 - x} = \dfrac{1}{\eta - 1} \left(\alpha + x_0 - x\right)^{1 - \eta}
 \\  \end{aligned}

F(x) = \dfrac{1}{\eta - 1} \left(\alpha + x_0 - x\right)^{1 - \eta} si |u| < 1.

Posté par
matheux14
re : Fonction de répartition 14-10-24 à 22:40

Un peu pessimiste à l'idée de poursuivre l'étude des différents cas de choix de u dans  \mathbb{R}..

L'inversion de la fonction de répartition devient alors assez délicate il me semble

Posté par
Ulmiere
re : Fonction de répartition 15-10-24 à 13:32

Pour le cas x \leqslant x_0, je t'ai donné le résultat
Pour le cas x > x_0, j'ai cassé l'intégrale en deux. Le premier terme se calcule grâce au premier cas, puisque x_0\leqslant x_0, ce qui donne \alpha^{1-\eta} / (\eta-1).
Le terme qui reste est un calcul du même genre que le premier
\begin{array}{rcl}
 \\ \int_{x_0}^x f^\ast(t)dt &=& \int_{x_0}^x \exp(-\eta \ln(\alpha-x_0 + t))dt\\
 \\ &=& \int_{\alpha}^{\alpha-x_0+x} u^{-\eta}du\\
 \\ &=& \dfrac{(\alpha-x_0+x)^{1-\eta} - \alpha^{1-\eta}}{1-\eta}\\
 \\ &=& \dfrac{ \alpha^{1-\eta}-(\alpha-x_0+x)^{1-\eta}}{\eta-1}
 \\ \end{array}

Donc si on résume la situation jusqu'ici, ton calcul était correct et
(\eta - 1)F^\ast(x) = \left\lbrace\begin{array}{lr}(\alpha + |x-x_0|)^{1-\eta}&\text{si } x\leqslant x_0\\2\alpha^{1-\eta} - (\alpha + |x-x_0|)^{1-\eta}&\text{sinon}\end{array}\right.

Autrement dit, (\eta-1)F^\ast(x) = (\alpha + |x-x_0|)^{1-\eta} + 2(\alpha^{1-\eta} - (\alpha + x-x_0)^{1-\eta})1_{\{x > x_0\}}

Maintenant, regarde la définition de l'inverse généralisé à droite et applique

Posté par
Ulmiere
re : Fonction de répartition 15-10-24 à 15:31

Je t'aide pour le début.
Calculons F^{-1}, où F = F^\ast/K et K = \int_\R f^\ast = \lim\limits_{+\infty}F^\ast est un réel que je te laisse calculer.

On constate déjà que F est continue à droite, ce qui est une bonne nouvelle pour une fonction de répartition. Ca veut dire que la loi est diffuse. Est-ce que c'est vrai aussi à gauche ? F étant croissante, est-elle inversible ?

Comme définition de l'inverse, on prend F^{-1}(y) = \inf\{x : F(x)\geqslant y\}.
En toutes lettres : on trace une droite horizontale par dessus la courbe représentative de F, on récupère la plus petite des abscisses des points d'intersection des deux courbes.

La chance qu'on a, c'est que F est croissante. Par conséquent,
* si y < y_0 = F(x_0), il s'agit de résoudre une certaine équation.
* si y \geqslant y_0, même chose avec une autre équation.

Tu réunis ensuite ces deux cas sous une seule expression avec indicatrice comme nous l'avons fait pour F^\ast et tu regardes si la fonction obtenue est continue.

Posté par
matheux14
re : Fonction de répartition 16-10-24 à 21:09

Bonsoir Ulmiere

Si x \leq x_0,

\begin{aligned}
 \\ F^*(x) = y &\iff  \dfrac{1}{\eta - 1} \left(\alpha + |x - x_0|\right)^{1 - \eta} = y \\
 \\ &\iff \left(\alpha + \underbrace{|x - x_0|}_{\le 0}\right) = \left[ y(\eta - 1) \right]^{\frac{1}{1 - \eta}} \\
 \\ &\iff \left(\alpha - x + x_0\right) = \left[y(\eta - 1)\right]^{\frac{1}{1 - \eta}}
 \\ &\Longrightarrow x = \alpha + x_0 - \left[y\left(\eta - 1\right)\right]^{\frac{1}{1 - \eta}}
 \\ \end{aligned}

Donc, F^{*^{-1}}(y) = \alpha + x_0 - \left[ y(\eta - 1) \right]^{\frac{1}{1 - \eta}}.

Si x > x_0,

\begin{aligned}
 \\ F^*(x) = y &\iff \dfrac{1}{(\eta - 1)} \left(2\alpha^{1 - \eta} - (\alpha +\underbrace{|x - x_0|}_{> 0})^{1 - \eta} \right) = y \\
 \\ &\iff 2 \alpha^{1 - \eta} - \left(\alpha + x - x_0\right)^{1 - \eta} = y(\eta - 1) \\
 \\ &\iff \left(\alpha + x - x_0\right) = \left[2\alpha^{1 - \eta} - y(\eta - 1)\right]^{\frac{1}{\eta - 1}} \\
 \\ &\Longrightarrow x = x_0 - \alpha + \left[2\alpha^{1 - \eta} - y(\eta - 1)\right]
 \\ \end{aligned}

Donc, F^{*^{-1}}(x) = x_0 - \alpha + \left[2\alpha^{1 - \eta} - x(\eta - 1)\right]^{\frac{1}{\eta - 1}}

Finalement :

F^{-1}(x) = \left(\alpha + x_0 - \left[x(\eta - 1)\right]^{\frac{1}{1 - \eta}}\right)\textbf{1}_{\{x \le x_0\}} + \left(x_0 - \alpha + \left[2\alpha^{1 - \eta} - x(\eta - 1)\right]^{\frac{1}{\eta - 1}}\right)

Posté par
Ulmiere
re : Fonction de répartition 18-10-24 à 17:15

Oui, mais

il faut faire attention à bien expliquer pourquoi tu as le droit de passer tel réel à la puissance 1/(eta - 1)
il manque une indicatrice
et le facteur K a été oublié dans tes calculs

Il manque aussi une petite étude de la continuité de F^{-1}, bien que ce ne soit pas nécessaire pour appliquer une méthode de Monte Carlo

Posté par
matheux14
re : Fonction de répartition 21-10-24 à 20:47

Bonsoir Ulmiere, merci beaucoup.

Concernant la simulation de la loi de \mathbb{P}_r , je code en langage R.

Voici un début de code :

# Fonction pour simuler n valeurs suivant la loi P_r
rremb <- function(n, params) {
  
  # Extraire les paramètres depuis la liste params
  alpha <- params$alpha
  x0 <- params$x0
  eta <- params$eta
  
  # Vérifier si les paramètres sont corrects
  if (alpha <= 0 | x0 <= 0 | eta <= 3) {
    stop("Mauvais paramètres : alpha doit être > 0, x0 > 0 et eta > 3")
  }
  
  # Fonction inverse de la fonction de répartition F^(-1)
  F_inv <- function(y) {
    if (y <= 0.5) {
      # Cas où x <= x0
      return(alpha + x0 - (y * (eta - 1))^(1 / (1 - eta)))
    } else {
      # Cas où x > x0
      return(x0 - alpha + (2 * alpha^(1 - eta) - y * (eta - 1))^(1 / (eta - 1)))
    }
  }
  
  # Générer n valeurs uniformes sur (0, 1)
  u <- runif(n)
  
  # Utiliser F_inv pour générer des valeurs selon P_r
  x <- sapply(u, F_inv)
  
  return(x)
}

# Paramètres
params <- list(alpha = 2.0, x0 = 50.0, eta = 4.0)

# Ajustement de n pour un temps d'exécution proche de 10 secondes
n <- 10000  # Exemple de valeur, à ajuster selon les performances

# Simulation des valeurs
valeurs_simulees <- rremb(n, params)

# Afficher les résultats
print(valeurs_simulees)

# Optionnel : Tracer l'histogramme des valeurs simulées
hist(valeurs_simulees, breaks = 50, main = "Histogramme des valeurs simulées", xlab = "Valeurs", ylab = "Fréquence")

Posté par
Ulmiere
re : Fonction de répartition 22-10-24 à 12:56

Il manque toujours le facteur K de normalisation dans tous tes calculs
Quand tu l'auras pris en compte, tu pourras superposer à l'histogramme le graphe de f^\ast / K et regarder si tout coincide

Posté par
matheux14
re : Fonction de répartition 17-11-24 à 16:40

Salut Ulmiere, peux tu me donner des indications sur comment calculer ce facteur de normalisation K ?

Posté par
matheux14
re : Fonction de répartition 17-11-24 à 19:25

J'ai ajouté, cette ligne dans mon algorithme pour la normalisation de f^*,

1/integrate(f_star, 0, Inf, alpha = alpha, x0 = x0, eta = eta)$value


Mais le temps d'exécution pour des simulations de grandes valeurs est énorme.

Posté par
matheux14
re : Fonction de répartition 18-11-24 à 09:08

Posté par
Ulmiere
re : Fonction de répartition 18-11-24 à 11:32

Il ne faut pas faire le calcul approché, sinon la complexité explose !
Le facteur de normalisation est simplement la limite en l'infini de F, dont tu connais l'expression explicitement. Il suffit de calculer cette limite à la main et de modifier le calcul en prenant en compte cette constante !

Posté par
Ulmiere
re : Fonction de répartition 18-11-24 à 11:33

Je voulais dire la limite de F* bien sûr, pas celle de F, qui vaut 1 par construction

Posté par
matheux14
re : Fonction de répartition 18-11-24 à 12:17

On a F^*(x) = \begin{cases} 
 \\ \dfrac{1}{\eta - 1} \left(\alpha + |x - x_0|\right)^{1 - \eta} \quad \text{si } x \le x_0\\\\
 \\ \dfrac{1}{(\eta - 1)} \left(2\alpha^{1 - \eta} - (\alpha +\underbrace{|x - x_0|}_{> 0})^{1 - \eta} \right) \quad \text{sinon }
 \\ \end{cases}

Donc \lim\limits_{x \longrightarrow \infty} F^*(x) = \lim\limits_{x \longrightarrow \infty} \dfrac{1}{(\eta - 1)} \left(2\alpha^{1 - \eta} - (\alpha +\underbrace{|x - x_0|}_{> 0})^{1 - \eta} \right) = \dfrac{2\alpha^{1 - \eta}}{\eta - 1}

Posté par
matheux14
re : Fonction de répartition 18-11-24 à 15:59

En multipliant cette valeur par F^{-1}(x) dans mon code, j'ai que des 0 et des NaN..

Posté par
Ulmiere
re : Fonction de répartition 18-11-24 à 17:26

F = (F*) / K donc

F(x) = y
ssi (F*)(x) = Ky
ssi x = (F*)^(-1)(Ky)

Ca veut donc dire que F^(-1)(y) = (F*)^(-1)(Ky)
Tu peux réutiliser les expressions que tu as déjà trouvé pour l'inverse de F* pour calculer F_inv dans ton code

L'équivalent en python (sans introduire numpy, donc très lent) serait en gros


K = 2 * alpha ** (1-eta) / float(eta - 1)

def F_star_inv(y):
  ..
  return ...


def F_inv(y):
  return F_start_inv(K * y)


def monte_carlo(n,  s):
  # B est l'évènement R>S, de probabilité P(B) = 1 - F(s)
  # alors E(R-s | B) = E((R-s)1_B) / P(B) = E((R-s)_+) / P(B)  

  U = generer_unif(n)
  V = filter(lambda r: r>s, map(F_inv, U))
  W = map(lambda r: r-s, V) # v.a iid de même loi que (R-s)_+

  m = sum(V) / float(n) # monte carlo / estimateur de la moyenne de W
  p = 1 - F(s) # P(B)

  return m / float(p)

Posté par
matheux14
re : Fonction de répartition 18-11-24 à 19:47

Citation :
F = (F*) / K donc

F(x) = y
ssi (F*)(x) = Ky
ssi x = (F*)^(-1)(Ky)

Ca veut donc dire que F^(-1)(y) = (F*)^(-1)(Ky)


J'ai pas bien compris le passage de la deuxième ligne à la troisième ligne.

Posté par
Ulmiere
re : Fonction de répartition 18-11-24 à 20:33

Changeons de notation alors. Soient K est une constante et f et g deux fonctions inversibles sur R+ telles que f = g / K.
On suppose g^(-1), la réciproque de g, connue et on cherche f^(-1), la réciproque de f.

Soient x et y deux réels. Pour trouver f^(-1)(y), on utilise comme d'habitude une série d'équivalences
f(x) = y
ssi machin
ssi bidule
ssi x = truc
et on en déduit alors que f^(-1)(y) = truc, parce que f(x) = y équivaut aussi à f^(-1)(y) = x

Dans notre cas, f(x) = y
ssi g(x) / K = y
ssi g(x) = Ky
ssi x = g^(-1)(Ky)

Ce qui veut dire que f^(-1)(y) = g^(-1)(Ky), pour tout y où cette égalité a un sens.

Reste plus qu'à appliquer ceci avec f = F et g = F*

Posté par
matheux14
re : Fonction de répartition 18-11-24 à 22:15

rremb <- function(n, params) {
  # Extraire les paramètres depuis la liste params
  alpha <- params$alpha
  x0 <- params$x0
  eta <- params$eta
  
  # Vérifier si les paramètres sont corrects
  if (alpha <= 0 | x0 <= 0 | eta <= 3) {
    stop("Mauvais paramètres : alpha doit être > 0, x0 > 0 et eta > 3")
  }
  
  # Facteur de normalisation K
  K <- 2 * alpha^(1 - eta) / (eta - 1)
  
  # Fonction inverse de F* (sans facteur de normalisation)
  F_star_inv <- function(z) {
    if (z <= 0.5) {
      # Cas où x <= x0
      return((alpha + x0 - (z * (eta - 1))^(1 / (1 - eta))))
    } else {
      # Cas où x > x0
      return((x0 - alpha + ((1 - z) * (eta - 1))^(1 / (eta - 1))))
    }
  }
  
  # Fonction inverse de F en tenant compte de K
  F_inv <- function(y) {
    return(F_star_inv(K * y))
  }
  
  # Générer n valeurs uniformes sur (0, 1)
  u <- runif(n)
  
  # Utiliser F_inv pour générer des valeurs selon P_r
  x <- sapply(u, F_inv)
  
  return(x)
}

# Paramètres
params <- list(alpha = 2.0, x0 = 50.0, eta = 4.0)

# Simulation des valeurs
n <- 100000  # Ajuster selon vos besoins
valeurs_simulees <- rremb(n, params)

# Afficher les résultats
print(head(valeurs_simulees, 10))

# Optionnel : Tracer l'histogramme des valeurs simulées
hist(valeurs_simulees, breaks = 50, main = "Histogramme des valeurs simulées", 
     xlab = "Valeurs", ylab = "Fréquence", col = "skyblue")


Voici le nouveau code que j'obtiens en faisant comme tu as dit.

J'exécute 10 000 simulations en pratiquement 3 secondes.

Mais j'ai des copains qui sont à 8 secondes pour 63 millions de simulations..

Est-ce dû à ma machine ?

Posté par
matheux14
re : Fonction de répartition 18-11-24 à 22:36

Alors j'ai utilisé des packages R pour essayer d'optimiser le code et j'arrive à 6 secondes pour 1 million de simulations

Posté par
Ulmiere
re : Fonction de répartition 18-11-24 à 23:41

À vue de nez ton code passe l'essentiel de son temps à vérifier des conditions à cause des if et des else.

Tu peux probablement déjà gagner quelques millions en écrivant directement F sous forme explicite sans passer par F*. Ça évitera déjà de construire une call stack (pour te la faire simple une fonction qui en appelle une autre doit se souvenir d'où elle est pour pouvoir y revenir une fois que la fonction appelée est terminée).

Ensuite il faut te débarrasser des if/else en les remplaçant par exemple par des multiplications par des fonctions qui approchent tes indicatrices. Des trucs du genre exp(-1/x^2)  avec une pente très abrupte.

R n'est pas un langage très rapide, de base. C'est pratique et vectorialisé mais ça reste un langage de script qui fait appel à des librairies écrites en C++, comme Python.

Posté par
Ulmiere
re : Fonction de répartition 18-11-24 à 23:44

Après en dernier recours il reste des techniques qui dépassent d'assez loin ton niveau actuel. Utiliser des suites pseudo aléatoires à faible discrépance, suites de Halton, quasi Monte Carlo, etc.

Posté par
matheux14
re : Fonction de répartition 19-11-24 à 10:57

rremb_optimized <- function(n, params) {
  alpha <- params$alpha
  x0 <- params$x0
  eta <- params$eta
  
  # Vérification des paramètres une seule fois
  if (alpha <= 0 || x0 <= 0 || eta <= 3) {
    stop("Mauvais paramètres : alpha doit être > 0, x0 > 0 et eta > 3")
  }
  
  # Calcul du facteur de normalisation
  K <- 2 * alpha^(1 - eta) / (eta - 1)
  
  # Générer n valeurs uniformes
  u <- runif(n)

  # Approche vectorisée sans `if/else`
  z <- (eta - 1) * u*K
  x <- x0 + alpha * (1 - exp(-1 / z^2)) - 
       alpha * (1 - exp(-1 / (1 - z)^2)) 
  
  return(x)
}

# Paramètres
params <- list(alpha = 2.0, x0 = 50.0, eta = 4.0)

# Simulation optimisée
n <- 63000000
valeurs_simulees_optim <- rremb_optimized(n, params)

# Afficher les résultats
print(valeurs_simulees_optim)

# Résultat
hist(valeurs_simulees_optim, breaks = 50, main = "Histogramme des valeurs simulées (Optimisé)",
     xlab = "Valeurs", ylab = "Fréquence", col = "skyblue")


Est-ce correct pour l'approche vectorisée ?

Posté par
Ulmiere
re : Fonction de répartition 19-11-24 à 12:39

Ben non c'est bigrement incorrect. Ma suggestion d'exponentielle portait sur la forme de la fonction de régularisation de 1_{[y_0, +\infty)}, ce n'était pas à prendre au mot près!

Je voulais dire qu'au lieu d'avoir un saut, tu aurais une pente raide mais continue du genre arctan ou expression de la tension dans un dipôle RC, ...

Posté par
matheux14
re : Fonction de répartition 19-11-24 à 13:38

rremb <- function(n, params) {
  # Extraire les paramètres depuis la liste params
  alpha <- params$alpha
  x0 <- params$x0
  eta <- params$eta
  
  # Vérifier si les paramètres sont corrects
  if (alpha <= 0 | x0 <= 0 | eta <= 3) {
    stop("Mauvais paramètres : alpha doit être > 0, x0 > 0 et eta > 3")
  }
  
  # Fonction sigmoïde logistique pour la régularisation
  logistic <- function(x, y0, k = 100) {
    1 / (1 + exp(-k * (x - y0)))
  }
  
  # Fonction inverse modifiée avec transitions douces
  F_inv <- function(x) {
    # Terme pour x <= 0.5
    term1 <- alpha + x0 - (2 * x^(1 - eta))^(1 / (1 - eta))
    # Terme pour x > 0.5
    term2 <- x0 - alpha + (2 * alpha^(1 - eta) - 2 * x * alpha^(1 - eta))^(1 / (eta - 1))
    
    # Transition continue autour de 0.5
    transition <- logistic(x, 0.5)

    # Combinaison pondérée des deux termes
    return(transition * term2 + (1 - transition) * term1)
  }
  
  # Générer n valeurs uniformes sur (0, 1)
  u <- runif(n)
  
  # Utiliser F_inv pour générer des valeurs selon P_r
  x <- sapply(u, F_inv)
  
  return(x)
}

# Paramètres
params <- list(alpha = 2.0, x0 = 50.0, eta = 4.0)

# Simulation des valeurs
n <- 10000  # Ajuster selon vos besoins
valeurs_simulees <- rremb(n, params)

# Afficher les résultats
print(valeurs_simulees)

# Optionnel : Tracer l'histogramme des valeurs simulées
hist(valeurs_simulees, breaks = 50, main = "Histogramme des valeurs simulées", 
     xlab = "Valeurs", ylab = "Fréquence", col = "skyblue")


C'est un tout petit peu plus rapide maintenant..

Posté par
matheux14
re : Fonction de répartition 21-11-24 à 20:52

Ulmiere @ 18-11-2024 à 23:44

Après en dernier recours il reste des techniques qui dépassent d'assez loin ton niveau actuel. Utiliser des suites pseudo aléatoires à faible discrépance, suites de Halton, quasi Monte Carlo, etc.


J'ai essayé de remplacer runif par la suite de Halton pour faire du quasi-Monte Carlo en R et voilà

halton <- function(n, base) {
  sequence <- numeric(n)
  for (i in 1:n) {
    f <- 1
    value <- 0
    index <- i
    while (index > 0) {
      f <- f / base
      value <- value + f * (index %% base)
      index <- floor(index / base)
    }
    sequence[i] <- value
  }
  return(sequence)
}


Mais je ne vois pas comment l'adapter à mon code..

Posté par
matheux14
re : Fonction de répartition 22-11-24 à 19:05



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1720 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !