J'essaie de trouver le volume d'un ellipsoïde à l'aide de l'intégration de Monte Carlo en créant une fonction et je suis relativement nouveau à cette technique. Je sais comment tracer l'ellipsoïde dans l'espace 3D en utilisant Matplotlib et comment trouver le volume normalement, mais je ne sais pas comment la technique de Monte Carlo pourrait s'appliquer au volume ellipsoïde. Existe-t-il un exemple de code pour comment faire cela?
J'ai essayé de créer une fonction avec la formule de volume et de le répéter pour un grand nombre de valeurs, mais je me lance de créer un programme qui le fera. p>
3 Réponses :
import random def ellipsoid(x, y, z, a, b, c): return x**2/a**2 + y**2/b**2 + z**2/c**2 def V_ellipsoid(a, b, c, N): sum = 0 for i in range(N): x = random.uniform(-a, a) y = random.uniform(-b, b) z = random.uniform(-c, c) if ellipsoid(x,y,z,a,b,c) <= 1: sum += 1 volume = (sum/N)*(2*a)*(2*b)*(2*c) return volume
S'il vous plaît ne faites pas que publier le code comme une réponse, mais fournissez également une explication de votre code et de la manière dont il résout le problème de la question. Les réponses avec une explication sont généralement plus utiles et de meilleure qualité, et sont plus susceptibles d'attirer des upvotes.
Comme j'essaie d'améliorer mes connaissances en numpopy, je posterai une solution à l'aide de la bibliothèque, qui serait pratique dans un problème 3D, qui peut nécessiter de nombreux points à converger:
import numpy as np #Desided number of samples and parameters samples = 500000 A = 1; B = 2; C = 3 #Function to decide if the points are inside de ellipsoid ellipsoid = lambda x,y,z,a,b,c: ((x/a)**2 + (y/b)**2 + (z/c)**2) #generating x,y,z coordinates of random points in a cube the enclosure the #ellipsoid (the np.ceil is just to work with integers) X = np.random.random(samples)*2*np.ceil(A) - np.ceil(A) Y = np.random.random(samples)*2*np.ceil(B) - np.ceil(B) Z = np.random.random(samples)*2*np.ceil(C) - np.ceil(C) #points inside the ellipsoid inside = (ellipsoid(X,Y,Z,A,B,C) <= 1).sum() cube_area = np.ceil(A)*np.ceil(B)*np.ceil(C)*8 volume = (inside/samples)*cube_area real_volume = (4/3)*np.pi*A*B*C print(volume,real_volume)
La technique spécifique de Monte Carlo est appelée échantillonnage de rejet. Dans ce cas, vous devez échantillonner un cube contenant un ellipsoïde complet, calculer le rapport de nombre de points dans une ellipsoïde et dans un cube, et la multiplie par le volume du cube. Voici le code: Mon code est similaire à une autre réponse, mais plus rapide (no pour code> boucle). P> p>
(1) Créer une fonction pour tester si des coordonnées données se trouvent dans ellipsoïde (2) Créer des points aléatoires allongé dans un cuboïde (dans lequel l'ellipsoïde est enfermé) (3) Vérifiez combien de points réside dans ellipsoïde (4) divisent les hits par nombre de points éprouvés et multiplier avec le volume de cuboïde.
Merci pour le conseil. Je vais essayer de faire ça.
Cette méthode fonctionne vraiment bien gérées pour créer une fonction en utilisant les étapes qui calcule le volume. Merci encore!