[VB.NET] Calcul probabiliste d'une approximation d'intégrale (méthode de Monte Carlo)

Voir le sujet précédent Voir le sujet suivant Aller en bas

[VB.NET] Calcul probabiliste d'une approximation d'intégrale (méthode de Monte Carlo)

Message par Skynyrd777 le Mar 3 Aoû 2010 - 21:55

Bonjour,

Il est possible de calculer une intégrale de fonction d'un ensemble donné de x grâce au calcul probabiliste. Cette méthode dite de Monte Carlo exploite la théorie des grands nombres qui dit qu'après de nombreux tirages probabilistes, les résultats deviennent déterministes. Dans le cas du calcul intégral, on tire un réel r de l'intervalle [a;b] et l'on calcul l'intégrale de la fonction f en partant du principe que celle ci est constante en f(r). Ce qui est absolument faux avec un tirage se rapproche de la véritable valeur de l'intégrale lorsque le tirage est reproduit des milliers de fois.

Algorithme en VB.NET
Code:
    Sub Main()

        ' Définitions et assignations
        Dim nbr As UInteger, a As Decimal, b As Decimal, res As Decimal = 0
        Console.Out.WriteLine("nombre de lancers=") : nbr = Console.In.ReadLine()
        Console.Out.WriteLine("a=") : a = Console.In.ReadLine()
        Console.Out.WriteLine("b=") : b = Console.In.ReadLine()

        ' Tirages
        For i As UInteger = 1 To nbr
            Randomize()
            res += f((a + Rnd() * (b - a))) * (b - a)
        Next i
        res /= nbr ' obtention de la moyenne

        ' Affichage de l'approximation de l'intégrale
        Console.Out.WriteLine("intégrale de f(x) sur [" & a & ";" & b & "]=" & res)
        Console.In.ReadLine()

    End Sub

    Function f(ByVal x As Decimal) As Decimal
        Return Sin(2 * x) + 3 * x ^ 4
    End Function

Notes : Il est toujours nécessaire d'introduire la fonction f dans le code, elle ne peut être passée en paramètre utilisateur puisque le framework .NET ne possède de fonction d'interprétation de formules algébriques. La fonction Rnd() revoie un nombre pseudo-aléatoire entre 0 et 1, la formule : a + Rnd() * (b - a) permet ainsi d'obtenir un nombre entre a et b. Il est nécessaire de générer un nouveau nombre aléatoire en changeant le tampon horaire (procédure Randomize()).
avatar
Skynyrd777
Admin

Messages : 216
Date d'inscription : 02/06/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum