2010-01-10 99 views
3

我對SymPy相當陌生,有什麼可能是一個基本問題。或者我可能會誤解SymPy應該如何使用。SymPy:如何使用其他表達式返回表達式?

有沒有辦法創建一個不是由原子表示的表達式,而是由其他表達式的組合?

例子:

>>> from sympy.physics.units import * 
>>> expr1 = m/s 
>>> expr2 = mile/hour 
>>> expr1 
m/s 
>>> expr2 
1397*m/(3125*s) 
>>> expr1.in_terms_of([mile,hour]) #in my dreams? 
3125*mile/(1397*hour) 
>>> 

在一個側面說明:我可以找到完整的文檔SymPy的「官方」 PDF(或其它可打印)版本? (我在工作中嚴厲互聯網的使用限制,累了在家裏的週末做的工作。)

更新:

這是我結束了以下前奏的建議,但它不是因爲它感覺很髒,所以可能會像這樣得到很多用途。評論和WTF的歡迎。

def in_terms_of(self, terms): 
    expr2 = eval(str(self), physics.units.__dict__) 
    converter = {} 
    for term in terms: 
     term_expr = physics.units.__dict__[term] 
     coeff = term_expr.as_coeff_terms()[0] 
     unit = physics.units.Unit('my_'+term, term) 
     converter[term_expr/coeff] = unit/coeff 
    return str(expr2.subs(converter)) 

用法:

>>> x = in_terms_of('J',['gram','mile','hour']) 
>>> x 
'9765625000*mile**2*gram/(1951609*hour**2)' 
>>> in_terms_of(x,['J']) 
'J' 
+0

你會很高興地聽到,有SymPy的下一個版本,我們計劃出貨了HTML文檔和PDF文檔下載。數量爲 – asmeurer 2012-09-13 02:42:02

回答

2

檢查sympy.physics.units的來源,你可以看到所有的單位都是以米,千克,秒,安培,開爾文,摩爾和坎德拉定義的。這些是基本單位。

然後一英里定義爲5280英尺,一英尺定義爲0.3048米。

因此,所有使用非基本單位的表達式都將用基本單位替換非基本單位。

您可以定義自己的單位,當你需要一個表達式中使用特定的單位,你可以替補多到表達:

import sympy.physics.units as units 
from sympy import Rational 

my_mile = units.Unit('my_mile', 'mile') 
my_hour = units.Unit('my_hour', 'hour') 

然後定義詞典將代替基本單位爲你的新單位。

converter = {units.m: my_mile/Rational('1609.344'), 
      units.s: my_hour/Rational('3600')} 

使用基本單位執行所有計算。然後,如果您想要使用英里和小時的值,則可以將新單位替換爲表達式。

v = 10*units.miles/units.hour 
print v # = 2794*m/(625*s) 

print v.subs(converter) # = 10*mile/hour 

使用ars獲取文檔的答案。Sympy的存儲庫位於:https://github.com/sympy/sympy

docs文件夾中有一個README文件,它描述瞭如何創建html文檔。

1

在您從表達式1轉換爲表達式2 sympy單位除以:

In [120]: import sympy.physics.units as units 

In [121]: expr1 = units.m/units.s 

In [122]: expr2 = units.miles/units.hour 

In [123]: a = (1397/3125) * expr1/expr2 

In [124]: a 
Out[124]: 1 

唯一的問題是,你最終有一個無量綱的量。你也可以考慮在Quantities包這種類型的事情:

In [125]: import quantities as pq 

In [126]: a = pq.Quantity(1397/3125, 'm/s') 

In [127]: a 
Out[127]: array(0.44703999999999999) * m/s 

In [128]: a.units = pq.mile/pq.hour 

In [129]: a 
Out[129]: array(1.0) * mi/h 

還有Unum

我不知道sympy文檔的PDF版本,但是您可能能夠從他們的存儲庫檢查分發並自行使用Sphinx to generate a PDF

+0

+ = 1。但是,我還沒有準備好將它帶入戰場。 ..和Sphinx2pdf – Paul 2010-01-12 03:29:49

1

這裏還有quantities

In [1]: from quantities import * 
In [2]: v = 1397*m/(3125*s) 
In [3]: v 
Out[3]: array(0.44704) * m/s 
In [8]: v.units = mile/hour 
In [9]: v 
Out[9]: array(1.0) * mi/h