三维球面坐标系中的随机行走-python

问题描述 投票:0回答:1

我目前正试图绘制并显示一个光子从太阳中心到到达表面并发射的路径。我还想显示这一过程所需的时间。

到目前为止,我所做的只是设置参数(太阳的密度、汤普森截面、电子的质量、质子的质量),利用这些参数我能够找到光子在太阳中的平均自由路径。我知道,我必须设置一个某种数组,并为每个随机行走创建随机数。我不知道该怎么做才能使随机行走使光子可以在x、y或z值的任何方向上行走。

我也不知道我应该循环什么来创建这个随机行走。我需要使随机行走在d等于或大于太阳半径时停止。我知道d=l*sqrt(N),其中l是每一步的平均大小,或平均自由路径,N是所走的步数。

最后,我不知道该从哪里开始绘制结果。我想显示一个光子从中心穿过球体的动画,球体就像太阳。

以下是我目前仅有的代码,希望能得到帮助。

from random import random, seed, randint
import numpy as np
import matplotlib.pyplot as plt

N=100000
rho=1408.6 #the mass density of the sun
thompson=6.65*10**-29 #Thompson cross-section for an electro 
proton=1.67*10**-27 #mass of a proton
electron=9.11*10**-31 #mass of an electron
radius=6.9634*10**8 #radius of a sun
c=2.99*10**8

mfp=(electron+proton)/(rho*thompson*np.sqrt(2))
timestep=mfp/c
python random physics sun random-walk
1个回答
0
投票

你的脑海中已经有了伪代码。只要转化为方程。

对于3D中的随机行走,我能想到的最简单的方法是,不要让光子向任何方向移动,而是在每一步中调用一个随机数来决定它将向哪个方向移动(x、y或z)和哪个方向(正或负)。简单的形式,类似这样。

import numpy as np

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

mfp = 1
num_steps=10000

walks = [[0,0,0]]
for step in range(num_steps):
    walk = np.zeros(3)
    move_in_direct = np.random.choice(3)
    move_pos_or_neg = np.random.choice([-1,1])
    walk[move_in_direct] = move_pos_or_neg*mfp
    walks.append(np.array(walks[-1])+walk)

walks = np.transpose(walks)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot(*walks, label='parametric curve')
ax.legend()
plt.show()

试着去理解它,并改进适应它。

© www.soinside.com 2019 - 2024. All rights reserved.