I'm inclined to agree that maybe SymPy should be smarter when it prints combined units, but there is the question of how it would resolve ambiguities. For example, the force on a lever arm (Fxr) has the same units as energy (mgh), but saying that it is in Joules would be incorrect, because the force on a lever arm is a vector and energy (and thus Joules) is a scalar. There are other cases when it would not be as incorrect but might still be confusing if the user was expecting one unit but got a dimensionally equivalent one. Can't think of any off the top of my head, but I know I have ran into several of them, especially in electricity and magnetism.
Aaron Meurer On Apr 9, 2009, at 1:43 AM, kenji wrote: > > Hello Bill and alls. > > I claim to use MKSA+V base units system, not MKSA > > I know volt unit is derived and "m**2*kg/(A*s**3)" at > SI:International System > of Units. > > But no electrical/electronics engineers can't understand > voltage:115*m**2*kg/(A*s**3). They can understand only 115*V. > > Similarly they can't understand resistor:1*m**2*kg/(A**2*s**3). They > can under > stand 1*ohm or 1*V/A. > > SI unit system was constructed compromising with previously > established > volt/ampere. Because it compromised with volt/ampere/ohm, it had to > use kg as > a unit mass and couldn't use g. It had to use weird value > 2*10**-7*newton to > define a unit current and couldn't use 1*newton. > > For electrical/electronics engineers, 1*ohm is resistance shedding > 1*ampere > between 1*volt. There are two base units for them in electro > magnetic arear. > > ---------------------------------- > Bill wrote >> In [34]: A*ohm >> Out[34]: m**2*kg/(A*s**3) <-- Why not 'V'? > > I agree with you. The result must be V > >> In [35]: V/A >> Out[35]: m**2*kg/(A**2*s**3) <-- Why not 'ohm'? > > I don't agree with you. It is easy to break down to base unit. But > It is > uneasy to synthesize unit, because the best synthesized unit is not > determined > uniquely and depends on user purposes. > > ---------------------------------- > I am dissatisfied that sympy unit module uses MKSA base units and > V:volt is a > derived unit. > > I am also dissatisfied that sympy.sin etc functions accept physical > values > with unit and math, scipy functions can't accept it. > > //@@ > import sympy as ts > import sympy.physics.units as ut > import math > import scipy > print ts.sin(2*ut.s) > #print math.sin(2*ut.s) #ValueError: Symbolic value, can't compute > #print scipy.sin(1.5*ut.s) #AttributeError: sin > //@@@ > sin(2*s) > > sin(2*s) is correct as a result of symbolic operations, but is > nonsence as a > physical equation. Physically, sin function's parameter must be > unitless. > > ---------------------------------- > I propose to introduce MSKA+V base unit and Float(physicalValue) > function as > codes in appendix. V,A,ohm units operations become as below examples > > print 1.5* ohm --> 1.50000000000000*V/A > print 1.5* ohm *(1*A) --> 1.50000000000000*V > > > ****************** Help me out ******************* > Yet I am dissatisfied that one * unit become Unit instance, not a > Mul > instance. So the it's str value dosen't have 1 and only unit.e.g > //@@ > import sympy.physics.units as ut > print 1*ut.s > print 1*ut.m/(10*ut.s) > //@@@ > s > m/(10*s) > > This is not a severe problem. But 1*s, (1/10)*m/s results are > desirable. > Is there a countermeasure? > > -- > Kenji Kobayashi > > > ============== appendix begin ======================== > //@@ > """ > Physical units and dimensions. > > The base class is Unit, where all here defined units (~200) inherit > from. > """ > > import sympy as ts > from sympy import Rational, pi > from sympy.core.basic import Basic, Atom > > class Unit(Atom): > """ > Base class for all physical units. > > Create own units like: > m = Unit("meter", "m") > """ > is_positive = True # make (m**2)**Rational(1,2) --> m > is_commutative = True > > __slots__ = ["name", "abbrev"] > > def __new__(cls, name, abbrev, **assumptions): > #import pdb; pdb.set_trace() > obj = Basic.__new__(cls, **assumptions) > assert isinstance(name, str),`type(name)` > assert isinstance(abbrev, str),`type(abbrev)` > obj.name = name > obj.abbrev = abbrev > return obj > > def __eq__(self, other): > return isinstance(other, Unit) and self.name == other.name > > def _hashable_content(self): > return (self.name,self.abbrev) > > # Delete this so it doesn't pollute the namespace > del Atom > > def defunit(value, *names): > u = value > g = globals() > for name in names: > g[name] = u > > > # Dimensionless > > percent = percents = Rational(1,100) > permille = permille = Rational(1,1000) > > ten = Rational(10) > > yotta = ten**24 > zetta = ten**21 > exa = ten**18 > peta = ten**15 > tera = ten**12 > giga = ten**9 > mega = ten**6 > kilo = ten**3 > deca = ten**1 > deci = ten**-1 > centi = ten**-2 > milli = ten**-3 > micro = ten**-6 > nano = ten**-9 > pico = ten**-12 > femto = ten**-15 > atto = ten**-18 > zepto = ten**-21 > yocto = ten**-24 > > rad = radian = radians = 1 > deg = degree = degrees = pi/180 > > > # Base units > > defunit(Unit('meter', 'm'), 'm', 'meter', 'meters') > defunit(Unit('kilogram', 'kg'), 'kg', 'kilogram', 'kilograms') > defunit(Unit('second', 's'), 's', 'second', 'seconds') > defunit(Unit('ampere', 'A'), 'A', 'ampere', 'amperes') > defunit(Unit('kelvin', 'K'), 'K', 'kelvin', 'kelvins') > defunit(Unit('mole', 'mol'), 'mol', 'mole', 'moles') > defunit(Unit('candela', 'cd'), 'cd', 'candela', 'candelas') > defunit(Unit('volt', 'V'), 'V', 'volt', 'volts') > > > # Derived units > > defunit(1/s, 'Hz', 'hz', 'hertz') > defunit(m*kg/s**2, 'N', 'newton', 'newtons') > defunit(N*m, 'J', 'joule', 'joules') > #defunit(J/s, 'W', 'watt', 'watts') > defunit(V*A, 'W', 'watt', 'watts') > defunit(N/m**2, 'Pa', 'pa', 'pascal', 'pascals') > defunit(s*A, 'C', 'coulomb', 'coulombs') > defunit(V/A, 'ohm', 'ohms') > defunit(A/V, 'S', 'siemens', 'mho', 'mhos') > defunit(C/V, 'F', 'farad', 'farads') > defunit(J/A, 'Wb', 'wb', 'weber', 'webers') > defunit(V*s/m**2, 'T', 'tesla', 'teslas') > defunit(V*s/A, 'H', 'henry', 'henrys') > > > def Float(physicalValAg): > if isinstance(physicalValAg, ts.Number): > return float(physicalValAg) > else: > assert isinstance(physicalValAg, ts.Mul) > # covert V to m**2*kg/(A*s**3) > compensatingUnitAt = 1 > for elmAt in physicalValAg.args: > if elmAt == V: > compensatingUnitAt = compensatingUnitAt*(m**2*kg/ > (A*s**3))/V > elif isinstance(elmAt, ts.Pow): > if elmAt.args[0] == V: > powNumAt = elmAt.args[1] > compensatingUnitAt = (compensatingUnitAt > *((m**2*kg/(A*s**3))**powNumAt) > *(V**-powNumAt) > ) > if compensatingUnitAt == 1: > assert False, ("At Float(.), you set physical quantity > parameter" > +",the unit of which is not cancelled:" > + str(physicalValAg) > ) > else: > valAt = physicalValAg * compensatingUnitAt > assert isinstance(valAt, ts.Number),("At Floa(.)" > + " you set physical quantity parameter" > +",the unit of which is not cancelled:" > + str(valAt) > ) > > return float(valAt) > > print 1* W > print 1* V > print 1* ohm > print 1* ohm *(1*A) > > print 1.5* W > print 1.5* V > print 1.5* ohm > print 1.5* ohm *(1*A) > > print 1*W/(10*V *(5*A)) > print 1*W/(10*J/s) > print 3.3*F > print 1*F *(1*V)/(2*C) > > print "========== Float =============" > print Float(1.5*s *(1.1/s) ) > print Float(1*s/s) > print Float(1.5*V*A /(1.1*W) ) > print Float(1.5*W*s /(1.1*N*m) ) > print Float(1.5* m**2*kg/(A*s**3)/(1.1*V) ) > > import math > import scipy > print math.sin(Float(1.5*V*A /(1.1*W) )) > print scipy.sin(Float(1.5*V*A /(1.1*W) )) > print ts.sin(Float(1*V*A /W )) > //@@@ > //copy \#####.### temp.py /y > > A*V > V > V/A > V > 1.50000000000000*A*V > 1.50000000000000*V > 1.50000000000000*V/A > 1.50000000000000*V > 1/50 > s**3*A*V/(10*kg*m**2) > 3.30000000000000*A*s/V > 1/2 > ========== Float ============= > 1.65 > 1.0 > 1.36363636364 > 1.36363636364 > 1.36363636364 > 0.978619003421 > 0.978619003421 > sin(1.00000000000000) > > ============== appendix end ======================== > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to sympy@googlegroups.com To unsubscribe from this group, send email to sympy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sympy?hl=en -~----------~----~----~----~------~----~------~--~---