#python #algorithm
#python #алгоритм
Вопрос:
Я прохожу свой первый курс по программированию, курс предназначен для физических приложений и тому подобного. У нас скоро экзамен, мой профессор опубликовал практический экзамен со следующим вопросом.
Распределение Максвелла по скорости v для идеального газа, состоящего из частиц массой m при температуре Кельвина T, задается:
Stackoverflow не использует MathJax для формул, и я не совсем понимаю, как написать формулу на этом сайте. Итак, вот ссылка на WolframAlpha:
где k — постоянная Больцмана, k = 1,3806503 x 10-23 Дж / К.
Напишите скрипт на Python с именем maxwell.py, который выводит v и f (v) в стандартный вывод в формате двух столбцов. Для массы частицы выберите массу протона, m = 1,67262158 10-27 кг. Для температуры газа выберите температуру на поверхности солнца, T = 5778 K.
Ваш вывод должен состоять из 300 точек данных в диапазоне от v = 100 м / с до v = 30 000 м / с с шагом размером dv = 100 м / с.
Итак, вот моя попытка кода.
import math as m
import sys
def f(v):
n = 1.67262158e-27 #kg
k = 1.3806503e-23 #J/K
T = 5778 #Kelvin
return (4*m.pi)*((n/(2*m.pi*k*T))**(3/2))*(v**2)*m.exp((-n*v**2)/(2*k*T))
v = 100 #m/s
for i in range(300):
a = float(f(v))
print (v, a)
v = v 100
Но мое профессорское решение:
import numpy as np
def f(v):
m = 1.67262158e-27 # kg
T = 5778. # K
k = 1.3806503e-23 # J/K
return 4.*np.pi * (m/(2.*np.pi*k*T))**1.5 * v**2 * np.exp(-m*v**2/(2.*k*T))
v = np.linspace(100.,30000.,300)
fv = f(v)
vfv = zip(v,fv)
for x in vfv:
print "%5.0f %.3e"%x
# print np.sum(fv*100.)
Итак, это очень разные коды. Из того, что я могу сказать, они дают тот же результат. Я думаю, мой вопрос просто в том, почему мой код неверен?
Спасибо!
Редактировать:
Итак, я спросил об этом своего профессора, и это был его ответ.
Я думаю, что ваш код в порядке. Он будет работать намного быстрее с использованием numpy, но в проблеме не указано, что вам нужен numpy. Возможно, я поставил одну точку за то, что не перебирал список v (ваша переменная i ничего не делает). Кроме того, вы должны были использовать v = 100. Почти, эти две вещи вместе составили бы одно очко из 10.
1-й: есть ли лучший синтаксис для выполнения диапазона в моем коде, поскольку моя переменная i ничего не делает?
2-й: Какова цель v = 100?
Комментарии:
1. Вы должны попросить своего профессора объяснить.
2. что заставляет вас думать, что ваш код неверен, если у вас одинаковые результаты? Вы тестировали несколько входных данных? Они все одинаковые?
3. @MooingRawr, я думаю, я должен спросить, является ли один из них более эффективным, чем другой.
4. Если ваш код работает так, как задумано, возможно, вы получите дополнительную помощь в его оптимизации здесь: codereview.stackexchange.com
5. Они в значительной степени одинаковы. Вряд ли будет большая разница между
numpy.pi
иmath.pi
, илиmumpy.exp
иmath.exp
.
Ответ №1:
При работе с числами следует быть осторожным с неявным преобразованием типов из чисел с плавающей запятой в целые числа. Один пример, который я мог бы представить в вашем коде, заключается в том, что вы используете (3/2), который вычисляется как 1, в то время как другой код использует 1.5 напрямую.
Комментарии:
1. Он, должно быть, использует Python 3, где
/
преобразуется в float и//
выполняет целочисленное деление.2. @Barmar я не уверен, какая это версия, я работаю на своих компьютерах в университетах.
3. @Kosta
python --version
скажет вам, какая версия. Но это должен быть Python 3, иначе вы получите разные результаты.