Domanda

Sono abbastanza nuovo per SymPy e avere quello che potrebbe essere una domanda di base. Oppure potrei semplicemente interpretando male come si suppone SymPy per essere utilizzato.

C'è un modo per creare un'espressione che non è rappresentato da atomi, ma da una combinazione di altre espressioni?

Esempio:

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

Su un lato nota: Posso trovare un PDF 'ufficiale' (o altro stampabile) versione della documentazione completa SymPy? (Io sono soggetti a restrizioni di utilizzo di Internet draconiane sul lavoro e sono stanco di fare il lavoro a casa durante il fine settimana.)

Aggiornamento:

Questo è quello che ho finito con seguente suggerimento di Prelude, tuttavia non è probabile ottenere molto uso come questo come ci si sente sporca. Commenti e benvenuto 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))

Utilizzo:

>>> x = in_terms_of('J',['gram','mile','hour'])
>>> x
'9765625000*mile**2*gram/(1951609*hour**2)'
>>> in_terms_of(x,['J'])
'J'
È stato utile?

Soluzione

Verifica della fonte per sympy.physics.units è possibile vedi che tutte le unità sono definiti in termini di metri, chilogrammi, secondi, ampere, kelvin, talpe e candele. Queste sono le unità di base.

Poi un miglio è definita come 5280 piedi, e un piede è definito come 0,3048 metri.

Quindi, tutte le espressioni che utilizzano le unità non di base avranno le unità non-base sostituiti con le unità di base.

È possibile definire le proprie unità che è possibile Subsitute in un'espressione quando è necessario un'espressione per utilizzare unità particolari:

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

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

Poi definire un dizionario, che andrà a sostituire le unità di base per le nuove unità.

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

Eseguire tutti i vostri calcoli utilizzando le unità di base. Poi, se si desidera un valore con miglia e ore, è possibile sostituire le vostre nuove unità nell'espressione.

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

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

Con risposta ars per ottenere i documenti. repository di Sympy è qui: https://github.com/sympy/sympy

C'è un file README nella cartella Docs, che descrive come creare documenti HTML.

Altri suggerimenti

quantità :

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

In unità sympy che convertite da expr1 a espr2 dividendo:

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

L'unico problema è che si finisce con una quantità adimensionale. Si potrebbe anche prendere in considerazione le quantità pacchetto per questo tipo di cose:

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

C'è anche Unum .

Non so di una versione PDF dei documenti sympy, ma si potrebbe essere in grado di controllare la distribuzione fuori dal loro repository e utilizzare Sfinge per generare un PDF per te stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top