2010-01-10 5 views
3

Je suis assez nouveau à SymPy et j'ai ce qui pourrait être une question de base. Ou je pourrais simplement mal interpréter comment SymPy est censé être utilisé.SymPy: Comment retourner une expression en termes d'autres expressions?

Existe-t-il un moyen de créer une expression qui ne soit pas représentée par des atomes, mais par une combinaison d'autres expressions?

Exemple:

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

Sur une note latérale: Puis-je trouver un PDF 'officielle' (ou autre imprimable) version de la documentation complète sympy? (Je suis soumis à des restrictions draconiennes d'utilisation d'Internet au travail et je suis fatigué de faire le travail à la maison le week-end.)

Mise à jour:

C'est ce que j'ai fini avec la suggestion de Prélude, mais il est pas susceptible d'obtenir beaucoup d'utilisation comme ça car il se sent sale. Commentaires et bienvenue de 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)) 

Utilisation:

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

Vous serez heureux d'apprendre que la prochaine version de sympy, nous prévoyons d'expédier les documents html et pdf docs pour le téléchargement. – asmeurer

Répondre

2

En vérifiant la source pour sympy.physics.units vous pouvez voir que toutes les unités sont définies en termes de mètres, kilogrammes, secondes, ampères, kelvins, moles et candelas. Ce sont les unités de base.

Ensuite, un mile est défini comme 5280 pieds, et un pied est défini comme 0.3048 mètres.

Ainsi, toutes les expressions utilisant des unités non de base auront les unités non de base remplacées par les unités de base.

Vous pouvez définir vos propres unités que vous pouvez Substitut dans une expression quand vous avez besoin d'une expression d'utiliser des unités particulières:

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

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

définissent alors un dictionnaire qui remplacera les unités de base pour vos nouvelles unités.

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

Effectuez toutes vos calculs en utilisant les unités de base. Ensuite, si vous voulez une valeur en utilisant les miles et les heures, vous pouvez remplacer vos nouvelles unités dans l'expression.

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

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

Utilisez ars pour obtenir les documents.Le référentiel de Sympy est ici: https://github.com/sympy/sympy

Il existe un fichier README dans le dossier docs qui décrit comment créer des documents html.

1

Dans les unités sympy vous convertir de expr1 à expr2 en divisant:

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 

Le seul problème est que vous vous retrouvez avec une quantité adimensionnelle. Vous pouvez également envisager le paquet Quantities pour ce genre de chose:

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 

Il y a aussi Unum.

Je ne connais pas de version PDF des documents sympy, mais vous pourrez peut-être vérifier la distribution à partir de leur référentiel et utiliser Sphinx to generate a PDF pour vous-même.

+0

+ = 1 pour les quantités. Cependant, je ne suis pas encore prêt à l'amener sur le champ de bataille. ..et Sphinx2pdf – Paul

1

il y a aussi 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 
Questions connexes