Python 编程新手,相同的结果不同的程序
我正在修我的第一门编程课程,这门课程是为物理应用之类的课程准备的。我们马上就要考试了,我的教授发表了一篇练习题,题目如下 在开尔文温度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 下面是我对代码的尝试Python 编程新手,相同的结果不同的程序,python,algorithm,Python,Algorithm,我正在修我的第一门编程课程,这门课程是为物理应用之类的课程准备的。我们马上就要考试了,我的教授发表了一篇练习题,题目如下 在开尔文温度T下,由质量为m的粒子组成的理想气体在速度v下的麦克斯韦分布由下式给出: Stackoverflow没有将MathJax用于公式,我也不知道如何在这个网站上编写公式。因此,这里有一个链接: 式中,k为玻尔兹曼常数,k=1.3806503x10-23J/k 编写一个名为maxwell.py的Python脚本,它以两列格式将v和f(v)打印到标准输出。对于粒子质量,选
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我不确定是哪个版本,我在用我大学的计算机工作。@Kostapython--version
会告诉你哪个版本。但它必须是Python3,否则会得到不同的结果。