Случайное блуждание в трехмерной сферической системе координат- Python - PullRequest
0 голосов
/ 27 апреля 2020

В настоящее время я пытаюсь нанести на карту и показать путь фотона от центра Солнца, пока он не достигнет поверхности и не испустится. Я также хочу показать время, необходимое для этого.

Пока все, что я сделал, это установил параметры (плотность Солнца, сечение Томпсона, массу электрона, массу протона), и, используя их, я смог найти средний свободный путь на солнце для фотон. Я знаю, что мне нужно будет установить массив некоторых видов и создать случайные числа для каждого случайного блуждания. Я не знаю, что делать для случайного блуждания, чтобы фотон мог go в любом направлении по значениям x, y или z.

Я также не знаю, что мне следует сделать oop, чтобы создать эту случайную прогулку. Мне нужно, чтобы случайное блуждание прекратилось, когда 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

1 Ответ

0 голосов
/ 03 мая 2020

У вас есть псевдокод в вашей голове. Просто переведите в уравнения.

Для случайного блуждания в 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()

Попытайтесь понять это и улучшить / адаптировать его.

...