Новичок в программировании, тот же результат в другой программе

#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, иначе вы получите разные результаты.