新编程,同样结果不同的程序

时间:2016-10-14 20:30:57

标签: python algorithm

我正在修读我的第一门编程课程,该课程适用于物理应用等。我们有一个考试,我的教授发表了一个练习考试,并提出了以下问题。

  

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

Stackoverflow不会将MathJax用于公式,我无法弄清楚如何在此站点上编写公式。所以,这是指向WolframAlpha的链接:

  

其中k是玻尔兹曼常数,k = 1.3806503 x 10-23 J / K.

     

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

     

您的输出应包含300个数据点,范围从v = 100 m / s到v = 30,000 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的列表(你的变量我没有做任何事情)。此外,你应该使用v + = 100.几乎,这两件事在一起就是10分中的一分。

第一:在我的代码中有没有更好的语法来做范围,因为我的变量我没有做任何事情?

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

1 个答案:

答案 0 :(得分:0)

处理数字时要小心的是从浮点数到整数的隐式类型转换。 我可以在你的代码中看到的一个实例是你使用(3/2)计算结果为1,而另一个代码直接使用1.5。