Pergunta

Eu sou bastante novo para SymPy e ter o que poderia ser uma questão básica. Ou eu poderia simplesmente estar interpretando erroneamente como SymPy é suposto ser usado.

Existe uma maneira de criar uma expressão que não é representado por átomos, mas por uma combinação de outras expressões?

Exemplo:

>>> 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)
>>> 

Em uma nota lateral: Posso encontrar um PDF 'oficial' (ou outra impressão) versão da documentação completa SymPy? (Estou sob restrições de uso da Internet draconianas no trabalho e estou cansado de fazer o trabalho em casa no fim de semana.)

Update:

Isto é o que eu acabei com seguir a sugestão do Prelude, no entanto, não é provável começar muito uso como esta, uma vez que se sente sujo. Comentários e boas-vindas da 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))

Uso:

>>> x = in_terms_of('J',['gram','mile','hour'])
>>> x
'9765625000*mile**2*gram/(1951609*hour**2)'
>>> in_terms_of(x,['J'])
'J'
Foi útil?

Solução

Verificar a fonte para sympy.physics.units você pode ver que todas as unidades são definidas em termos de metros, quilogramas, segundos, amperes, kelvins, moles e candelas. Estas são as unidades de base.

Depois de uma milha é definido como 5280 pés, e um pé é definido como 0.3048 metros.

Assim, todas as expressões usando unidades não-base terá o não-base de unidades substituídas pelas unidades de base.

Você pode definir suas próprias unidades que você pode subsitute numa expressão quando você precisa de uma expressão para utilizar unidades particulares:

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

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

Em seguida, defina um dicionário que irá substituir as unidades de base para as suas novas unidades.

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

Execute todos os seus cálculos usando as unidades de base. Então se você quiser um valor usando milhas e horas, você pode substituir as suas novas unidades na expressão.

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

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

Use ARS resposta para obter os docs. repositório de SymPy está aqui: https://github.com/sympy/sympy

Há um arquivo README nos docs pasta que descreve como criar documentos HTML.

Outras dicas

quantidades :

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

Em unidades SymPy converter de expr1 para expr2 dividindo:

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

O único problema é que você acaba com uma quantidade adimensional. Você pode também considerar o href="http://packages.python.org/quantities/" rel="nofollow noreferrer"> pacote Quantidades

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

Há também Unum .

Eu não sei de uma versão em PDF dos docs SymPy, mas você pode ser capaz de verificar a distribuição a partir de seu repositório e uso Esfinge para gerar um PDF para si mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top