2015-11-27 1 views
1

Ma question est comme ceci:profil de densité intégrale sur la ligne de mire

Je sais que la densité en fonction du rayon pour une sphère numérique. Dites la densité rho (1000) et le rayon (1000) sont déjà calculés numériquement. Je veux trouver l'intégration de la densité sur une ligne de visée, comme indiqué ci-dessous en 2D, bien qu'il s'agisse d'un problème 3D: enter image description here

Cette ligne de vue peut se déplacer du centre vers la limite. Je sais que nous devons d'abord interpoler la densité le long de la ligne de visée, puis ajouter ensemble pour obtenir l'intégrale de la densité sur la ligne de visée. Mais n'importe qui peut m'offrir une idée de comment faire l'interpolation rapide? Je vous remercie.

+0

Comment représentez-vous vos lignes en python? –

+0

est la densité juste échantillonnée ou est une fonction de densité adaptée? –

+0

@Ben Il peut être calculé à partir du triangle du rayon, de la moitié de la ligne et du petit rayon. –

Répondre

0

J'ai la mise en œuvre ci-dessous (en supposant le profil de densité rho = exp(1-log(1+r/rs)/(r/rs))):

La première approche est beaucoup plus rapide, car il n'a pas besoin de faire face à la singularité de r/np.sqrt(r**2-r_p**2).

import numpy as np 
from scipy import integrate as integrate 

### From the definition of the LOS integral 
def LOS_integration(rs,r_vir,r_p): #### radius in kpc 
    rho = lambda l: np.exp(1 - np.log(1+np.sqrt(l**2 + r_p**2)/rs)/(np.sqrt(l**2 + r_p**2)/rs)) 
    result = integrate.quad(rho,0,np.sqrt(r_vir**2-r_p**2),epsabs=1.49e-08, epsrel=1.49e-08) 
    return result[0] 

integration_vec = np.vectorize(LOS_integration) ### vectorize the function 


### convert LOS integration to radius integration 
def LOS_integration1(rs,r_vir,r_p): #### radius in kpc 
    rho = lambda r: np.exp(1 - np.log(1+r/rs)/(r/rs)) * r/np.sqrt(r**2-r_p**2) 
    ### r/np.sqrt(r**2-r_p**2) is the factor convert from LOS integration to radius integration 
    result = integrate.quad(rho,r_p,r_vir,epsabs=1.49e-08, epsrel=1.49e-08) 
    return result[0] 

integration1_vec = np.vectorize(LOS_integration1)