2014-11-13 56 views
0

我希望能得到一些幫助。iPython與Matlab - 簡單乘法的差異

我在Matlab中運行一個簡單的腳本:

Ao=1.476E21 
XN2=0.6 
XO2=0.03 
P=1 %atm 
T=2000%K 

Ru=82.057 %atm*cm^3/mol-K 

dXNO_dt=Ao*XN2*(XO2^(1/2))*exp(-67520/T)*((P/(Ru*T))^(1/2)) 

其產生正確的(數據確認)答案:

然而,當我切換到IPython中,並使用類似的腳本:

from numpy import * 

Ao=1.476E21 
XN2=0.6 
XO2=0.03 
P=1 #atm 
T=2000#K 

Ru=82.057 #atm*cm^3/mol-K 

dXNO_dt=Ao*XN2*(XO2**(1/2))*exp(-67520/T)*((P/(Ru*T))**(1/2)) 
print 'dXNO_dt = {0}'.format(dXNO_dt) 

我得到的答案令人費解:

>>> dXNO_dt = 1517837.30697 

有沒有人知道爲什麼會發生這種情況?當談到找出像這樣的更深層次的問題時,我是一個巨大的noob。

這是在Python 2.7.8中,IPython 2.3.1

謝謝!

+0

因此我不明白的是Python。我用了兩個版本來做健康檢查。對於Python 3.4.x,我得到824.9805522208239。我也沒有得到Python 3.3.x的支持。完全一樣的結果。你在用什麼? – ha9u63ar

+0

這是在Python 2.7.8,IPython 2.3.1 –

+0

對不起 - 忘了把它放在iPython上,因爲我沒有它,但結果是從Python正常IDLE – ha9u63ar

回答

3

你的問題是整數除法。在Python 2中,整數除以整數將得到一個整數結果,所以1/2 == 0。如果您使用0.51.0/2.0作爲指數,那麼您將得到正確的答案。同樣,您需要使用-67520.0/T

下面給我的824.98055222082394

dXNO_dt=Ao*XN2*(XO2**(1.0/2.0))*exp(-67520.0/T)*((P/(Ru*T))**(1.0/2.0)) 
+1

是的,這就是問題所在。如果你想要一個更直觀的'/'行爲,你可以使用'from __future__ import division'。 – cel

+1

即使有經驗的程序員也會偶爾被這個問題困擾。值得一提的是,Python 3的行爲已經發生了變化(或者已經在Python 2下使用'from __future__ ...'),請參閱[PEP 238](http://legacy.python.org/dev/peps/pep- 0238 /)瞭解詳情。如果可能的話,這是初學者應該使用Python 3的原因之一。 –

+0

默認情況下,Matlab中的數值爲雙精度值。 – horchler