0

我目前正在尝试绘制并显示光子从太阳中心到到达表面并发射的路径。我还想展示发生这种情况所花费的时间。

到目前为止,我所做的只是设置参数(太阳密度、汤普森横截面、电子质量、质子质量),并使用这些参数找到光子在太阳中的平均自由路径。我知道我将不得不设置某种数组,并为每个随机游走创建随机数。我不知道如何进行随机游走,以便光子可以在 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
4

1 回答 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()

尝试理解它并改进/适应它。

于 2020-05-03T18:54:51.700 回答