Python 编程新手,相同的结果不同的程序

Python 编程新手,相同的结果不同的程序,python,algorithm,Python,Algorithm,我正在修我的第一门编程课程,这门课程是为物理应用之类的课程准备的。我们马上就要考试了,我的教授发表了一篇练习题,题目如下 在开尔文温度T下,由质量为m的粒子组成的理想气体在速度v下的麦克斯韦分布由下式给出: Stackoverflow没有将MathJax用于公式,我也不知道如何在这个网站上编写公式。因此,这里有一个链接: 式中,k为玻尔兹曼常数,k=1.3806503x10-23J/k 编写一个名为maxwell.py的Python脚本,它以两列格式将v和f(v)打印到标准输出。对于粒子质量,选

我正在修我的第一门编程课程,这门课程是为物理应用之类的课程准备的。我们马上就要考试了,我的教授发表了一篇练习题,题目如下

在开尔文温度T下,由质量为m的粒子组成的理想气体在速度v下的麦克斯韦分布由下式给出:

Stackoverflow没有将MathJax用于公式,我也不知道如何在这个网站上编写公式。因此,这里有一个链接:

式中,k为玻尔兹曼常数,k=1.3806503x10-23J/k

编写一个名为maxwell.py的Python脚本,它以两列格式将v和f(v)打印到标准输出。对于粒子质量,选择质子质量,m=1.67262158 10-27 kg。对于气体温度,选择太阳表面的温度T=5778 K

您的输出应包括300个数据点,范围从v=100 m/s到v=30000 m/s,步长为dv=100 m/s

下面是我对代码的尝试

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。几乎,这两件事加在一起会是十分之一

第一:在我的代码中,有没有更好的语法来处理范围,因为我的变量i什么都不做


第二:v+=100的目的是什么

处理数字时需要注意的是从float到int的隐式类型转换。
我可以在代码中找到的一个例子是,您使用的(3/2)计算结果为1,而另一个代码直接使用1.5

你应该请你的教授解释。如果你有相同的结果,你怎么会认为你的代码是错误的?你测试过多个输入吗?它们都一样吗?@MooingRawr,我想我应该问一个是否比另一个更有效。如果你的代码按预期工作,也许你会得到更多的帮助来优化它:它们几乎是一样的。
numpy.pi
math.pi
,或者
mumpy.exp
math.exp
之间可能没有太大区别。他一定是在使用Python 3,其中
/
转换为浮点,
/
执行整数除法。@Barmar我不确定是哪个版本,我在用我大学的计算机工作。@Kosta
python--version
会告诉你哪个版本。但它必须是Python3,否则会得到不同的结果。