Unit systems¶
This module integrates unit systems into SymPy, allowing a user choose which system to use when doing their computations and providing utilities to display and convert units.
Units (like meters, pounds, seconds) and constants (like light years,
Boltzmann’s constant) are all considered quantities. A Quantity
object
defines both units and physical constants (though its subclass
PhysicalConstant
may be preferred for physical constants).
The relations between quantities are defined by their dimensions and the scale
factor to at least another quantity of the same dimension. These two types of
relations are usually defined inside UnitSystem
objects, except for
properties valid in every unit system. For example, 1 kilometer is equal to
1000 meters in all unit systems and its dimension is length
in all
dimension systems. On the other hand, the speed of light is equal to 299792458
meters per second in SI units, while it is equal to 1 (unitless) in natural
units. In both SI and natural units the dimension of the speed of light in
velocity
, but in the dimension system of natural units velocity
is
dimensionless because length
and time
are equivalent. Similarly, there
are discrepancies in the dimensions and scale factors of electromagnetic
quantities between SI unit system and CGS and gaussian unit systems, as the
last two ones do not consider the current
to be a fundamental dimension.
The advantage of this implementation over the one found in other libraries is that it handles relations between units differently in different unit systems, without restrictions to the assumption of relations between units and physical constants provided by the SI unit system.
Examples¶
The most important function in the units module is convert_to
, it allows
the given quantity to be rewritten as the product of powers of some target
quantities. For example, to represent the speed of light in terms of meters and
seconds:
>>> from sympy.physics.units import speed_of_light, meter, second
>>> from sympy.physics.units import convert_to
>>> convert_to(speed_of_light, [meter, second])
299792458*meter/second
If it is not possible to represent the given quantity in the target units, the given quantity will be returned unchanged:
>>> convert_to(speed_of_light, [meter])
speed_of_light
The relations between quantities depend on the unit systems. So, convert_to
accepts an optional third parameter representing the unit system, which is
SI
by default. The conversion may return different results depending on the
chosen unit system, for example, in the cgs_gauss
unit system the current
is not a fundamental dimension, rather it can be represented as a combination
of length, time and mass:
>>> from sympy.physics.units.systems.si import SI
>>> from sympy.physics.units.systems.cgs import cgs_gauss
>>> from sympy.physics.units import ampere, gram, second
>>> convert_to(ampere, [meter, gram, second], SI)
ampere
>>> convert_to(ampere, [meter, gram, second], cgs_gauss)
149896229*sqrt(gram)*meter**(3/2)/(50*second**2)
Quantities of the same dimension do not get simplified automatically, for
example if you divide meters by kilometers, you will get an object representing
the division between the two units. In order to simplify this kind of
expressions, you can either call the .simplify()
method or import the
quantity_simplify( )
function, the last one also accepting a unit system as
optional parameter.
>>> from sympy.physics.units.util import quantity_simplify
>>> from sympy.physics.units import kilometer
>>> meter/kilometer
meter/kilometer
>>> (meter/kilometer).simplify()
1/1000
>>> quantity_simplify(meter/kilometer)
1/1000
More¶
Ideas about future developments can be found on the Github wiki.